Modbus rtu

codifica rtu modbusIl protocollo modbus definisce il formato della comunicazione tra un master, che gestisce il sistema, e uno (o più) slave che rispondono alle interrogazioni del master.

Il protocollo definisce come il master e gli slave stabiliscono ed interrompono la comunicazione, come trasmettitore e ricevitore devono essere identificati, come i messaggi devono venire scambiati e come gli errori rilevati.

Il limite teorico di questo protocollo e’ pari a 247 slave ed un master sulla stessa linea (bus). Per quanto concerne l’interfaccia standard RS-485, sono supportati fino ad un massimo di 31 slave connessi alla linea. Sostituendo l’ultimo componente della linea con un apposito ponte o bidge, si possono connettere altri 31 slave, raggiungendo cosi’ il numero massimo logico di dispositivi consentiti.

Solo il master può iniziare una transazione, mentre gli slave sono sempre in attesa di una richiesta. Una transazione può avere il formato di domanda/risposta diretta ad un singolo slave o broadcast. In quest’ultimo caso, il messaggio viene inviato a tutti i dispositivi connessi al bus i quali, eseguono il comando ma non rispondono al mittente.

Il protocollo modbus è caratterizzato dalle seguenti proprietà:

  • Standard di interfaccia
  • Parità
  • Numero di stop bit
  • Formato rtu (binario)

Esiste anche il protocollo modbus di tipo ASCII ma normalmente viene implementato ed usato il RTU in quanto più efficiente.

Formato dei messaggi

Lo standard modbus definisce come i messaggi devono essere codificati. Nello specifico, i dati effettivi richiesti (o inviati) dal nodo master devono essere contenuti in un “involucro” che conterrà informazioni aggiuntive. L’unione di tutte queste informazioni saranno spedite nel canale di comunicazione fino al device di destinazione.

Modbus stabilisce il formato di questo involucro che sia il master che lo slave devono rispettare. In particolare, questo deve essere formato da:

  • L’indirizzo del dispositivo di destinazione del messaggio (l’indirizzo 0 corrisponde ad un messaggio broadcast inviato a tutti i dispositivi).
  • Il codice della funzione che deve essere o è stata eseguita.
  • I dati che devono essere scambiati.
  • Il controllo dell’errore composto secondo l’algoritmo CRC16.

Se il dispositivo destinatario individua un errore nel messaggio ricevuto (di formato, di parità o nel CRC16), di conseguenza lo considererà non valido e lo scarterà. Uno slave che rileva un errore nel messaggio non eseguirà quindi l’azione e non risponderà al comando, così come se l’indirizzo non corrisponda ad un dispositivo in linea.

Parametri di connessione al device

Normalmente i dispositivi che adottano il protocollo mobus (come per esempio Arduino), utilizzano in formato 8,N,1 ovvero: 8 bit di dati, senza nessun controllo di parità e con 1 bit di stop.

L’indirizzo

Come sopra menzionato, le transazioni modbus vengono iniziate sempre dal master che gestisce la linea ed un solo slave alla volta, destinatario della comunicazione (tranne nel caso di messaggi broadcast). Il primo byte del pacchetto trasmesso nel bus corrisponde all’indirizzo (numerico) del destinatario. Affinchè la comunicazione venga eseguita senza problemi, ad ogni slave deve essere obbligatoriamente assegnato un indirizzo univoco. Ecludendo l’indirizzo 0 che deve essere usato esclusivamente come broadcast, tutti gli altri da 1 a 247 posso essere utilizzati liberamente.

Possono essere trasmessi come broadcast solo messaggi che non richiedano risposta per espletare la loro funzione, quindi solo le assegnazioni.

Il codice funzione

Il secondo carattere del messaggio identifica la funzione che deve essere eseguita nel messaggio trasmesso dal master, cui lo slave risponde a sua volta con lo stesso codice ad indicare che la funzione è stata eseguita.

Le funzioni modbus che più di frequente vengono utilizzate sono le seguenti:

  • 01: READ COIL STATUS
  • 02: READ INPUT STATUS
  • 03: READ HOLDING REGISTER
  • 04: READ INPUT REGISTER
  • 05: FORCE SINLE REGISTER
  • 06: PRESET SINGLE REGISTER
  • 07: READ STATUS
  • 15: FORCE MULTIPLE COILS
  • 16: PRESET MULTIPLE REGISTER

Controllo degli errori: il CRC16

Gli ultimi due bytes del messaggio modbus contengono il codice di ridondanza ciclica calcolato secondo l’algoritmo CRC16. Il primo carattere trasmesso viene anche identificato come MSB (most significant byte) mentre il secondo come LSB (least significant byte). Questa denominazione deriva dal fatto che i due bytes in realtà altro non rappresentano che un numero a 16 bit.

Gli step necessari per il calcolo del CRC16 sono i seguenti:

  1. Caricare un registro a 16bit con FFFh (tutti i bit a 1)
  2. Fare l’OR esclusivo del primo carattere con il byte superiore del registro, porre il risultato nel registro.
  3. Spostare il registro a destra di un bit.
  4. Se il bit uscito a destra dal registro è un 1, fare l’OR esclusivo del polinomio generatore 1010000000000001 con il registro.
  5. Ripetere per 8 volte i passi 3 e 4
  6. Fare l’OR esclusivo del carattere successivo con il byte superiore del registro, porre il risultato nel registro.
  7. Ripetere i passi 3 e 6 per tutti i caratteri del messaggio.
  8. Il contenuto del registro a 16 bit è il codice di ridondanza CRC che deve essere aggiunto al messaggio.