Datové typy Modbus
Datové typy Modbus ve skriptech TapHome — Int16, Uint16, Int32, UInt32, Float, Bool, String a 64bitové Int64, UInt64 a Double — ve variantách big-endian, little-endian a s prohozením bajtů.
Datový typ je třetím argumentem funkcí MODBUSR, MODBUSW a MODBUSWNE a také UNPACKVALUE a PACKVALUE. Určuje, kolik 16bitových registrů hodnota zabírá a v jakém pořadí jsou uloženy její bajty. U názvů datových typů nezáleží na velikosti písmen.
Základní datové typy
Každý základní datový typ zabírá pevný počet 16bitových registrů a dává skriptu hodnotu pevného typu.
| Typ | Registry | Rozsah | Hodnota ve skriptu |
|---|---|---|---|
Bool | 1 | 0 = FALSE, cokoli jiného TRUE | bool |
Int16 | 1 | −32 768 … 32 767 | číslo |
Uint16 | 1 | 0 … 65 535 | číslo |
Int32 | 2 | −2 147 483 648 … 2 147 483 647 | číslo |
UInt32 | 2 | 0 … 4 294 967 295 | číslo |
Float | 2 | IEEE 754 jednoduchá přesnost | číslo |
Int64, UInt64 | 4 | 64bitová celá čísla | int64, uint64 |
Double | 4 | IEEE 754 dvojitá přesnost | číslo |
String | 1 – 123 | 2 znaky na registr | řetězec |
Mnoho zařízení ukládá desetinnou hodnotu jako celé číslo s pevným měřítkem — po přečtení ji vydělte, například MODBUSR(H, 20, Int16) / 10. Hodnoty v kódu BCD převedete přes FROMBCD.
Varianty pořadí bajtů
Každý typ existuje ve variantě big-endian a little-endian; 32bitové a 64bitové typy také ve variantách s prohozením bajtů.
| |
| Příznak | Význam pro registry |
|---|---|
BigEndian | Nejvýznamnější registr je první. Je to výchozí stav: Int32 je BigEndianInt32. |
LittleEndian | Pořadí registrů je obrácené (prohození registrů). U 16bitového typu, který má jeden registr, se prohodí dva bajty uvnitř něj. |
ByteSwap | Prohodí se dva bajty uvnitř každého registru. |
Poznámky
- Čtení i zápis uplatňují všechny příznaky stejně, takže zápis hodnoty a její zpětné přečtení stejným typem dá stejnou hodnotu. Na Core starším než 2026.1
MODBUSWaMODBUSWNEignorovalyByteSwapuInt32aUInt32. - Když se hodnota čte jako nesmysl, vyzkoušejte varianty v ručních operacích Modbus v aplikaci, které přepínají datový typ nad stejnými registry.
- V kolekci bajtů znamenají příznaky místo toho pořadí bajtů — viz Pořadí bajtů v kolekcích.
Příklad
MODBUSR(H, 0x0100, LittleEndianFloat);
MODBUSR(A, 30, BigEndianUint32ByteSwap);64bitové datové typy
Int64, UInt64 a Double zabírají čtyři registry; Int64 a UInt64 se čtou jako 64bitová celá čísla, přesně v celém rozsahu, protože double uchová celá čísla přesně jen do 2^53.
Poznámky — 64bitová hodnota si v bitových funkcích zachová všech 64 bitů, takže bity 32 až 63 slova alarmů jsou dosažitelné.
Příklad — elektroměr ve Wh, zobrazený v kWh
VAR energy := MODBUSR(H, 100, UInt64);
energy / 1000;Chyby — Modbus data type ‘X’ not supported. Please update your core unit to be able to use this feature. — když se skript ukládá pro starší Core.
Dostupnost — Core 2026.1, build 40595 nebo novější.
String
String čte text uložený po dvou znacích v registru, vyšší bajt první; počet registrů je čtvrtým argumentem.
Poznámky
MODBUSRčte 0 až 123 registrů; text končí u prvního nulového bajtu. Každý bajt je jeden znak.Stringlze jen číst.MODBUSWaniPACKVALUEho nezapisují.
Příklad
MODBUSR(H, 14, String, 4);
# Result: text of up to 8 characters, for example a serial numberZápis hodnot
MODBUSW, MODBUSWNE a PACKVALUE převedou hodnotu před zápisem na datový typ.
- Celočíselné typy zaokrouhlují na nejbližší celé číslo; hodnota přesně v polovině jde k sudému číslu, takže
2.5se zapíše jako2a3.5jako4. - Hodnota mimo rozsah
Int16,Uint16neboFloatzastaví skript: Overflow when writing X as UInt16. NaNlze zapsat jen doFloataDouble. Do celočíselného typu zastaví skript: RegisterValueToWrites: Can’t write double.NaN to modbus register (MODBUSW,MODBUSWNE) nebo PACKVALUE: Can’t write double.NaN to modbus register.Boolzapíše 1 pro jakoukoli hodnotu kromě 0.TRUEaFALSElze zapsat i do číselných typů jako 1 a 0.
Příklad — požadovaná teplota s jedním desetinným místem
MODBUSW(H, 20, Int16, ROUND(Te * 10));Viz také — Funkce Modbus, Skripty Modbus a prefetch, Binární data.