Come funziona il decodificatore di registri Modbus
Modbus trasporta i dati in registri a 16 bit, e ogni registro viaggia con il byte alto per primo. È tutto ciò che il protocollo stabilisce. Una temperatura inviata come float a 32 bit, o un contatore di energia come intero a 64 bit, si distribuisce su due o quattro registri, e l’ordine di quei registri lo sceglie il costruttore. La maggior parte dei dispositivi invia prima il registro alto, alcuni quello basso e pochi scambiano anche i due byte di ogni registro.
Il decodificatore prende i registri esattamente come li mostra il master, il gateway o lo strumento di prova e li decodifica in tutti e quattro gli ordini insieme. L’ordine si scrive con le lettere dei byte del valore, con A il più significativo: ABCD è big-endian, CDAB il comune scambio di parole, BADC scambia i byte di ogni registro, DCBA è interamente little-endian.
Trovare l’ordine dei byte giusto
Leggi una coppia di registri sapendo più o meno cosa dovrebbe indicare il dispositivo e cerca la riga che ha senso. I registri 0x4120 0x0000 valgono 10,0 come ABCD. Letti come CDAB danno 2,3 × 10⁻⁴¹, un valore che nessun sensore indica, e il decodificatore attenua quelle righe. Se il dispositivo invia prima il registro basso vedrai invece 0x0000 0x4120, e la riga CDAB mostra il 10.
Una volta noto l’ordine di un valore, è lo stesso per tutti i valori di quel dispositivo e tipo di dato. Impostalo nella configurazione del master invece di scambiare byte nel programma del PLC.
Scalatura e tipi di dato
Molti dispositivi inviano interi con una scala implicita: una pressione di 1234 che significa 12,34 bar, o una temperatura in decimi di grado. Inserisci fattore di scala e offset dalla mappa dei registri e il decodificatore mostra il valore ingegneristico accanto a quello grezzo; il valore è grezzo × fattore di scala + offset. Lo stesso fattore vale all’inverso quando codifichi un valore da scrivere.
INT16 e UINT16 differiscono solo per come si legge il bit più alto: 0xFFFF è 65535 senza segno e −1 con segno. La maggior parte delle mappe dei registri indica il tipo di ogni indirizzo; altrimenti un valore che non dovrebbe mai essere negativo di solito è senza segno.
Numeri di registro e indirizzi
I manuali dei dispositivi elencano spesso i registri come 40001, 30001 o 400001. È la convenzione Modicon: la prima cifra indica la tabella (4 per i registri holding, 3 per i registri di input, 0 per i coil, 1 per gli ingressi discreti) e il resto conta da 1. La richiesta sulla linea porta l’indirizzo contato da 0, quindi 40001 è l’indirizzo 0 dei registri holding, letto con il codice funzione 03. Inserisci il riferimento per vedere l’indirizzo di protocollo, i codici funzione e i registri occupati da un valore su più registri.
Un errore di uno qui è la causa più frequente di un valore plausibile ma sbagliato: il master legge la seconda metà di un valore e la prima del successivo.
Domande frequenti
Perché il decodificatore mostra NaN in alcune righe?
Un float con tutti i bit dell’esponente a uno non è un numero, oppure è infinito. Un ordine dei byte sbagliato produce spesso questo schema; lo fa anche un dispositivo che segnala apposta un guasto del sensore con NaN. Per il secondo caso consulta il manuale del dispositivo.
Posso inserire i registri come un’unica stringa esadecimale?
Sì. Otto o sedici cifre esadecimali senza spazi vengono divise in registri da quattro cifre, quindi 41200000 si legge come 0x4120 0x0000.
E Modbus TCP?
La disposizione dei registri è la stessa in TCP e in RTU; cambia solo la trama. L’ordine dei byte dei valori su più registri dipende dal dispositivo, non dal mezzo di trasporto.