TapHome

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.

TypRegistryRozsahHodnota ve skriptu
Bool10 = FALSE, cokoli jiného TRUEbool
Int161−32 768 … 32 767číslo
Uint1610 … 65 535číslo
Int322−2 147 483 648 … 2 147 483 647číslo
UInt3220 … 4 294 967 295číslo
Float2IEEE 754 jednoduchá přesnostčíslo
Int64, UInt64464bitová celá číslaint64, uint64
Double4IEEE 754 dvojitá přesnostčíslo
String1 – 1232 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ů.

1
2
3
4
5
6
7
8
BigEndianInt16      LittleEndianInt16
BigEndianUint16     LittleEndianUint16
BigEndianInt32      LittleEndianInt32       BigEndianInt32ByteSwap      LittleEndianInt32ByteSwap
BigEndianUint32     LittleEndianUint32      BigEndianUint32ByteSwap     LittleEndianUint32ByteSwap
BigEndianFloat      LittleEndianFloat       BigEndianFloatByteSwap      LittleEndianFloatByteSwap
BigEndianInt64      LittleEndianInt64       BigEndianInt64ByteSwap      LittleEndianInt64ByteSwap
BigEndianUint64     LittleEndianUint64      BigEndianUint64ByteSwap     LittleEndianUint64ByteSwap
BigEndianDouble     LittleEndianDouble      BigEndianDoubleByteSwap     LittleEndianDoubleByteSwap
PříznakVýznam pro registry
BigEndianNejvýznamnější registr je první. Je to výchozí stav: Int32 je BigEndianInt32.
LittleEndianPořadí registrů je obrácené (prohození registrů). U 16bitového typu, který má jeden registr, se prohodí dva bajty uvnitř něj.
ByteSwapProhodí 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 MODBUSW a MODBUSWNE ignorovaly ByteSwap u Int32 a UInt32.
  • 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.
  • String lze jen číst. MODBUSW ani PACKVALUE ho nezapisují.

Příklad

MODBUSR(H, 14, String, 4);
# Result: text of up to 8 characters, for example a serial number

Zá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.5 se zapíše jako 2 a 3.5 jako 4.
  • Hodnota mimo rozsah Int16, Uint16 nebo Float zastaví skript: Overflow when writing X as UInt16.
  • NaN lze zapsat jen do Float a Double. 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.
  • Bool zapíše 1 pro jakoukoli hodnotu kromě 0. TRUE a FALSE lze 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.