Modbus è un protocollo richiesta-risposta per leggere e scrivere numeri nei dispositivi di campo. Un client, come un gateway, un PLC o un sistema SCADA, invia una richiesta a un solo server, come un contatore di energia. La richiesta indica una tabella, un indirizzo iniziale e una quantità, e il server risponde con i valori o con un errore. Modicon ha pubblicato Modbus nel 1979 per i suoi PLC; oggi le specifiche sono curate dalla Modbus Organization e sono gratuite. Modbus funziona su linea seriale come Modbus RTU e su Ethernet come Modbus TCP, ed è ancora il modo più comune per leggere contatori, inverter, azionamenti e regolatori d'impianto.
Come funziona Modbus in sintesi
| Elemento | Che cos'è | Esempio |
|---|---|---|
| Client (master) | Il dispositivo che invia tutte le richieste e interroga ciclicamente | Un gateway, un PLC o un server SCADA |
| Server (slave) | Il dispositivo che contiene i dati e risponde quando viene indirizzato | Un contatore di energia o un inverter |
| Indirizzo | A quale server è destinata la richiesta | Da 1 a 247 su una linea seriale; indirizzo IP e identificativo di unità in TCP |
| Codice funzione | Che cosa fa la richiesta | 04, lettura dei registri input |
| Indirizzo dei dati e quantità | Quali voci della tabella, e quante | Da 0, leggere 2 registri |
| Mappa dei registri | L'elenco del costruttore che dice che cosa significa ogni indirizzo | Registro input 0: tensione L1, float a 32 bit, volt |
| Controllo degli errori | La prova che il frame è arrivato integro | Un CRC a 16 bit in RTU; i controlli di TCP in Modbus TCP |
La specifica separa l'unità dati di protocollo (PDU), cioè il codice funzione e i suoi dati, dall'unità dati applicativa (ADU), che aggiunge l'indirizzo e il controllo degli errori di un mezzo di trasporto. La PDU è uguale su ogni mezzo: per questo un gateway può passare una richiesta da Modbus TCP a Modbus RTU senza cambiarne il significato. Il confronto tra Modbus TCP e RTU mette a confronto i due nel dettaglio.
Il modello dei dati Modbus: quattro tabelle
Un server Modbus espone quattro tabelle. Ogni voce ha un indirizzo da 0 a 65.535, e ogni tabella ha i propri codici funzione:
| Tabella | Dimensione di una voce | Accesso | Lettura con | Scrittura con |
|---|---|---|---|---|
| Coil | 1 bit | Lettura e scrittura | 01 | 05, 15 |
| Ingressi discreti | 1 bit | Sola lettura | 02 | Nessuna |
| Registri input | 16 bit | Sola lettura | 04 | Nessuna |
| Registri holding | 16 bit | Lettura e scrittura | 03 | 06, 16 |
Un registro contiene una parola a 16 bit. Tutto ciò che è più grande si distribuisce su registri consecutivi: un float o un intero a 32 bit ne occupa due, un contatore di energia a 64 bit ne occupa quattro. Il protocollo non dice quale parola viene prima, e i costruttori di contatori usano entrambi gli ordini. Inoltre i valori sono spesso interi scalati, quindi un registro che legge 2302 può significare 230,2 V. La guida alle mappe dei registri spiega come leggere una riga della mappa, le convenzioni 30001 e 40001 e l'ordine delle parole.
È il costruttore a scegliere la tabella. Molti contatori mettono le misure nei registri input e le impostazioni nei registri holding. Altri mettono tutto nei registri holding, così la funzione 03 legge anche le misure. L'unica guida affidabile è la mappa dei registri del modello e del firmware esatti.
I codici funzione Modbus
Il codice funzione è il primo byte di ogni PDU. Questi sono quelli che si incontrano su contatori e regolatori:
| Codice | Nome | Uso tipico |
|---|---|---|
| 01 (0x01) | Lettura coil | Stato di relè e uscite |
| 02 (0x02) | Lettura ingressi discreti | Stato di contatti e allarmi |
| 03 (0x03) | Lettura registri holding | Impostazioni, e misure su molti contatori |
| 04 (0x04) | Lettura registri input | Misure su molti contatori |
| 05 (0x05) | Scrittura di una coil | Attivare o disattivare un relè |
| 06 (0x06) | Scrittura di un registro | Cambiare un setpoint |
| 15 (0x0F) | Scrittura di più coil | Impostare più uscite insieme |
| 16 (0x10) | Scrittura di più registri | Scrivere un setpoint a 32 bit o un blocco di impostazioni |
| 23 (0x17) | Lettura/scrittura di più registri | Scrivere e rileggere in una transazione |
| 43/14 (0x2B/0x0E) | Lettura identificazione dispositivo | Costruttore, codice prodotto e versione firmware |
Una lettura restituisce al massimo 125 registri o 2.000 coil, e una scrittura porta al massimo 123 registri. Questi limiti derivano dalla PDU di 253 byte. Leggere un blocco di registri vicini con una sola richiesta è molto più veloce che leggerli uno per uno, ma molti contatori rifiutano un blocco che attraversa un buco nella loro mappa.
Quando un server riceve un frame valido che non può eseguire, risponde con un'eccezione: il codice funzione con il bit più alto impostato (0x83 per una funzione 03 fallita) e un codice di eccezione. Il riferimento dei codici funzione e di eccezione li elenca tutti.
| Eccezione | Significato | Causa tipica in campo |
|---|---|---|
| 01 Funzione non valida | Il server non supporta questo codice funzione | Funzione 03 inviata a un contatore che usa la 04 |
| 02 Indirizzo dati non valido | L'indirizzo o il blocco è fuori dalla mappa | Un indirizzo sfalsato di uno, o un blocco che attraversa un buco |
| 03 Valore dati non valido | La quantità o il valore non è ammesso | Troppi registri in una richiesta |
| 04 Guasto del dispositivo server | Il server ha fallito durante l'esecuzione | Un guasto del dispositivo |
| 0A, 0B Percorso o destinazione del gateway non raggiungibile | Un gateway non ha raggiunto il dispositivo seriale | Identificativo di unità errato o bus seriale fuori servizio |
Nessuna risposta è una cosa diversa da un'eccezione. Un timeout significa che la richiesta non ha mai raggiunto il server o che la risposta non è mai tornata: cablaggio, parametri seriali, indirizzo o un problema di rete. La guida alla risoluzione dei problemi Modbus affronta entrambi i casi.
Modbus RTU, ASCII e TCP
| Modbus RTU | Modbus ASCII | Modbus TCP | |
|---|---|---|---|
| Trasporto | Linea seriale, di solito RS-485 | Linea seriale | Ethernet o qualsiasi rete IP |
| Codifica | Binaria | Caratteri esadecimali | Binaria |
| Inizio e fine del frame | Silenzio di 3,5 tempi di carattere | Due punti, poi CR LF | Campo lunghezza nell'intestazione MBAP |
| Controllo degli errori | CRC-16 | LRC | Nessuno in Modbus; TCP ed Ethernet controllano i dati |
| Indirizzamento | Indirizzo del server da 1 a 247 | Indirizzo del server da 1 a 247 | Indirizzo IP più un identificativo di unità |
| Client | Uno per bus | Uno per bus | Più di uno, se il server li accetta |
| Impostazioni predefinite | 19.200 baud, parità pari, 1 bit di stop | 19.200 baud, 7 bit di dati, parità pari | Porta TCP 502 |
Modbus RTU è di gran lunga il più diffuso sui contatori. Modbus ASCII è raro nei dispositivi nuovi. Modbus TCP racchiude la stessa PDU in un'intestazione MBAP di 7 byte: un identificativo di transazione, un identificativo di protocollo pari a 0, una lunghezza e l'identificativo di unità. Su un dispositivo collegato direttamente a Ethernet, l'identificativo di unità di solito viene ignorato o impostato a 1 o 255. Su un gateway da TCP a RTU seleziona il dispositivo seriale. La guida RS485 e Modbus spiega perché RTU e RS-485 sono due livelli e non due nomi della stessa cosa.
Esempio pratico: leggere la tensione da un contatore
La mappa dei registri dell'Eastron SDM630 mette la tensione fase 2-neutro nel registro input 30003, come float a 32 bit in volt. 30003 è il terzo registro input, quindi la richiesta porta l'indirizzo 2 e chiede due registri (un float). Per un contatore all'indirizzo 1, la richiesta Modbus RTU è di otto byte:
| Byte | Valore | Significato |
|---|---|---|
| 1 | 01 | Indirizzo del server: 1 |
| 2 | 04 | Funzione 04, lettura dei registri input |
| 3 e 4 | 00 02 | Indirizzo iniziale 2 (registro 30003) |
| 5 e 6 | 00 02 | Quantità: 2 registri |
| 7 e 8 | D0 0B | CRC-16, byte meno significativo per primo |
Il contatore risponde 01 04 04 43 67 99 9A B5 E4: indirizzo 1, funzione 04, 4 byte di dati, i due registri 0x4367 e 0x999A e il CRC. Decodificato come float IEEE 754 con la parola più significativa per prima, 0x4367999A vale 231,6 V. Puoi verificare il CRC di qualsiasi frame con il calcolatore CRC:
La stessa lettura in Modbus TCP non ha CRC. Il client invia 00 01 00 00 00 06 01 04 00 02 00 02: transazione 1, protocollo 0, 6 byte a seguire, identificativo di unità 1 e la stessa PDU. Il contatore risponde 00 01 00 00 00 07 01 04 04 43 67 99 9A: la stessa transazione, 7 byte a seguire (l'identificativo di unità e la PDU di 6 byte) e gli stessi dati. Se il contatore avesse risposto 01 84 02, sarebbe l'eccezione 02: l'indirizzo non è nella sua mappa.
Che cosa Modbus non fa
Modbus trasporta numeri. Non trasporta:
- Unità e scala. 2302 non significa nulla senza il «V × 0,1» della mappa dei registri.
- Timestamp. Una lettura è vecchia quanto il polling che l'ha prelevata. Il client deve registrare l'ora in cui ha ricevuto ogni valore.
- Qualità. Un contatore che ha perso l'ingresso di tensione può restituire 0 V senza errori. Alcune mappe offrono parole di stato o valori di «non disponibile» come 0xFFFF o NaN; il client deve controllarli.
- Eventi. Un server non può inviare nulla di sua iniziativa. Una variazione si vede solo al polling successivo, quindi l'intervallo di polling determina la latenza.
- Sicurezza. Il Modbus di base non ha login né cifratura. Usalo solo su una rete in cui ogni dispositivo collegato è fidato, e separala dal traffico d'ufficio e da Internet.
Per queste lacune un gateway che legge Modbus di solito aggiunge ora, unità e un indicatore di qualità prima di inoltrare la lettura, per esempio via MQTT o OPC UA. Spiegano anche perché gli stessi dispositivi compaiono spesso nel confronto BACnet e Modbus: gli oggetti BACnet portano unità e flag di stato che i registri Modbus non hanno.
Polling e tempi
Su un bus seriale può esserci una sola transazione alla volta. A 9.600 baud ogni carattere di 11 bit dura circa 1,15 ms. Una richiesta di 8 byte e una risposta di 40 registri di 85 byte occupano la linea per circa 106,6 ms, e i due silenzi di 3,5 caratteri portano il totale a 114,6 ms. Aggiungendo il tempo di risposta del contatore, di solito da 20 a 50 ms, ogni transazione dura da 135 a 165 ms. Dieci contatori con tre blocchi ciascuno richiedono circa 4-5 secondi per ciclo. Velocità più alte e blocchi più grandi ma meno numerosi accorciano il ciclo. Il calcolatore dei tempi RTU dà i valori per qualsiasi impostazione, e la guida alla messa in servizio calcola un budget di polling per un bus reale.
Modbus TCP è più veloce per transazione, ma un gateway davanti a un bus seriale invia comunque una richiesta alla volta sul lato seriale. Più client TCP che interrogano lo stesso gateway si dividono il suo ciclo seriale.
Modbus con EpiSensor
Edge sul Gateway ZGW-20 è un client Modbus. Legge i dispositivi Modbus TCP sulla rete del sito, e i dispositivi Modbus RTU sull'ingresso RS-485 della scheda I/O della versione Industrial del Gateway, o su un adattatore seriale USB. Registra ogni valore con ora, unità e stato, e può rendere disponibili valori selezionati a un BMS o a un sistema SCADA come registri Modbus TCP. Quando un contatore è lontano dal Gateway, l'interfaccia Modbus ZMB lo legge su un breve bus RS-485 locale e invia i registri attraverso la rete mesh Zigbee. La directory dei dispositivi elenca contatori e regolatori con mappe dei registri e template Edge, e la guida ai gateway Modbus e BACnet confronta il Gateway con i convertitori di protocollo.
Domande frequenti
A che cosa serve Modbus?
Modbus collega un controllore, un gateway o un sistema SCADA a dispositivi di campo come contatori di energia, inverter, azionamenti, PLC e regolatori di pompe di calore. Il sistema che interroga legge dai registri del dispositivo valori come tensione, potenza ed energia totale, e può scrivere setpoint o comandi dove il dispositivo lo consente.
Modbus è un protocollo seriale o Ethernet?
Entrambi. Modbus RTU e Modbus ASCII funzionano su una linea seriale, di solito RS-485. Modbus TCP funziona su reti Ethernet e IP sulla porta TCP 502. I codici funzione e il modello dei dati sono gli stessi in tutti e tre; cambiano solo il frame e l'indirizzamento.
Che cosa sono i codici funzione Modbus?
Il codice funzione è il byte che dice che cosa fa la richiesta. I più comuni sono 01 lettura coil, 02 lettura ingressi discreti, 03 lettura registri holding, 04 lettura registri input, 05 scrittura di una coil, 06 scrittura di un registro, 15 scrittura di più coil e 16 scrittura di più registri. Un server che non può eseguire la richiesta risponde con il codice funzione più 0x80 e un codice di eccezione.
Qual è la differenza tra master e slave Modbus?
Sono i vecchi nomi di client e server. Il master (client) invia tutte le richieste, lo slave (server) si limita a rispondere. La Modbus Organization oggi parla di client e server, ma molte schede tecniche e molti strumenti di configurazione usano ancora master e slave.
Quanti dispositivi può avere una rete Modbus?
Su una linea seriale un client può indirizzare i server da 1 a 247. Un segmento RS-485 porta 32 carichi unitari senza ripetitore, di più con transceiver a carico frazionario. In Modbus TCP ogni dispositivo ha il proprio indirizzo IP, e un gateway può raggiungere fino a 247 dispositivi seriali dietro un solo indirizzo IP tramite l'identificativo di unità.
Modbus è sicuro?
Il Modbus di base non ha autenticazione né cifratura: qualsiasi client che raggiunge un dispositivo può leggerlo e, se il dispositivo accetta scritture, modificarlo. Tieni Modbus TCP su una rete separata o dietro un gateway. La Modbus Organization pubblica anche Modbus/TCP Security, che aggiunge TLS sulla porta 802, ma pochi dispositivi di campo lo supportano.