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.
| |
| Name | Typ | Beschreibung |
|---|---|---|
collection | collection<uint16> oder collection<uint8> | Quelldaten. Ein Blob wird nicht akzeptiert. |
offset | Zahl | Position des Wertes ab 0 — in Registern für collection<uint16>, in Bytes für collection<uint8>. |
dataType | Modbus-Datentyp | Zum Beispiel Uint16, BigEndianFloat, LittleEndianUint32. |
length | Zahl | Erforderlich 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: 250collection<uint8> frame := BYTECOLLECTION("FA 00 00 00");
UNPACKVALUE(frame, 0, LittleEndianUint32);
# Result: 250Fehler — 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.
| |
Hinweise
- Die Sammlung wird direkt geändert; der Rückgabewert ist dieselbe Sammlung.
Stringwird 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 03Fehler — 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>.
| Flag | collection<uint16> (Register) | collection<uint8> (Bytes) |
|---|---|---|
BigEndian (Standard) | Höchstwertiges Register zuerst. | Höchstwertiges Byte zuerst. |
LittleEndian | Umgekehrte Reihenfolge der Register (Word-Swap); bei einem 16-Bit-Typ werden die beiden Bytes des Registers vertauscht. | Echtes Little-Endian: niedrigstwertiges Byte zuerst. |
ByteSwap | Die beiden Bytes in jedem Register werden vertauscht. | Die beiden Bytes jedes Paares werden vertauscht. |
| Datentyp | Register | Bytes |
|---|---|---|
Bool | 1 | 1 |
Int16, Uint16 | 1 | 2 |
Int32, UInt32, Float | 2 | 4 |
Int64, UInt64, Double | 4 | 8 |
Hinweise — In einer Bytesammlung kehrt LittleEndian bereits alle Bytes um, daher ändert ein zusätzliches ByteSwap nichts.
Siehe auch — Modbus-Datentypen, MODBUSRBLOCK, RECEIVEDBYTES.