TapHome

Dátové typy Modbus

Dátové typy Modbus v skriptoch TapHome — Int16, Uint16, Int32, UInt32, Float, Bool, String a 64-bitové Int64, UInt64 a Double — s variantmi big-endian, little-endian a byte swap.

Dátový typ je tretím argumentom funkcií MODBUSR, MODBUSW a MODBUSWNE aj funkcií UNPACKVALUE a PACKVALUE. Určuje, koľko 16-bitových registrov hodnota zaberá a v akom poradí sú uložené jej bajty. Na veľkosti písmen v názvoch dátových typov nezáleží.

Základné dátové typy

Každý základný dátový typ zaberá pevný počet 16-bitových registrov a dáva skriptu hodnotu pevne daného typu.

TypRegistreRozsahHodnota v skripte
Bool10 = FALSE, čokoľvek iné 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á presnosťčíslo
Int64, UInt64464-bitové celé číslaint64, uint64
Double4IEEE 754, dvojitá presnosťčíslo
String1 – 1232 znaky na registerreťazec

Mnohé zariadenia ukladajú desatinnú hodnotu ako celé číslo s pevnou mierkou — po prečítaní ho vydeľte, napríklad MODBUSR(H, 20, Int16) / 10. Hodnoty v kóde BCD prevádza funkcia FROMBCD.

Varianty poradia bajtov

Každý typ existuje vo variante big-endian a little-endian; 32- a 64-bitové typy aj vo variantoch byte swap.

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
PríznakVýznam pre registre
BigEndianNajvýznamnejší register je prvý. Je to predvolené správanie: Int32 je BigEndianInt32.
LittleEndianPoradie registrov je obrátené (word swap). Pri 16-bitovom type, ktorý má jeden register, sa vymenia dva bajty v ňom.
ByteSwapDva bajty v každom registri sa vymenia.

Poznámky

  • Čítanie aj zápis uplatňujú všetky príznaky rovnako, takže zápis hodnoty a jej spätné prečítanie s tým istým typom dá tú istú hodnotu. Na riadiacich jednotkách starších ako 2026.1 funkcie MODBUSW a MODBUSWNE pri Int32 a UInt32 príznak ByteSwap ignorovali.
  • Keď sa hodnota číta ako nezmysel, vyskúšajte varianty v ručných Modbus operáciách aplikácie, ktoré prepínajú dátový typ nad tými istými registrami.
  • V bajtovej kolekcii znamenajú príznaky namiesto toho poradie bajtov — pozrite Poradie bajtov v kolekciách.

Príklad

MODBUSR(H, 0x0100, LittleEndianFloat);
MODBUSR(A, 30, BigEndianUint32ByteSwap);

64-bitové dátové typy

Int64, UInt64 a Double zaberajú štyri registre; Int64 a UInt64 sa čítajú ako 64-bitové celé čísla, presne v celom rozsahu, pretože double drží celé čísla presne iba do 2^53.

Poznámky — 64-bitová hodnota si v bitových funkciách zachová všetkých 64 bitov, takže bity 32 až 63 alarmového slova sú dostupné.

Príklad — počítadlo energie vo 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. — keď sa skript ukladá pre staršiu riadiacu jednotku.

Dostupnosť — Core 2026.1, build 40595 alebo novší.

String

String číta text uložený po dvoch znakoch v registri, vyšší bajt prvý; počet registrov je štvrtý argument.

Poznámky

  • MODBUSR prečíta 0 až 123 registrov; text končí na prvom nulovom bajte. Každý bajt je jeden znak.
  • String sa dá iba čítať. MODBUSW ani PACKVALUE ho nezapíšu.

Príklad

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

Zápis hodnôt

MODBUSW, MODBUSWNE a PACKVALUE pred zápisom prevedú hodnotu na dátový typ.

  • Celočíselné typy zaokrúhľujú na najbližšie celé číslo; hodnota presne v polovici ide na párne číslo, takže 2.5 sa zapíše ako 2 a 3.5 ako 4.
  • Hodnota mimo rozsahu Int16, Uint16 alebo Float zastaví skript: Overflow when writing X as UInt16.
  • NaN sa dá zapísať iba do Float a Double. Zápis do celočíselného typu zastaví skript: RegisterValueToWrites: Can’t write double.NaN to modbus register (MODBUSW, MODBUSWNE) alebo PACKVALUE: Can’t write double.NaN to modbus register.
  • Bool zapíše 1 pre akúkoľvek hodnotu okrem 0. TRUE a FALSE sa dajú zapísať aj do číselných typov ako 1 a 0.

Príklad — požadovaná hodnota s jedným desatinným miestom

MODBUSW(H, 20, Int16, ROUND(Te * 10));

Pozrite aj — Funkcie Modbus, Skripty Modbus a prefetch, Binárne dáta.