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.
| |
| Názov | Typ | Popis |
|---|---|---|
collection | collection<uint16> alebo collection<uint8> | Zdrojové dáta. Blob sa neprijíma. |
offset | číslo | Pozícia hodnoty od 0 — v registroch pre collection<uint16>, v bajtoch pre collection<uint8>. |
dataType | dátový typ Modbus | Napríklad Uint16, BigEndianFloat, LittleEndianUint32. |
length | číslo | Povinné 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: 250collection<uint8> frame := BYTECOLLECTION("FA 00 00 00");
UNPACKVALUE(frame, 0, LittleEndianUint32);
# Result: 250Chyby — 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.
| |
Poznámky
- Kolekcia sa mení priamo; návratová hodnota je tá istá kolekcia.
Stringnie je podporovaný.- Celočíselné typy zaokrúhlia hodnotu na celé číslo. Hodnota mimo rozsahu typu aj zápis
NaNdo 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 03Chyby — 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íznak | collection<uint16> (registre) | collection<uint8> (bajty) |
|---|---|---|
BigEndian (predvolené) | Najvýznamnejší register je prvý. | Najvýznamnejší bajt je prvý. |
LittleEndian | Obrá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ý. |
ByteSwap | Dva bajty v každom registri sa vymenia. | Dva bajty v každej dvojici sa vymenia. |
| Dátový typ | Registre | Bajty |
|---|---|---|
Bool | 1 | 1 |
Int16, Uint16 | 1 | 2 |
Int32, UInt32, Float | 2 | 4 |
Int64, UInt64, Double | 4 | 8 |
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.