Binární data
Funkce skriptu TapHome PACKVALUE a UNPACKVALUE — čtení a zápis typových hodnot v kolekcích registrů a bajtů s pořadím big-endian, little-endian a prohozením bajtů.
UNPACKVALUE a PACKVALUE převádějí mezi typovými hodnotami — celými čísly, čísly s plovoucí čárkou, textem — a surovými registry nebo bajty kolekce. Na sběrnici nesahají, takže fungují v každém skriptu: na blocích registrů Modbus, na datech TCP a UDP v listener skriptu modulu Packet parser nebo ve smart rule. Datový typ je jeden z datových typů Modbus. Obě funkce vyžadují Core 2026.1, build 39001 nebo novější, a aplikaci s buildem 39016 nebo novějším.
UNPACKVALUE
UNPACKVALUE přečte jednu typovou hodnotu z kolekce registrů (collection<uint16>) nebo z kolekce bajtů (collection<uint8>) na zadaném posunu.
| |
| Název | Typ | Popis |
|---|---|---|
collection | collection<uint16> nebo collection<uint8> | Zdrojová data. Blob se nepřijímá. |
offset | číslo | Pozice hodnoty od 0 — v registrech pro collection<uint16>, v bajtech pro collection<uint8>. |
dataType | datový typ Modbus | Například Uint16, BigEndianFloat, LittleEndianUint32. |
length | číslo | Povinný pro String: počet registrů (po 2 znacích) nebo bajtů (po 1 znaku). Text končí u prvního nulového bajtu. |
Vrací — číslo; bool pro Bool; int64 nebo uint64 pro 64bitové celočíselné typy; řetězec pro String.
Poznámky — RECEIVEDMSG.PAYLOAD je blob a nepřijímá se. V listener skriptu TCP nebo UDP použijte RECEIVEDBYTES, což je kolekce bajtů, nebo převeďte text přes TOBYTES.
Příklad — hodnoty z jednoho čtení bloku 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);Příklad — číslo z přijatých bajtů
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 typovou hodnotu do kolekce registrů nebo bajtů na zadaném posunu a vrátí tutéž, změněnou kolekci.
| |
Poznámky
- Kolekce se mění na místě; návratová hodnota je tatáž kolekce.
Stringnení podporován.- Celočíselné typy zaokrouhlí hodnotu na celé číslo. Hodnota mimo rozsah typu nebo
NaNzapsané do celočíselného typu zastaví skript.
Příklad — sestavení bloku registrů a zápis jednou transakcí
collection<uint16> block := UINT16COLLECTION(4);
PACKVALUE(block, 0, BigEndianFloat, 21.5);
PACKVALUE(block, 2, Uint16, 100);
MODBUSWBLOCK(H, 200, block);Příklad — bajty pro příkaz TCP nebo UDP
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.
Pořadí bajtů v kolekcích
Stejné názvy datových typů popisují pořadí registrů v collection<uint16> i pořadí bajtů v collection<uint8>.
| Příznak | collection<uint16> (registry) | collection<uint8> (bajty) |
|---|---|---|
BigEndian (výchozí) | Nejvýznamnější registr první. | Nejvýznamnější bajt první. |
LittleEndian | Obrácené pořadí registrů (prohození registrů); u 16bitového typu se prohodí dva bajty registru. | Skutečný little-endian: nejméně významný bajt první. |
ByteSwap | Prohodí se dva bajty uvnitř každého registru. | Prohodí se dva bajty každé dvojice. |
| Datový typ | Registry | Bajty |
|---|---|---|
Bool | 1 | 1 |
Int16, Uint16 | 1 | 2 |
Int32, UInt32, Float | 2 | 4 |
Int64, UInt64, Double | 4 | 8 |
Poznámky — V kolekci bajtů už LittleEndian obrátí všechny bajty, takže přidání ByteSwap nic nezmění.
Viz také — Datové typy Modbus, MODBUSRBLOCK, RECEIVEDBYTES.