Modbus RTU, ASCII e TCP con SerialTool

Cos’è il Modbus

Il Modbus è un protocollo di comunicazione seriale creato nel 1979 da Modicon® (azienda ora parte del gruppo Schneider Electric) per mettere in comunicazione i propri controllori logici programmabili (PLC). È diventato uno standard de facto nella comunicazione di tipo industriale, ed attualmente è uno dei protocolli di connessione più diffusi al mondo fra i dispositivi elettronici industriali. Il Modbus è un protocollo royalty free dichiarato come specifiche nel sito Il The Modbus Organization.

In termini semplici, è un metodo utilizzato per trasmettere informazioni su linee seriali tra dispositivi elettronici. Il dispositivo che richiede le informazioni è chiamato Modbus Client e i dispositivi che forniscono le informazioni sono Modbus Server. In una rete Modbus standard, sono presenti un client e fino a 247 server, ciascuno con un unico indirizzo server da 1 a 247. Il client può anche scrivere informazioni sui server.


Nato per essere utilizzato in ambito industriale, con il tempo questo protocollo è stato utilizzato anche in altri settori diventando uno dei più diffusi, ed ancora oggi, nonostante abbia ormai più di 40 anni, lo troviamo disponibile in molti dispositivi, come pannelli operatore, PLC, domotica ed anche integrato su dispositivi semplici come Arduino.

Trasmissione Modbus RTU ed ASCII via Seriale

La comunicazione, quando il protocollo è stato realizzato, era pensato per essere utilizzato mediante porta seriale ed è per questa ragione che è stato implementato in SerialTool. Il Modbus viene spesso utilizzato per collegare un computer di supervisione con un'unità terminale remota (RTU) nei sistemi di controllo di supervisione e acquisizione dati (SCADA). A seconda del formato con cui vengono trasmessi i dati, il protocollo si divide in:

  • MODBUS RTU - i dati vengono trasmessi in formato esadecimale.
  • MODBUS ASCII - i dati transitano invece in formato ASCII.

Il controllo errori si differenzia nei due casi, nel MODBUS RTU viene utilizzato un CRC (Cyclic Redundancy Check, controllo di ridondanza ciclico) inviato in coda ai comandi, mentre nel MODBUS ASCII un LRC (longitudinal Redundancy Check, controllo di ridondanza orizzontale) sempre inviato dopo i comandi.

Trasmissione Modbus TCP

Nel 1999 è stato sviluppato “Modbus TCP”, standard dedicato alle reti che sfruttano la suite di protocolli TCP/IP: di fatto è una versione di Modbus seriale RTU basata appunto su TCP/IP, il che consente comunicazioni su reti internet/intranet. Negli ultimi anni la versione TCP/IP è sempre più utilizzata in quanto Open Source, semplice da implementare, dal basso costo di sviluppo e dal supporto hardware da garantire davvero minimo.

Il controllo errori si differenzia nei due casi, nel MODBUS RTU viene utilizzato un CRC (Cyclic Redundancy Check, controllo di ridondanza ciclico) inviato in coda ai comandi, mentre nel MODBUS ASCII un LRC (longitudinal Redundancy Check, controllo di ridondanza orizzontale) sempre inviato dopo i comandi.

Il protocollo Modbus TCP/IP utilizza una codifica binaria dei dati ed il meccanismo di rilevamento errori TCP/IP, a differenza del Modbus seriale, la versione TCP/IP è orientata alle connessioni e permette di eseguirle in modo concorrente sullo stesso slave o su più dispositivi. Anche Modbus TCP/IP utilizza il paradigma master-slave; questa comunicazione utilizza in più quattro tipi di messaggio.

Il ModBus si posiziona a livello 7 nella pila ISO/OSI (Application Layer), definendo la formattazione dei messaggi detta framing e la modalità di trasmissione dei dati e delle funzioni di controllo. La comunicazione avviene tramite il paradigma client-server. Il protocollo definisce un Protocol Data Unit (PDU) che non dipende dal sottostante strato di comunicazione. L’Application Data Unit (ADU) introduce campi addizionali per l’indirizzamento e il controllo dell’errore.

SerialTool Modbus Client

SerialTool supporta le modalità di trasmissione RTU, ASCII e Modbus TCP per offrire il massimo della flessibilità professionale di un Client Modbus.
SerialTool offre anche la possibilità di mandare comandi Raw per agevolare ad ogni necessità dello sviluppatore.

Schermata con il log dei comandi inviati

Schemata con i comandi a basso livello inviati


Modbus Functions

Ecco le funzioni che SerialTool implementa del protocollo Modbus.

Function Code Action Table Name
0x01 Read Discrete Output Coils
0x02 Read Discrete Input Contacts
0x03 Read Analog Output Holding Register
0x04 Read Analog Input Registers
0x05 Write Single Discrete Output Coil
0x06 Write Single Analog Output Holding Register
0x0F (dec 15) Write Multiple Discrete Output Coils
0x10 (dec 16) Write Multiple Analog Output Holding Registers

Strutture dati Modbus

Le informazioni sono memorizzate nel dispositivo Server in quattro diverse tabelle. Due tabelle memorizzano valori discreti on/off (bobine) e due memorizzano valori numerici (registri). Le bobine e i registri hanno ciascuno una tabella di sola lettura e una tabella di lettura-scrittura. Ogni tabella ha 9999 valori. Ogni bobina o contatto è a 1 bit e ha un indirizzo dati compreso tra 0000 e 270E. Ogni registro è 1 parola = 16 bit = 2 byte e ha anche un indirizzo dati compreso tra 0000 e 270E.

Coil/Registers numbers Data Addresses Type Table Name
1-9999 0x0000 to 0x270E Read/Write Discrete Output Coils
10001-19999 0x0000 to 0x270E Read Only Discrete Input Contacts
30001-39999 0x0000 to 0x270E Read Only Analog Input Register
40001-49999 0x0000 to 0x270E Read/Write Analog Output Holding Register