Bináris adatok
PACKVALUE és UNPACKVALUE TapHome szkriptfüggvények — típusos értékek olvasása és írása regiszter- és bájtgyűjteményekben, big-endian, little-endian és bájtcserés sorrendben.
Az UNPACKVALUE és a PACKVALUE a típusos értékek — egész számok, lebegőpontos számok, szöveg — és egy gyűjtemény nyers regiszterei vagy bájtjai között alakít át. A buszhoz nem nyúlnak, ezért minden szkriptben működnek: Modbus regiszterblokkokon, TCP és UDP tartalmakon egy Packet parser listener szkriptben, vagy egy smart rule-ban. Az adattípus a Modbus adattípusok egyike. Mindkét függvény Core 2026.1, build 39001 vagy újabb verziót és 39016-os vagy újabb buildszámú alkalmazást igényel.
UNPACKVALUE
Az UNPACKVALUE egy típusos értéket olvas ki egy regisztergyűjteményből (collection<uint16>) vagy egy bájtgyűjteményből (collection<uint8>) a megadott eltolásnál.
| |
| Név | Típus | Leírás |
|---|---|---|
collection | collection<uint16> vagy collection<uint8> | Forrásadatok. Blobot nem fogad el. |
offset | szám | Az érték pozíciója 0-tól — collection<uint16> esetén regiszterekben, collection<uint8> esetén bájtokban. |
dataType | Modbus adattípus | Például Uint16, BigEndianFloat, LittleEndianUint32. |
length | szám | String esetén kötelező: a regiszterek (egyenként 2 karakter) vagy bájtok (egyenként 1 karakter) száma. A szöveg az első nulla bájtnál ér véget. |
Visszatérési érték — szám; Bool esetén bool; a 64 bites egész típusoknál int64 vagy uint64; String esetén szöveg.
Megjegyzések — A RECEIVEDMSG.PAYLOAD blob, ezért nem elfogadott. TCP vagy UDP listener szkriptben használd a RECEIVEDBYTES értéket, amely bájtgyűjtemény, vagy alakítsd át a szöveget a TOBYTES függvénnyel.
Példa — értékek egyetlen Modbus blokkolvasásból
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élda — szám a fogadott bájtokból
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: 250Hibák — 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
A PACKVALUE egy típusos értéket ír egy regiszter- vagy bájtgyűjteménybe a megadott eltolásnál, és ugyanazt, a módosított gyűjteményt adja vissza.
| |
Megjegyzések
- A gyűjtemény helyben módosul; a visszatérési érték ugyanaz a gyűjtemény.
- A
Stringnem támogatott. - Az egész típusok egész számra kerekítik az értéket. A típus tartományán kívüli érték, vagy egész típusba írt
NaNleállítja a szkriptet.
Példa — regiszterblokk összeállítása és írása egyetlen tranzakcióban
collection<uint16> block := UINT16COLLECTION(4);
PACKVALUE(block, 0, BigEndianFloat, 21.5);
PACKVALUE(block, 2, Uint16, 100);
MODBUSWBLOCK(H, 200, block);Példa — bájtok TCP vagy UDP parancshoz
collection<uint8> frame := BYTECOLLECTION(4);
PACKVALUE(frame, 0, Uint16, 0x0102);
PACKVALUE(frame, 2, LittleEndianUint16, 0x0304);
SENDDATA(frame);
# frame is now 01 02 04 03Hibák — PACKVALUE: String data type is not supported; PACKVALUE: Can’t write double.NaN to modbus register; Overflow when writing X as UInt16.
Bájtsorrend a gyűjteményekben
Ugyanazok az adattípusnevek írják le a regiszterek sorrendjét egy collection<uint16> gyűjteményben és a bájtok sorrendjét egy collection<uint8> gyűjteményben.
| Jelző | collection<uint16> (regiszterek) | collection<uint8> (bájtok) |
|---|---|---|
BigEndian (alapértelmezett) | A legnagyobb helyiértékű regiszter elöl. | A legnagyobb helyiértékű bájt elöl. |
LittleEndian | Fordított regisztersorrend (szócsere); 16 bites típusnál a regiszter két bájtja felcserélődik. | Valódi little-endian: a legkisebb helyiértékű bájt elöl. |
ByteSwap | Minden regiszteren belül felcserélődik a két bájt. | Minden bájtpár két bájtja felcserélődik. |
| Adattípus | Regiszterek | Bájtok |
|---|---|---|
Bool | 1 | 1 |
Int16, Uint16 | 1 | 2 |
Int32, UInt32, Float | 2 | 4 |
Int64, UInt64, Double | 4 | 8 |
Megjegyzések — Bájtgyűjteményben a LittleEndian már az összes bájtot megfordítja, így a ByteSwap hozzáadása semmit sem változtat.
Lásd még — Modbus adattípusok, MODBUSRBLOCK, RECEIVEDBYTES.