Interfacce dei contatori

Che cos'è Modbus? Come funziona il protocollo Modbus

Modbus è un protocollo richiesta-risposta: un client legge e scrive i registri di un server. Modello dei dati, codici funzione, frame RTU e TCP.

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

ElementoChe cos'èEsempio
Client (master)Il dispositivo che invia tutte le richieste e interroga ciclicamenteUn gateway, un PLC o un server SCADA
Server (slave)Il dispositivo che contiene i dati e risponde quando viene indirizzatoUn contatore di energia o un inverter
IndirizzoA quale server è destinata la richiestaDa 1 a 247 su una linea seriale; indirizzo IP e identificativo di unità in TCP
Codice funzioneChe cosa fa la richiesta04, lettura dei registri input
Indirizzo dei dati e quantitàQuali voci della tabella, e quanteDa 0, leggere 2 registri
Mappa dei registriL'elenco del costruttore che dice che cosa significa ogni indirizzoRegistro input 0: tensione L1, float a 32 bit, volt
Controllo degli erroriLa prova che il frame è arrivato integroUn 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:

TabellaDimensione di una voceAccessoLettura conScrittura con
Coil1 bitLettura e scrittura0105, 15
Ingressi discreti1 bitSola lettura02Nessuna
Registri input16 bitSola lettura04Nessuna
Registri holding16 bitLettura e scrittura0306, 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:

CodiceNomeUso tipico
01 (0x01)Lettura coilStato di relè e uscite
02 (0x02)Lettura ingressi discretiStato di contatti e allarmi
03 (0x03)Lettura registri holdingImpostazioni, e misure su molti contatori
04 (0x04)Lettura registri inputMisure su molti contatori
05 (0x05)Scrittura di una coilAttivare o disattivare un relè
06 (0x06)Scrittura di un registroCambiare un setpoint
15 (0x0F)Scrittura di più coilImpostare più uscite insieme
16 (0x10)Scrittura di più registriScrivere un setpoint a 32 bit o un blocco di impostazioni
23 (0x17)Lettura/scrittura di più registriScrivere e rileggere in una transazione
43/14 (0x2B/0x0E)Lettura identificazione dispositivoCostruttore, 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.

EccezioneSignificatoCausa tipica in campo
01 Funzione non validaIl server non supporta questo codice funzioneFunzione 03 inviata a un contatore che usa la 04
02 Indirizzo dati non validoL'indirizzo o il blocco è fuori dalla mappaUn indirizzo sfalsato di uno, o un blocco che attraversa un buco
03 Valore dati non validoLa quantità o il valore non è ammessoTroppi registri in una richiesta
04 Guasto del dispositivo serverIl server ha fallito durante l'esecuzioneUn guasto del dispositivo
0A, 0B Percorso o destinazione del gateway non raggiungibileUn gateway non ha raggiunto il dispositivo serialeIdentificativo 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 RTUModbus ASCIIModbus TCP
TrasportoLinea seriale, di solito RS-485Linea serialeEthernet o qualsiasi rete IP
CodificaBinariaCaratteri esadecimaliBinaria
Inizio e fine del frameSilenzio di 3,5 tempi di carattereDue punti, poi CR LFCampo lunghezza nell'intestazione MBAP
Controllo degli erroriCRC-16LRCNessuno in Modbus; TCP ed Ethernet controllano i dati
IndirizzamentoIndirizzo del server da 1 a 247Indirizzo del server da 1 a 247Indirizzo IP più un identificativo di unità
ClientUno per busUno per busPiù di uno, se il server li accetta
Impostazioni predefinite19.200 baud, parità pari, 1 bit di stop19.200 baud, 7 bit di dati, parità pariPorta 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:

ByteValoreSignificato
101Indirizzo del server: 1
204Funzione 04, lettura dei registri input
3 e 400 02Indirizzo iniziale 2 (registro 30003)
5 e 600 02Quantità: 2 registri
7 e 8D0 0BCRC-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.