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 |