TapHome

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.

1
2
UNPACKVALUE(collection, offset, dataType)
UNPACKVALUE(collection, offset, String, length)
NévTípusLeírás
collectioncollection<uint16> vagy collection<uint8>Forrásadatok. Blobot nem fogad el.
offsetszámAz érték pozíciója 0-tól — collection<uint16> esetén regiszterekben, collection<uint8> esetén bájtokban.
dataTypeModbus adattípusPéldául Uint16, BigEndianFloat, LittleEndianUint32.
lengthszámString 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: 250
collection<uint8> frame := BYTECOLLECTION("FA 00 00 00");
UNPACKVALUE(frame, 0, LittleEndianUint32);
# Result: 250

Hibá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.

1
PACKVALUE(collection, offset, dataType, value)

Megjegyzések

  • A gyűjtemény helyben módosul; a visszatérési érték ugyanaz a gyűjtemény.
  • A String nem 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 NaN leá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 03

Hibá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.
LittleEndianFordí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.
ByteSwapMinden regiszteren belül felcserélődik a két bájt.Minden bájtpár két bájtja felcserélődik.
AdattípusRegiszterekBájtok
Bool11
Int16, Uint1612
Int32, UInt32, Float24
Int64, UInt64, Double48

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.