Interfacce dei contatori

Mappe dei registri Modbus: indirizzi, tipi di dati e fattori di scala

Guida alle mappe Modbus: registri holding e input, indirizzi 40001, valori a 32/64 bit, ordine delle parole, fattori di scala e codici non disponibili.

Una mappa dei registri Modbus elenca i valori pubblicati da un dispositivo e dove trovarli. Per ogni valore dovrebbe indicare la tabella dei registri, l'indirizzo, il tipo di dato, l'ordine delle parole, il fattore di scala e l'unità. La maggior parte delle letture Modbus errate dipende da uno di questi sei elementi, non dalla connessione. Questa guida spiega ciascun elemento e come verificare che la lettura sia corretta.

Questa guida fa parte della serie Modbus e RS-485. Le stesse regole valgono per Modbus RTU e Modbus TCP.

Le quattro tabelle di registri

Il protocollo applicativo Modbus definisce quattro tabelle. Ognuna usa codici funzione propri:

TabellaDimensioneAccessoLettura conScrittura conRiferimento classico
Coil1 bitLettura e scrittura0105, 150xxxx
Ingressi discreti1 bitSola lettura02Nessuna1xxxx
Registri input16 bitSola lettura04Nessuna3xxxx
Registri holding16 bitLettura e scrittura0306, 164xxxx

I contatori di energia pubblicano di solito le misure nei registri input o holding e le impostazioni nei registri holding. Usa il codice funzione indicato nella mappa. Leggere un registro input con la funzione 03 può restituire un altro valore o un'eccezione.

Convenzioni per gli indirizzi

Le mappe rappresentano lo stesso registro in modi diversi. La richiesta trasmessa contiene sempre un indirizzo a base zero:

Valore scritto nella mappaSignificatoIndirizzo nella richiesta
40001Riferimento classico a cinque cifre: tabella 4, registro 10
400001Riferimento esteso a sei cifre0
1 (a base uno)Registro 1 della tabella indicata nella mappa0
0 o 0x0000 (a base zero)Indirizzo di protocollo0

Una mappa che mescola le convenzioni, o uno strumento di configurazione che ne richiede un'altra, provoca un errore di un registro: ogni valore proviene dal registro adiacente a quello desiderato. Conferma la convenzione su un valore noto prima di procedere. Il convertitore di indirizzi Modbus passa da una notazione all'altra:

Tipi di dati

Un registro contiene 16 bit. La mappa specifica come interpretare quei bit:

TipoRegistriIntervallo o precisione
uint161Da 0 a 65.535
int161Da −32.768 a 32.767
uint32, int322Circa ±2,1 miliardi (con segno) o da 0 a 4,29 miliardi
float32 (IEEE 754)2Circa 7 cifre significative
uint64, int644Numeri interi esatti con almeno 18 cifre
float644Circa 15–16 cifre significative

Gli stessi bit producono numeri diversi secondo il tipo. Il contenuto 0xFFF6 vale 65.526 come uint16 e −10 come int16. Il segno va ricavato dalla mappa, non dal valore.

Un float32 ha circa sette cifre significative. Un contatore di energia memorizzato come float32 che indica 12.345.678,9 kWh non riesce più a mostrare una variazione di 0,1 kWh. Per questo molti contatori pubblicano anche l'energia come intero a 32 o 64 bit.

Ordine delle parole nei valori a 32 e 64 bit

La specifica Modbus definisce l'ordine dei byte dentro un registro, con il byte più significativo per primo. Non definisce l'ordine dei registri di un valore che ne occupa più di uno; i produttori adottano quindi ordini diversi. Indichiamo l'ordine con le lettere dei byte del valore, dove A è il più significativo:

OrdineRegistri lettiDescrizione comune
ABCDParola alta, poi parola bassaBig-endian, parola alta per prima
CDABParola bassa, poi parola altaParole scambiate
BADCParola alta per prima, byte scambiatiByte scambiati
DCBAParola bassa per prima, byte scambiatiLittle-endian

Un ordine errato produce un numero apparentemente casuale, non un valore appena diverso. Un contatore uint32 di 100.000 è rappresentato dalle parole 0x0001 e poi 0x86A0 nell'ordine ABCD. Interpretate nell'ordine sbagliato, le stesse parole danno 2.258.632.705:

Il decodificatore di registri Modbus mostra i quattro ordini affiancati; il convertitore float IEEE 754 mostra come viene codificato un valore in virgola mobile.

Fattori di scala e unità

Molti contatori inviano un intero e un fattore di scala. La mappa può indicare il fattore in tre modi:

  • Fattore fisso. «Tensione, uint16, 0,1 V»: un valore grezzo di 2.305 corrisponde a 230,5 V.
  • Potenza di dieci. «Energia, int32, 10−2 kWh»: un valore grezzo di 1.234.567 corrisponde a 12.345,67 kWh.
  • Registro del fattore di scala. I modelli SunSpec usati da molti inverter pubblicano un registro separato con la potenza di dieci per un gruppo di valori. Leggi fattore e valore nella stessa richiesta, perché il fattore può cambiare.

Procedi nell'ordine: decodifica il tipo, applica il fattore di scala e infine l'unità. Annota dove avviene la conversione. Se dispositivo, gateway e piattaforma ricevente applicano tutti un fattore, il valore viene scalato due volte. Un valore 10 o 1.000 volte troppo grande è un segnale tipico.

Per i contatori di energia annota anche il valore di ritorno a zero e il comportamento del dispositivo al ritorno a zero o al reset. La guida ai contatori a impulsi tratta lo stesso problema per i contatori di impulsi.

Parole di stato e campi di bit

Un registro di stato raccoglie flag nei suoi 16 bit. Il bit 0 è quello meno significativo. Il valore di stato 0x0025 equivale al binario 0000 0000 0010 0101: i bit 0, 2 e 5 sono impostati. La mappa spiega il significato di ciascun bit e se 1 indica uno stato attivo o regolare.

Due regole rendono sicura la lettura dei campi di bit:

  • Ricava il significato dalla mappa. La posizione di un bit non definisce un allarme. Annota il significato di 0 e di 1 per ogni bit utilizzato.
  • Non scrivere un'intera parola di stato o comando per cambiare un solo bit. Sovrascriveresti gli altri bit con l'ultimo valore letto dal software. Usa il metodo documentato dal dispositivo: un registro di comando separato, la funzione 22 (scrittura con maschera) se supportata, oppure una sequenza di lettura, modifica e scrittura approvata dal responsabile dell'apparecchiatura.

Valori non disponibili e non validi

Molti dispositivi restituiscono un codice fisso quando un valore non è disponibile, per esempio 0xFFFF, 0x8000 o un float NaN. SunSpec definisce questi codici per i propri modelli; altre mappe elencano codici specifici. Se la mappa li prevede, riconoscili prima di applicare il fattore di scala e registra la lettura come mancante, non come numero. Un valore di −32.768 V è un codice, non una misura.

Verifica ogni punto

Una risposta valida prova la connessione, non il significato del dato. Per ogni punto:

  1. Registra le parole grezze dei registri, il valore decodificato e il valore dopo il fattore di scala.
  2. Confronta il risultato con il display del dispositivo o con uno strumento di riferimento nello stesso momento.
  3. Ripeti in una seconda condizione di esercizio: un carico acceso e spento oppure una variazione del setpoint.
  4. Verifica un valore negativo se il punto può diventare negativo, per esempio la potenza immessa in rete.
  5. Conserva tutto nel verbale di accettazione.

La guida alla messa in servizio di Modbus RS-485 riporta l'intera sequenza; la guida alla risoluzione dei problemi Modbus tratta le risposte di eccezione e i valori plausibili ma errati.

Mappe dei registri nell’Elenco dispositivi e in Edge

L’Elenco dispositivi raccoglie le mappe dei registri dei contatori Modbus più comuni, con tipo di dato e ordine delle parole di ogni punto. Edge legge dispositivi Modbus TCP e Modbus RTU dal Gateway. Per ogni punto imposti il codice funzione, l'indirizzo a base zero, un tipo di dato a 16 o 32 bit, l'ordine dei byte e delle parole, un moltiplicatore e un offset. Edge considera un float NaN non disponibile. Un codice intero come 0xFFFF resta un numero: se la mappa ne definisce uno, gestiscilo con un punto calcolato. Per un contatore lontano dal Gateway, un'interfaccia Modbus ZMB legge localmente fino a 30 registri e li invia attraverso la rete mesh Zigbee.

Domande frequenti

Qual è la differenza tra registri holding e registri input?

Entrambi contengono valori a 16 bit. I registri input sono di sola lettura e si leggono con la funzione 04. I registri holding si leggono con la funzione 03 e, se il dispositivo lo consente, si scrivono con le funzioni 06 e 16. Molti contatori collocano le misure nei registri input e le impostazioni nei registri holding, ma alcuni usano solo registri holding.

Che cosa significa l'indirizzo Modbus 40001?

È il primo registro holding nella notazione di riferimento classica: la cifra iniziale 4 identifica la tabella dei registri holding. La richiesta trasmessa usa l'indirizzo 0 con la funzione 03. Alcune mappe usano la forma a sei cifre (400001) o numeri semplici che partono da 0 o da 1.

Che cos'è l'ordine delle parole in Modbus?

Un valore a 32 bit occupa due registri a 16 bit. La specifica Modbus non stabilisce quale registro contenga la metà più significativa, perciò i produttori adottano ordini diversi. Se il valore decodificato non ha senso, prova a scambiare le due parole (da ABCD a CDAB).

Quanti registri posso leggere con una richiesta?

Fino a 125 registri con la funzione 03 o 04, secondo la specifica del protocollo applicativo Modbus. Molti dispositivi ne accettano meno e alcuni restituiscono un'eccezione quando un blocco attraversa un intervallo non definito nella mappa.