TapHome

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.

1
2
UNPACKVALUE(collection, offset, dataType)
UNPACKVALUE(collection, offset, String, length)
NázevTypPopis
collectioncollection<uint16> nebo collection<uint8>Zdrojová data. Blob se nepřijímá.
offsetčísloPozice hodnoty od 0 — v registrech pro collection<uint16>, v bajtech pro collection<uint8>.
dataTypedatový typ ModbusNapříklad Uint16, BigEndianFloat, LittleEndianUint32.
lengthčísloPovinný 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: 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 typovou hodnotu do kolekce registrů nebo bajtů na zadaném posunu a vrátí tutéž, změněnou kolekci.

1
PACKVALUE(collection, offset, dataType, value)

Poznámky

  • Kolekce se mění na místě; návratová hodnota je tatáž kolekce.
  • String není podporován.
  • Celočíselné typy zaokrouhlí hodnotu na celé číslo. Hodnota mimo rozsah typu nebo NaN zapsané 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 03

Chyby — 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říznakcollection<uint16> (registry)collection<uint8> (bajty)
BigEndian (výchozí)Nejvýznamnější registr první.Nejvýznamnější bajt první.
LittleEndianObrá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í.
ByteSwapProhodí se dva bajty uvnitř každého registru.Prohodí se dva bajty každé dvojice.
Datový typRegistryBajty
Bool11
Int16, Uint1612
Int32, UInt32, Float24
Int64, UInt64, Double48

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.