TapHome

Binárne dáta

Funkcie skriptu TapHome PACKVALUE a UNPACKVALUE — čítanie a zápis typovaných hodnôt v kolekciách registrov a bajtov, s poradím big-endian, little-endian a byte swap.

UNPACKVALUE a PACKVALUE prevádzajú medzi typovanými hodnotami — celými číslami, desatinnými číslami (float), textom — a surovými registrami alebo bajtmi kolekcie. Nekomunikujú so zbernicou, takže fungujú v každom skripte: nad blokmi Modbus registrov, nad TCP a UDP dátami v listener skripte Packet parsera aj v smart rule. Dátový typ je jeden z dátových typov Modbus. Obe funkcie potrebujú Core 2026.1, build 39001 alebo novší, a aplikáciu s buildom 39016 alebo novším.

UNPACKVALUE

UNPACKVALUE prečíta jednu typovanú hodnotu z kolekcie registrov (collection<uint16>) alebo z bajtovej kolekcie (collection<uint8>) na zadanej pozícii.

1
2
UNPACKVALUE(collection, offset, dataType)
UNPACKVALUE(collection, offset, String, length)
NázovTypPopis
collectioncollection<uint16> alebo collection<uint8>Zdrojové dáta. Blob sa neprijíma.
offsetčísloPozícia hodnoty od 0 — v registroch pre collection<uint16>, v bajtoch pre collection<uint8>.
dataTypedátový typ ModbusNapríklad Uint16, BigEndianFloat, LittleEndianUint32.
lengthčísloPovinné pre String: počet registrov (po 2 znaky) alebo bajtov (po 1 znaku). Text končí na prvom nulovom bajte.

Návratová hodnota — číslo; bool pre Bool; int64 alebo uint64 pre 64-bitové celočíselné typy; reťazec pre String.

Poznámky — RECEIVEDMSG.PAYLOAD je blob a neprijíma sa. V TCP alebo UDP listener skripte použite RECEIVEDBYTES, ktorý je bajtovou kolekciou, alebo text preveďte funkciou TOBYTES.

Príklad — hodnoty z jedného blokového čítania Modbus

collection<uint16> data := MODBUSRBLOCK(H, 100, 4);
VAR power := UNPACKVALUE(data, 0, BigEndianFloat);
VAR state := UNPACKVALUE(data, 2, Uint16);
VAR name := UNPACKVALUE(data, 0, String, 2);

Príklad — číslo z prijatých bajtov

collection<uint8> frame := BYTECOLLECTION("01 02 00 FA");
UNPACKVALUE(frame, 2, Uint16);
# Result: 250
collection<uint8> frame := BYTECOLLECTION("FA 00 00 00");
UNPACKVALUE(frame, 0, LittleEndianUint32);
# Result: 250

Chyby — UNPACKVALUE: offset N + M element(s) exceeds collection length L; UNPACKVALUE: parameter 1 must be a Collection<UInt16> or Collection<UInt8>; UNPACKVALUE: String data type must have specified length - number of registers to read.

PACKVALUE

PACKVALUE zapíše jednu typovanú hodnotu do kolekcie registrov alebo bajtov na zadanú pozíciu a vráti tú istú, zmenenú kolekciu.

1
PACKVALUE(collection, offset, dataType, value)

Poznámky

  • Kolekcia sa mení priamo; návratová hodnota je tá istá kolekcia.
  • String nie je podporovaný.
  • Celočíselné typy zaokrúhlia hodnotu na celé číslo. Hodnota mimo rozsahu typu aj zápis NaN do celočíselného typu zastaví skript.

Príklad — zostavenie bloku registrov a zápis jednou transakciou

collection<uint16> block := UINT16COLLECTION(4);
PACKVALUE(block, 0, BigEndianFloat, 21.5);
PACKVALUE(block, 2, Uint16, 100);
MODBUSWBLOCK(H, 200, block);

Príklad — bajty pre TCP alebo UDP príkaz

collection<uint8> frame := BYTECOLLECTION(4);
PACKVALUE(frame, 0, Uint16, 0x0102);
PACKVALUE(frame, 2, LittleEndianUint16, 0x0304);
SENDDATA(frame);
# frame is now 01 02 04 03

Chyby — PACKVALUE: String data type is not supported; PACKVALUE: Can’t write double.NaN to modbus register; Overflow when writing X as UInt16.

Poradie bajtov v kolekciách

Tie isté názvy dátových typov opisujú poradie registrov v collection<uint16> aj poradie bajtov v collection<uint8>.

Príznakcollection<uint16> (registre)collection<uint8> (bajty)
BigEndian (predvolené)Najvýznamnejší register je prvý.Najvýznamnejší bajt je prvý.
LittleEndianObrátené poradie registrov (word swap); pri 16-bitovom type sa vymenia dva bajty registra.Skutočné little-endian poradie: najmenej významný bajt je prvý.
ByteSwapDva bajty v každom registri sa vymenia.Dva bajty v každej dvojici sa vymenia.
Dátový typRegistreBajty
Bool11
Int16, Uint1612
Int32, UInt32, Float24
Int64, UInt64, Double48

Poznámky — V bajtovej kolekcii už LittleEndian obráti všetky bajty, takže pridanie ByteSwap nič nezmení.

Pozrite aj — Dátové typy Modbus, MODBUSRBLOCK, RECEIVEDBYTES.