22/03/2025 - Numero5 ha scritto:
...ma a volte il valore di un registro modbus è negativo ...
"L'unità di misura" della comunicazione modbus è una Word a 16 bit che va "maneggiata" sapendo cosa rappresenta.
Il primo aspetto da considerare è che il registro modbus (16 bit) in realtà va considerato come l'unione di 2 bytes e l'ordine con cui questi 2 bytes sono inseriti nel registro è la prima fonte di 'problemi'. L'ordine (endianness) lo definisce l'architettura della CPU.
Quando si leggono (scrivono) dati tramite modbus occorre quindi sapere i registri cosa contengono e si possono avere le seguenti casistiche :
1) - registro che va interpretato come array di 16 bits
2) - registro che va interpretato come insieme di 2 bytes (word / intero non segnato)
3) - registro che va interpretato come numero intero a 16 bits (di cui 1 è il segno)
4) - doppio registro (2 registri consecutivi) che vanno interpretati come insieme di 4 bytes (doppia word / doppio intero non segnato)
5) - doppio registro (2 registri consecutivi) che vanno interpretati come doppio intero a 32 bits (di cui 1 è il segno)
6) - doppio registro (2 registri consecutivi) che vanno interpretati come floating point a 32 bits (sempre con segno con codifica IEEE 754)
Nei casi 1,2,3 occorre considerare l'ordine dei byte per la corretta interpretazione del dato
Nei casi 4,5,6 occorre considerare l'ordine dei byte del singolo registro e anche l'ordine dei singoli registri per la corretta interpretazione del dato
Esiste anche un caso 7 : alcuni PLC/Dispositivi dispongono di variabili a 64 bit e quindi lo scambio avviene utilizzando 4 registri da 16 bits consecutivi (che vanno poi correttamente assemblati come QuadWord,LongLongInteger, Real), ma dubito che si riesca a gestirli in VB6.