La differenza tra Modbus RTU e Modbus TCP sta nella rete che trasporta le stesse richieste Modbus. Modbus RTU è pensato per un bus seriale: un master interroga a turno dispositivi indirizzati su una coppia RS-485, e ogni trama termina con un CRC a 16 bit. Modbus TCP è pensato per una rete IP: un client si collega all'indirizzo IP del dispositivo sulla porta 502, e un'intestazione MBAP di 7 byte prende il posto dell'indirizzo seriale e del CRC. In un sito esistente, la scelta segue di norma l'interfaccia già disponibile sull'apparecchiatura.
Questa guida fa parte della serie su Modbus e RS-485.
Modbus TCP vs RTU: le differenze
| Modbus RTU | Modbus TCP | |
|---|---|---|
| Trasporto | Linea seriale: RS-485, o RS-232 per un solo dispositivo | TCP/IP su Ethernet o Wi-Fi |
| Velocità | 19.200 baud di default, 9.600 anch'essa obbligatoria, altre velocità opzionali | Ethernet a 10 o 100 Mbit/s; di solito il limite è l'elaborazione nel dispositivo |
| Porta | Una porta seriale: morsetti RS-485 o porta COM | Porta TCP 502, o 802 per Modbus Security |
| Indirizzo del dispositivo | Da 1 a 247 sul bus; 0 per il broadcast | Indirizzo IP, più identificativo unità per i dispositivi dietro un gateway |
| Trama | Indirizzo, codice funzione, dati, CRC a 16 bit | Intestazione MBAP (7 byte), codice funzione, dati |
| Controllo errori | CRC in ogni trama | Checksum TCP; nessun CRC Modbus |
| Separazione delle trame | Silenzio di almeno 3,5 tempi di carattere | Campo lunghezza nell'intestazione |
| Richieste in corso | Una per volta sul bus | Più connessioni; l'identificativo di transazione associa ogni risposta |
| Impostazioni tipiche | Velocità in baud, parità, bit di stop, indirizzo | Indirizzo IP, porta 502, identificativo unità |
| Cablaggio | Coppia intrecciata in linea, terminata alle due estremità | Rete del sito |
| Collegamento tra i due | Un gateway sul bus risponde ai client TCP e inoltra ogni richiesta come trama RTU | L'identificativo unità indica il dispositivo seriale dietro il gateway |
La guida RS-485 e Modbus spiega il livello seriale sotto Modbus RTU e la differenza con RS-232. I codici funzione (03 lettura dei registri holding, 04 lettura dei registri di ingresso, 06 e 16 scrittura) sono gli stessi nelle due varianti. Anche tipi di dato, ordine delle word e fattori di scala restano gli stessi. La guida alla mappa dei registri li approfondisce.
Come funziona il protocollo Modbus TCP
Modbus TCP trasporta il protocollo applicativo Modbus in pacchetti TCP/IP. Un client, per esempio un sistema SCADA, un BMS o un gateway, apre una connessione TCP verso un server, per esempio un contatore o un PLC, e vi invia le richieste. Il server risponde a ogni richiesta e non invia mai dati senza che gli vengano chiesti. I documenti meno recenti chiamano il client master e il server slave.
Un server resta in ascolto sulla porta TCP 502, che IANA registra per Modbus. Alcuni dispositivi consentono di cambiare la porta e alcuni gateway seriali usano una porta diversa per ogni linea seriale. Un client può mantenere aperta una sola connessione per molte richieste. Un server accetta connessioni da più client, fino al proprio limite.
Tabelle dati e codici funzione
Ogni dispositivo Modbus, su TCP o RTU, presenta i propri dati in quattro tabelle:
| Tabella | Dimensione di un elemento | Accesso | Lettura con | Scrittura con |
|---|---|---|---|---|
| Coil | 1 bit | Lettura e scrittura | 01 | 05 (uno), 15 (più di uno) |
| Ingressi discreti | 1 bit | Sola lettura | 02 | Non scrivibile |
| Registri di ingresso | 16 bit | Sola lettura | 04 | Non scrivibile |
| Registri holding | 16 bit | Lettura e scrittura | 03 | 06 (uno), 16 (più di uno) |
I contatori di energia pubblicano le letture in registri di ingresso o registri holding. Un valore a 32 bit, per esempio una tensione in virgola mobile o un totalizzatore di energia, occupa due registri consecutivi e la mappa dei registri indica l'ordine dei due. La trama contiene un indirizzo a base zero, quindi il registro holding che un manuale chiama 40108 è l'indirizzo 107 (0x006B). Il convertitore di indirizzi Modbus converte tra le due notazioni.
Confronto delle trame
Ecco come appare, nelle due varianti, una richiesta al dispositivo 17 per leggere tre registri holding a partire dall'indirizzo 0x006B:
| Variante | Byte (esadecimali) |
|---|---|
| Modbus RTU | 11 03 00 6B 00 03 seguiti dal CRC di 2 byte |
| Modbus TCP | 00 01 00 00 00 06 11 03 00 6B 00 03 |
Nella trama TCP, i primi sette byte sono l'intestazione MBAP: identificativo di transazione (0x0001), identificativo di protocollo (sempre 0 per Modbus), lunghezza dei dati successivi (6 byte) e identificativo unità (0x11). L'unità dati di protocollo dopo l'intestazione è identica. Il calcolatore CRC e LRC Modbus ricava i byte di controllo della trama RTU:
La risposta del server ripete l'intestazione MBAP con la propria lunghezza, poi il codice funzione, un conteggio dei byte e i valori dei registri. Se i tre registri contengono 555, 0 e 100, la risposta Modbus TCP è:
00 01 00 00 00 09 11 03 06 02 2B 00 00 00 64
La lunghezza ora è di 9 byte: identificativo unità, codice funzione, conteggio dei byte e 6 byte di dati. Quando un dispositivo non può eseguire una richiesta, restituisce un'eccezione: il codice funzione con il bit più alto impostato (0x83 per la funzione 03), poi un codice di eccezione. Il codice 02, Illegal Data Address, indica di solito un indirizzo errato o una lettura che va oltre la fine di un blocco:
00 01 00 00 00 03 11 83 02
Il riferimento ai codici funzione ed eccezione Modbus spiega ogni codice.
La stessa lettura su RTU e su TCP
Eastron vende il contatore trifase SDM630 con RS-485, come SDM630-Modbus, e con Ethernet, come SDM630-TCP. Entrambi i documenti di protocollo riportano la tensione fase 1-neutro al riferimento di registro di ingresso 30001, indirizzo di protocollo 0, come float a 32 bit su due registri, letto con la funzione 04. L'unità dati di protocollo è 04 00 00 00 02 in entrambi i casi:
| Contatore | Richiesta della tensione di fase 1 (esadecimale) |
|---|---|
| SDM630-Modbus all'indirizzo di bus 1 | 01 04 00 00 00 02 71 CB |
| SDM630-TCP con identificativo unità 1 | 00 01 00 00 00 06 01 04 00 00 00 02 |
Una risposta con i dati 43 66 00 00 vale 230,0 V quando la word più significativa viene per prima; il decodificatore di registri Modbus mostra gli altri ordini delle word. Eastron pubblica una tabella dei registri distinta per ogni modello: verifica ogni punto nella tabella del modello installato invece di presumere che valga la mappa seriale.
Tempi e capacità del bus
Su un bus RTU c'è una sola richiesta in corso alla volta. Il tempo per richiesta comprende il tempo di trasmissione della richiesta e della risposta, il tempo di risposta del dispositivo e l'intervallo tra le trame. A 9.600 baud con parità pari, ogni carattere richiede 11 bit: un byte impiega quindi circa 1,15 ms. La guida Modbus seriale fissa l'intervallo tra le trame a 1,75 ms sopra 19.200 baud. Il calcolatore dei tempi Modbus RTU somma questi tempi per un intero bus:
La guida a interrogazione e ritentativi mostra l'effetto di un dispositivo offline su ogni ciclo. Con Modbus TCP la rete raramente è il limite. Di solito contano di più il tempo di elaborazione del dispositivo e il numero di connessioni simultanee che accetta. Molti contatori ne accettano solo poche, alcuni una sola. Verifica il limite prima che più sistemi interroghino lo stesso contatore.
Verificare una connessione Modbus TCP
Controlla la connessione un livello alla volta, in modo che ogni errore indichi una sola causa:
- Leggi l'indirizzo IP, la subnet mask e il gateway predefinito del dispositivo sul suo display o nel suo strumento di configurazione. Verifica che il client sia sulla stessa sottorete, oppure che un router e il firewall consentano il traffico.
- Da un computer su quella rete, verifica che la porta TCP 502 accetti una connessione. Su macOS o Linux,
nc -vz 192.0.2.10 502indica se la porta è aperta (usa l'indirizzo del dispositivo). - Con un client Modbus, leggi un registro il cui valore è visibile sul display del dispositivo, per esempio una tensione di fase. Usa l'identificativo unità indicato nel manuale.
- Confronta valore, fattore di scala e unità con il display. Poi aggiungi il resto della mappa dei registri.
- Se la porta si apre ma ogni lettura va in timeout, controlla l'identificativo unità e verifica se un altro client occupa l'unica connessione che il dispositivo accetta.
Da Modbus RTU a TCP: gateway e identificativi unità
Un gateway seriale-Ethernet consente ai client Modbus TCP di raggiungere dispositivi RTU. Il client invia una richiesta TCP all'indirizzo IP del gateway e mette l'indirizzo del dispositivo seriale nell'identificativo unità. Il gateway inoltra la richiesta sul bus, attende la risposta e la restituisce via TCP.
Tre punti richiedono attenzione:
- Identificativo unità dei dispositivi TCP diretti. La guida Modbus TCP dice che l'identificativo unità non viene usato quando il server è raggiunto tramite il suo indirizzo IP e raccomanda 0xFF. Molti dispositivi lo ignorano; alcuni richiedono 1 o il proprio indirizzo seriale. Usa il valore indicato nel manuale del dispositivo.
- Timeout. Il timeout TCP del client deve superare il timeout seriale del gateway più il tempo che il gateway impiega ad attendere le altre richieste sul bus. Altrimenti il client rinuncia mentre il gateway sta ancora aspettando.
- RTU su TCP. Alcuni convertitori trasportano su una connessione TCP le trame RTU complete di CRC, senza intestazione MBAP. Questo non è Modbus TCP: il client va configurato nella modalità corretta. La guida a gateway di protocollo e bridge trasparente spiega la differenza, e la guida ai gateway Modbus e BACnet aiuta a sceglierne uno.
Per ogni punto, registra indirizzo IP, porta, identificativo unità e dispositivo fisico che risponde. Dopo la sostituzione di un gateway, controlla per prima cosa questo instradamento.
Modbus TCP o RTU: scelta per un sito
Scegli il trasporto che le apparecchiature già offrono:
| Situazione | Scelta abituale |
|---|---|
| Contatori con soli morsetti RS-485, in uno o due quadri | Modbus RTU su un bus corto, o un'interfaccia locale |
| Apparecchiatura con porta Ethernet su una rete gestita | Modbus TCP, con un piano degli indirizzi concordato con l'IT del sito |
| Bus RTU esistente già interrogato da un BMS | Leggi dal BMS o da un gateway; non aggiungere un secondo master |
| Molti dispositivi seriali che più sistemi devono leggere | Un gateway Modbus TCP davanti al bus |
| Contatori seriali lontani dal Gateway e senza percorso per un cavo | Un'interfaccia Modbus wireless vicino ai contatori |
Per entrambe le varianti, procurati la mappa dei registri del modello e del firmware esatti prima di scegliere l'hardware. «Supporta Modbus» non dice quali valori il dispositivo rende disponibili.
Sicurezza
Modbus TCP e Modbus RTU non prevedono autenticazione né cifratura. Qualsiasi client che raggiunge la porta 502 può leggere e, se il dispositivo lo consente, scrivere. Proteggili con la progettazione della rete: rete o VLAN separata per le apparecchiature di controllo, regole firewall che ammettano solo i sistemi necessari e nessuna esposizione a Internet.
La Modbus Organization pubblica un protocollo Modbus Security separato, che incapsula Modbus in TLS con certificati X.509 sulla porta 802. Devono supportarlo entrambe le estremità. Un gateway davanti a un dispositivo Modbus senza protezione non rende sicuro quel dispositivo: sposta soltanto il confine di sicurezza.
Prova le letture prima di qualsiasi scrittura. Tratta le scritture come una fase separata, approvata dal proprietario dell'apparecchiatura.
Modbus TCP e RTU con Edge
Edge sul Gateway ZGW-20 opera come client Modbus per entrambe le varianti. Interroga dispositivi Modbus TCP sulla rete del sito, compresi convertitori RTU su TCP, e dispositivi Modbus RTU su una porta seriale: l'ingresso RS-485 della scheda I/O nella versione Industrial, oppure un adattatore seriale USB. Ogni connessione ha una coda, timeout e frequenza di interrogazione propri. Se un contatore è irraggiungibile con un cavo dati, un'interfaccia Modbus ZMB lo legge su RS-485 e invia i registri attraverso la rete mesh Zigbee. Edge include anche un server Modbus: un BMS o un sistema SCADA può leggere dal Gateway i dati del sito come registri Modbus TCP sulla porta 10502. La guida ai gateway Modbus e BACnet confronta questa soluzione con un convertitore di protocollo dedicato. Per provare prima Edge con un solo contatore, un Raspberry Pi configurato con System Manager lo esegue con un dispositivo Modbus fino a 32 registri concesso in licenza gratuitamente; consulta valuta Edge su un Raspberry Pi. La guida alla messa in servizio di Modbus RS-485 tratta in dettaglio il lato seriale.
Domande frequenti
Qual è la differenza tra Modbus TCP e Modbus RTU?
Modbus RTU usa una linea seriale come RS-485: trame binarie, CRC per il controllo degli errori e un master che interroga i dispositivi per indirizzo. Modbus TCP usa una rete IP: le stesse richieste in una trama con intestazione MBAP di 7 byte, inviate via TCP alla porta 502, con il controllo degli errori affidato a TCP. Codici funzione e mappe dei registri sono gli stessi.
Meglio Modbus TCP o Modbus RTU?
Usa l'interfaccia che l'apparecchiatura ha già. Modbus TCP è adatto ai dispositivi con porta Ethernet su una rete gestita e permette a più sistemi di leggere lo stesso dispositivo entro il suo limite di connessioni. Modbus RTU è adatto ai contatori con morsetti RS-485 in uno o due quadri, su un bus corto con un solo master. Se dispositivi seriali devono raggiungere una rete IP, metti un gateway davanti al bus.
Quale porta usa Modbus TCP?
La porta TCP 502. Il protocollo Modbus Security, che incapsula Modbus in TLS, usa la porta 802.
Quale porta usa Modbus RTU?
Nessuna in senso di rete. Modbus RTU funziona su una porta seriale: i morsetti RS-485 del dispositivo, oppure una porta COM o un adattatore seriale USB su un computer. La porta 502 è quella di Modbus TCP. Un gateway seriale-Ethernet può assegnare una porta TCP diversa a ciascuna delle sue linee seriali.
Che cos'è l'identificativo unità in Modbus TCP?
È un campo di un byte nell'intestazione MBAP. Un gateway lo usa per inoltrare la richiesta al dispositivo seriale dietro di sé, quindi contiene l'indirizzo di quel dispositivo. Per un dispositivo Modbus TCP diretto, la guida raccomanda 0xFF, ma molti dispositivi richiedono 1 o accettano qualunque valore.
Che cos'è Modbus RTU su TCP?
È una trama RTU completa di indirizzo e CRC, inviata senza modifiche su una connessione TCP e senza intestazione MBAP. Alcuni convertitori seriale-Ethernet funzionano così. Non è Modbus TCP: il client deve usare la modalità corretta per ciascun dispositivo.
Modbus TCP è la stessa cosa di Modbus TCP/IP?
Sì. Entrambi i nomi indicano richieste Modbus trasportate in pacchetti TCP su una rete IP, con l'intestazione MBAP di 7 byte davanti a ogni richiesta. Modbus RTU su TCP è diverso: invia trame RTU, con il loro CRC e senza intestazione MBAP, attraverso una connessione TCP.
Come si verifica una connessione Modbus TCP?
Verifica che l'indirizzo IP del dispositivo sia su una rete raggiungibile dal client e che la porta TCP 502 accetti una connessione. Poi leggi un registro il cui valore è visibile sul display del dispositivo, usando l'identificativo unità indicato nel manuale, e confronta valore, fattore di scala e unità con il display prima di leggere il resto della mappa.