Tipi di dati Modbus
Tipi di dati Modbus negli script TapHome — Int16, Uint16, Int32, UInt32, Float, Bool, String e i tipi a 64 bit Int64, UInt64 e Double — con varianti big-endian, little-endian e byte swap.
Il tipo di dati è il terzo argomento di MODBUSR, MODBUSW e MODBUSWNE e di UNPACKVALUE e PACKVALUE. Decide quanti registri a 16 bit occupa un valore e in quale ordine sono memorizzati i suoi byte. I nomi dei tipi di dati non distinguono tra maiuscole e minuscole.
Tipi di dati di base
Ogni tipo di dati di base occupa un numero fisso di registri a 16 bit e fornisce allo script un valore di un tipo fisso.
| Tipo | Registri | Intervallo | Valore nello script |
|---|---|---|---|
Bool | 1 | 0 = FALSE, qualsiasi altro valore TRUE | bool |
Int16 | 1 | −32 768 … 32 767 | numero |
Uint16 | 1 | 0 … 65 535 | numero |
Int32 | 2 | −2 147 483 648 … 2 147 483 647 | numero |
UInt32 | 2 | 0 … 4 294 967 295 | numero |
Float | 2 | IEEE 754 a precisione singola | numero |
Int64, UInt64 | 4 | numeri interi a 64 bit | int64, uint64 |
Double | 4 | IEEE 754 a precisione doppia | numero |
String | 1 – 123 | 2 caratteri per registro | string |
Molti dispositivi memorizzano un valore decimale come numero intero con una scala fissa — dividilo dopo la lettura, ad esempio MODBUSR(H, 20, Int16) / 10. I valori codificati in BCD si convertono con FROMBCD.
Varianti dell’ordine dei byte
Ogni tipo esiste in una variante big-endian e in una little-endian; i tipi a 32 e 64 bit anche in varianti byte swap.
| |
| Flag | Significato per i registri |
|---|---|
BigEndian | Il registro più significativo viene per primo. È il valore predefinito: Int32 è BigEndianInt32. |
LittleEndian | L’ordine dei registri è invertito (word swap). Per un tipo a 16 bit, che ha un solo registro, vengono scambiati i due byte al suo interno. |
ByteSwap | I due byte all’interno di ogni registro vengono scambiati. |
Note
- Lettura e scrittura applicano tutti i flag allo stesso modo, quindi scrivere un valore e rileggerlo con lo stesso tipo dà lo stesso valore. Sui Core precedenti alla 2026.1,
MODBUSWeMODBUSWNEignoravanoByteSwapperInt32eUInt32. - Quando un valore viene letto senza senso, prova le varianti nelle operazioni Modbus manuali dell’app, che cambiano il tipo di dati sugli stessi registri.
- In una collezione di byte i flag indicano invece l’ordine dei byte — vedi Ordine dei byte nelle collezioni.
Esempio
MODBUSR(H, 0x0100, LittleEndianFloat);
MODBUSR(A, 30, BigEndianUint32ByteSwap);Tipi di dati a 64 bit
Int64, UInt64 e Double occupano quattro registri; Int64 e UInt64 vengono letti come numeri interi a 64 bit, esatti su tutto l’intervallo, perché un double rappresenta esattamente i numeri interi solo fino a 2^53.
Note — Un valore a 64 bit mantiene tutti i 64 bit nelle funzioni sui bit, quindi i bit da 32 a 63 di una parola di allarme sono raggiungibili.
Esempio — contatore di energia in Wh, mostrato in kWh
VAR energy := MODBUSR(H, 100, UInt64);
energy / 1000;Errori — Modbus data type ‘X’ not supported. Please update your core unit to be able to use this feature. — quando lo script viene salvato per un Core più vecchio.
Disponibile — Core 2026.1, build 40595 o più recente.
String
String legge un testo memorizzato con due caratteri per registro, prima il byte alto; il numero di registri è il quarto argomento.
Note
MODBUSRlegge da 0 a 123 registri; il testo termina al primo byte zero. Ogni byte è un carattere.Stringsi può solo leggere.MODBUSWePACKVALUEnon lo scrivono.
Esempio
MODBUSR(H, 14, String, 4);
# Result: text of up to 8 characters, for example a serial numberScrittura dei valori
MODBUSW, MODBUSWNE e PACKVALUE convertono il valore nel tipo di dati prima della scrittura.
- I tipi interi arrotondano al numero intero più vicino; un valore esattamente a metà va al numero pari, quindi
2.5viene scritto come2e3.5come4. - Un valore fuori dall’intervallo di
Int16,Uint16oFloatinterrompe lo script: Overflow when writing X as UInt16. NaNsi può scrivere solo inFloateDouble. In un tipo intero interrompe lo script: RegisterValueToWrites: Can’t write double.NaN to modbus register (MODBUSW,MODBUSWNE) o PACKVALUE: Can’t write double.NaN to modbus register.Boolscrive 1 per qualsiasi valore diverso da 0.TRUEeFALSEsi possono scrivere anche nei tipi numerici come 1 e 0.
Esempio — setpoint con un decimale
MODBUSW(H, 20, Int16, ROUND(Te * 10));Vedi anche — Funzioni Modbus, Script Modbus e prefetch, Dati binari.