Modbus RTU, ASCII e TCP con SerialTool

Ultimo aggiornamento del di Oliver Reed

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 (Master / Polling)

SerialTool è un client Modbus RTU, ASCII e TCP con polling, scanner registri, monitor traffico e grafici live per test e debug di dispositivi industriali.

Il Modbus Client permette ti connetterti a un Modbus Slave/server dispositivo tramite Seriale (RTU o ASCII) o Rete (TCP tramite IPv4 o IPv6), leggere e scrivere dati usando le funzioni standard Modbus, creare un dispositivo Modbus con una propria mappatura sul quale eseguire temporizzato polling.
Nel dispositivo prototipo è possibile aggiungere strutture Modbus (Discrete Output Coils, Discrete Input Contacts, Analog Input Register, Analog Output Holding Register) e salvare il dispositivo per poi poterlo ricaricaricare ogni qualvolta sia necessario. Il dispositivo prototipo Modbus può anche essere esportato in formato Testo, CSV o PDF per essere condiviso in maniera semplice ed intuitiva.
Una volta creato un dispositivo con la corretta mappatura è possibile visualizzare grafici in tempo reale con i valori letti direttamente dal dispositivo Slave mediante un polling temporizzato.
SerialTool offre inoltre la possibilità di visualizzare il traffico Modbus (Seriale e TCP) in un apposito terminale relativo al traffico generato e ricevuto. Il terminale avanzato consente l'esportazione dei dati la possibilità di filtrare i dati in ingresso ed uscita in tempo reale.
SerialTool offre inoltre la possibilità di setacciare (scannerizzare) il dispositivo Slave remoto grazie alla funzione Modbus Scanner. Impostando i filtri corretti si può tentare di mappare il dispositivo remoto (Slave Modbus) anche senza sapere i regitri attualmente supportati. La funzione di Modbus Scanner è particolarmente ideale se si intende esplorare un dispositivo di cui non si conoscono o si conoscono solo parzialmente le caratteristiche.

Ecco la schermata principale del modulo Modbus di SerialTool:

Modbus Client (Master/Polling) Main page

Schermata principale del Client Modbus di SerialTool

La schemata principale evidenzia le funzionalità principali di SerialTool ed del Client Modbus (Master).

SerialTool Modbus Client (Master / Polling)

Nella parte sinistra della schermata è presente la possibilità di scegliere la modalità di connessione Seriale o TCP:

Modbus Client Connection

Schermata Connessione Client Modbus

Come indicato sopra il protocollo Modbus seriale si divide in due tipologie RTU ed ASCII. Per eseguire riuscire a comunicare correttamente con il dispositivo remoto è indispensabile conoscere, in caso di collegamento Seriale, che tipologia di protocollo Modbus è supportato dal nostro dispositivo Slave.

Il collegamento ModBus TCP, invece, supporta gli IPv4 ed IPv6. Per settare il collegamento Modbus via TCP è necessario impostare l'IP dello slave e la porta remota alla quale collegarsi.

Nella schermata di collegamento sono presenti due parametri per il timeout nella risposta che il dispositivo Modbus Slave deve fornirci.
Un timeout generico nella rispsota (Response Timeout), scaduto il quale il Client (Master) smette di attendere la risposta dallo slave ed un timeout dall'ultimo byte ricevuto dallo Slave.

Emulazione Modbus ENRON/Daniel

Tra i parametri di connessione è presente l'emulazione ENRON/Daniel (spesso chiamata semplicemente Enron Modbus o Daniels Modbus) che fa riferimento a una variante specifica del protocollo di comunicazione Modbus standard.
È stata sviluppata originariamente dalla Enron Corporation e implementata ampiamente nei flow computer (calcolatori di flusso) dell'azienda Daniel Measurement and Control. Col tempo, è diventata uno standard de facto per la misurazione elettronica dei fluidi (EFM), in particolare nel settore Oil & Gas.

Abilitare l'emulazione ENRON/Daniel su un dispositivo serve a modificare il comportamento del Modbus per supportare le seguenti caratteristiche chiave:

  • 1. Gestione dei dati a 32 bit in un singolo registro: Questa è la differenza tecnica più importante. Nel Modbus Standard i registri sono a 16 bit (2 byte) e richiedono la lettura di due registri per un valore a 32 bit. Nell'Enron Modbus, i valori a 32 bit vengono mappati in un singolo registro (4 byte per registro).
  • 2. Mappatura specifica degli indirizzi: Utilizza fasce predefinite per i dati a 32 bit. La serie 5000 (es. 45001 - 45999) è per i Long Integers, mentre la serie 7000 (es. 47001 - 47999) è per i Floating Points.
  • 3. Dati storici ed eventi: Supporta comandi speciali per estrarre log storici e archivi di allarmi, a differenza del Modbus standard pensato quasi esclusivamente per la lettura in tempo reale.
  • 4. Assenza di Offset: L'indirizzo richiesto corrisponde esattamente al numero del registro, eliminando il classico "offset di +1" tipico del Modbus standard.

In sintesi: L'emulazione è fondamentale per evitare errori di comunicazione (disallineamento dei byte) quando ci si interfaccia con dispositivi che trasmettono dati a 32 bit nativi nel settore Oil & Gas.


Funzioni Modbus Client

Nella parte centrale dello schermo troviamo le funzioni Modbus supportate da SerialTool.

Modbus Client Functions

Funzioni supportate per il Modbus modalità Client

Le funzioni del client ModBus sono riassumibili nella seguente tabella.

Function Code Action Table Name / Description
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
0x07 Read Exception Status
0x08 Diagnostics Diagnostics (Serial Line only)
0x0B (dec 11) Read Comm Event Counter (Serial Line only)
0x0F (dec 15) Write Multiple Discrete Output Coils
0x10 (dec 16) Write Multiple Analog Output Holding Registers
0x11 (dec 17) Report Server ID (Serial Line only)
0x16 (dec 22) Mask Write Holding Register
0x17 (dec 23) Read/Write Multiple Holding Registers
0x2B / 0x0E (dec 43 / 14) Read Device Identification

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

Dispositivo Modbus

SerialTool consente la creazione di un dispositivo Modbus Slave che rappresenta la mappatura dei registri del dispositivo Slave al quale si intende connettersi. Questa mappatura è molto importante perchè consente di vedere rappresentati in una tabella locale i valori presenti nel dispositivo slave remoto.

Funzioni Modbus Client

Modbus Slave functions map

Funzioni disponibili per il Modbus Client

Dalla barra delle funzioni è possibile caricare un dispositivo precedentemente creato funzione "Load Device", salvare il dispositivo corrente "Save Device" aggiungere singoli registri "Add Item" o registri multipli "Add Items" alla mappatura del dispisitivo.

Add Multiple Modbus Registers

Aggiunta di registri Modbus al mapping del dispositivo Modbus


Modbus Device Slave Memory Mapping

Area di memoria dispositivo Modbus Slave (Modbus device)

SerialTool una volta creata la mappature del dispositivo Slave Modbus consente di salvarlo per un utilizzo successivo o di esportarne il contenuto in formato CSV, Testo o PDF per la considivisione l'elaborazione con terze parti. Nell'immagine successiva si vede un esempio di esportazione della mappatura di un dispositivo Modbus Slave:

Modbus Slave Mapping

Esempio di esportazione in PDF della mappatura di un dispositivo Modbus Slave

E' possibile scaricare il PDF da questo link.

Modbus Polling

Creare un dispositivo Modbus Slave consente di fare il polling ovvero di eseguire la lettura temporizzata di alcuni registri del dispositivo slave al quale si è collegati.
Per fare questo bisogna anzitutto creare e mappare lo Slave, e aggiungere il registro o i registri per i quali si intende effettuare il polling, come indicato nella figura successiva:

Modbus Master to Slave Polling

L'immagine mostra l'aggiungere un elemento al polling verso lo slave

Una volta aggiunto uno o più elementi in polling possibile far partire il polling degli item collegati al polling.

Modbus Master to Slave Polling Mask

L'immagine mostra gli elementi selezionati per il polling

Accesso alle funzioni Modbus

Il client (Master/Polling) Modbus di SerialTool è predisposto per eseguire le funzioni in tre modalità:

Modbus execute function

Esecuzione funzioni Modbus

  • "Execute from Device Table" - Esegue la funzione Modbus facendo riferiemento alla mappatura del device.
  • "Execute Function" - Esegue la funzione Modbus diretta e mostra il risultato nella finestra di log.
  • "Send Raw Data" - Invia una rischiesta diretta formata da bytes esadecimali ed attende la risposta.

Execute from Device Table

Questa modalità esegue la funzione Modbus selezionata utilizzando direttamente la tabella del dispositivo caricata o creata localmente. L'utente può selezionare il tipo di riferimento Modbus, ad esempio Coil, Discrete Inputs, Holding Registers o Input Registers, scegliere l'indirizzo iniziale e il numero di elementi da leggere o scrivere, quindi inviare il comando allo slave con un solo click.
Il principale vantaggio di questa modalità è che il risultato viene riportato immediatamente nella mappa del dispositivo, aggiornando i valori mostrati nella tabella locale. In questo modo è possibile avere una rappresentazione ordinata e persistente dello stato del dispositivo remoto, utile sia durante la fase di collaudo sia nelle attività di monitoraggio e manutenzione.
Quando il comando riguarda una funzione di scrittura, SerialTool permette di preparare in modo semplice i dati da trasmettere, scegliendo il tipo di dato, il formato di visualizzazione e il contenuto da scrivere nei registri selezionati. Questa modalità è quindi particolarmente indicata quando si vuole lavorare direttamente sulla struttura logica del dispositivo Modbus.

Execute Function

La modalità Execute Function consente di eseguire una funzione Modbus selezionandola direttamente dall'elenco dei codici funzione disponibili, come lettura coils, lettura input discreti, lettura holding registers, lettura input registers, scrittura singola o multipla e altre funzioni supportate dal protocollo.
In questo caso l'operazione non è vincolata alla sola visualizzazione nella mappa del dispositivo, ma il risultato viene riportato nello spazio di log dell'applicazione. Questo approccio è particolarmente utile quando si desidera verificare rapidamente il contenuto della risposta ricevuta, testare una specifica funzione Modbus oppure effettuare prove mirate su indirizzi e quantità variabili senza modificare necessariamente la mappa del dispositivo.
La modalità Execute Function è molto comoda anche per il debug, perchè permette di vedere con immediatezza l'esito del comando eseguito, gli eventuali errori restituiti dallo slave e le informazioni associate alla richiesta e alla risposta.

Send Raw Data

Questa funzione invia e riceve dei comandi arbitrari inviati allo slave in formato esadecimale. Consente all'utente di digitare manualmente la sequenza di byte da trasmettere sulla connessione attiva, ad esempio seriale o TCP/IP, senza costruzione automatica del frame da parte del software.
La funzione è molto utile per attività avanzate di test, reverse engineering, diagnostica o validazione di dispositivi Modbus e di protocolli compatibili. In pratica il client trasmette esattamente i byte inseriti dall'utente, lasciando il pieno controllo sul contenuto del pacchetto. Questo rende possibile simulare richieste personalizzate, testare risposte anomale oppure inviare frame già completi preparati manualmente.
Abilitando l'opzione di attesa della risposta, SerialTool può anche acquisire il frame di ritorno ricevuto dallo slave e mostrarlo nel log di traffico, permettendo così un confronto immediato tra dati trasmessi e dati ricevuti.

Modbus Raw Data

Spedizione dei dati Raw

Funzione scanner Modbus

SerialTool ha la funzione di scanning degli indirizzi modbus del dispositivo Slave collegato. Questa funzione permette di esplorare rapidamente un intervallo di indirizzi partendo da un indirizzo iniziale fino a un indirizzo finale, specificando anche il codice funzione da utilizzare durante la scansione.
Lo scanner è particolarmente utile quando non si conosce con precisione la mappa completa del dispositivo remoto oppure quando si desidera verificare quali indirizzi risultano validi e quali contengono dati significativi. Per ogni indirizzo interrogato, SerialTool mostra nella tabella il tipo di funzione utilizzata, l'indirizzo, il valore letto e l'esito dell'operazione.
Questa modalità accelera in modo significativo le attività di diagnostica e integrazione con dispositivi di terze parti, perchè consente di individuare rapidamente aree della memoria Modbus realmente utilizzate dallo slave e di esportare i risultati della scansione per analisi successive o condivisione.

Modbus Slave Scanner

Tabella degli indirizzi

Grafico dei registi Modbus dello Slave

I valori dei registri Modbus possono essere visualizzati in un grafico. Questa funzione consente di collegare uno o più elementi della mappatura del dispositivo a una finestra chart dedicata, nella quale i valori vengono tracciati nel tempo durante il polling o durante le operazioni di aggiornamento.
Ogni registro collegato al grafico può essere visualizzato con una propria traccia, identificata da un colore specifico e da informazioni come riferimento Modbus, indirizzo, valore corrente e nome assegnato all'elemento. In questo modo è possibile osservare facilmente l'andamento temporale di variabili analogiche, setpoint, misure o registri numerici che cambiano durante il funzionamento del dispositivo.
La funzione grafica è particolarmente utile per attività di monitoraggio, collaudo e analisi dinamica, perchè consente di vedere in modo immediato come evolvono i dati nel tempo senza limitarsi alla sola lettura tabellare.

Modbus Client/Slave Chart

Grafico dei registri Modbus

Log traffico Modbus

Tutti i comandi inviati e ricevuti sono mostrati nella finestra di Log del traffico modbus in bytes. Il log traffico rappresenta uno strumento fondamentale per il debug della comunicazione, perchè consente di visualizzare in modo dettagliato i dati trasmessi dal client e i dati ricevuti dal dispositivo slave, riportando le sequenze di byte in forma leggibile.
Grazie a questa finestra è possibile controllare il contenuto effettivo dei frame, verificare che i comandi generati siano corretti e diagnosticare eventuali problemi di timeout, risposte anomale, eccezioni Modbus o dati inattesi. Il traffico può essere consultato durante l'uso normale del client, durante il polling automatico oppure durante l'invio di dati raw.
La finestra di traffico mette inoltre a disposizione funzioni avanzate come copia dei dati in formato ASCII o esadecimale, salvataggio su file, ricerca nel contenuto, selezione delle righe e opzioni di personalizzazione grafica quali colori, font, spaziatura e impostazioni di visualizzazione. Questo rende il log traffico non solo un semplice visualizzatore, ma anche uno strumento operativo molto utile per sviluppatori, tecnici e integratori.

Modbus Client/Slave Traffic

Traffico Modbus