TapHome

Binärdaten

Die TapHome-Skriptfunktionen PACKVALUE und UNPACKVALUE — typisierte Werte in Register- und Bytesammlungen lesen und schreiben, mit der Reihenfolge Big-Endian, Little-Endian und Byte-Swap.

UNPACKVALUE und PACKVALUE wandeln zwischen typisierten Werten — Ganzzahlen, Gleitkommazahlen, Text — und den rohen Registern oder Bytes einer Sammlung um. Sie greifen nicht auf den Bus zu und funktionieren daher in jedem Skript: auf Modbus-Registerblöcken, auf TCP- und UDP-Nutzdaten in einem Listener-Skript des Packet Parsers oder in einer smart rule. Der Datentyp ist einer der Modbus-Datentypen. Beide Funktionen erfordern Core 2026.1, Build 39001 oder neuer, und eine App ab Build 39016.

UNPACKVALUE

UNPACKVALUE liest einen typisierten Wert aus einer Registersammlung (collection<uint16>) oder einer Bytesammlung (collection<uint8>) am angegebenen Offset.

1
2
UNPACKVALUE(collection, offset, dataType)
UNPACKVALUE(collection, offset, String, length)
NameTypBeschreibung
collectioncollection<uint16> oder collection<uint8>Quelldaten. Ein Blob wird nicht akzeptiert.
offsetZahlPosition des Wertes ab 0 — in Registern für collection<uint16>, in Bytes für collection<uint8>.
dataTypeModbus-DatentypZum Beispiel Uint16, BigEndianFloat, LittleEndianUint32.
lengthZahlErforderlich für String: Anzahl der Register (je 2 Zeichen) oder Bytes (je 1 Zeichen). Der Text endet am ersten Nullbyte.

Rückgabewert — eine Zahl; bool für Bool; int64 oder uint64 für die 64-Bit-Ganzzahltypen; ein String für String.

Hinweise — RECEIVEDMSG.PAYLOAD ist ein Blob und wird nicht akzeptiert. Verwenden Sie in einem TCP- oder UDP-Listener-Skript RECEIVEDBYTES, das eine Bytesammlung ist, oder wandeln Sie Text mit TOBYTES um.

Beispiel — Werte aus einem einzigen Modbus-Blocklesevorgang

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);

Beispiel — eine Zahl aus empfangenen Bytes

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

Fehler — 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 schreibt einen typisierten Wert am angegebenen Offset in eine Register- oder Bytesammlung und gibt dieselbe, geänderte Sammlung zurück.

1
PACKVALUE(collection, offset, dataType, value)

Hinweise

  • Die Sammlung wird direkt geändert; der Rückgabewert ist dieselbe Sammlung.
  • String wird nicht unterstützt.
  • Ganzzahltypen runden den Wert auf eine ganze Zahl. Ein Wert außerhalb des Bereichs des Typs oder NaN, das in einen Ganzzahltyp geschrieben wird, hält das Skript an.

Beispiel — einen Registerblock bauen und in einer Transaktion schreiben

collection<uint16> block := UINT16COLLECTION(4);
PACKVALUE(block, 0, BigEndianFloat, 21.5);
PACKVALUE(block, 2, Uint16, 100);
MODBUSWBLOCK(H, 200, block);

Beispiel — Bytes für einen TCP- oder UDP-Befehl

collection<uint8> frame := BYTECOLLECTION(4);
PACKVALUE(frame, 0, Uint16, 0x0102);
PACKVALUE(frame, 2, LittleEndianUint16, 0x0304);
SENDDATA(frame);
# frame is now 01 02 04 03

Fehler — PACKVALUE: String data type is not supported; PACKVALUE: Can’t write double.NaN to modbus register; Overflow when writing X as UInt16.

Bytereihenfolge in Sammlungen

Dieselben Namen der Datentypen beschreiben die Reihenfolge der Register in einer collection<uint16> und die Reihenfolge der Bytes in einer collection<uint8>.

Flagcollection<uint16> (Register)collection<uint8> (Bytes)
BigEndian (Standard)Höchstwertiges Register zuerst.Höchstwertiges Byte zuerst.
LittleEndianUmgekehrte Reihenfolge der Register (Word-Swap); bei einem 16-Bit-Typ werden die beiden Bytes des Registers vertauscht.Echtes Little-Endian: niedrigstwertiges Byte zuerst.
ByteSwapDie beiden Bytes in jedem Register werden vertauscht.Die beiden Bytes jedes Paares werden vertauscht.
DatentypRegisterBytes
Bool11
Int16, Uint1612
Int32, UInt32, Float24
Int64, UInt64, Double48

Hinweise — In einer Bytesammlung kehrt LittleEndian bereits alle Bytes um, daher ändert ein zusätzliches ByteSwap nichts.

Siehe auch — Modbus-Datentypen, MODBUSRBLOCK, RECEIVEDBYTES.