TapHome

Date binare

Funcțiile de script TapHome PACKVALUE și UNPACKVALUE — citirea și scrierea valorilor cu tip în colecții de registre și de octeți, cu ordinea big-endian, little-endian și inversarea octeților.

UNPACKVALUE și PACKVALUE convertesc între valori cu tip — numere întregi, numere zecimale, text — și registrele sau octeții bruți ai unei colecții. Nu accesează magistrala, așa că funcționează în orice script: pe blocuri de registre Modbus, pe datele TCP și UDP dintr-un script listener Packet parser sau într-o smart rule. Tipul de date este unul dintre tipurile de date Modbus. Ambele funcții necesită Core 2026.1, build 39001 sau mai nou, și o aplicație cu build 39016 sau mai nou.

UNPACKVALUE

UNPACKVALUE citește o valoare cu tip dintr-o colecție de registre (collection<uint16>) sau dintr-o colecție de octeți (collection<uint8>) de la poziția dată.

1
2
UNPACKVALUE(collection, offset, dataType)
UNPACKVALUE(collection, offset, String, length)
NumeTipDescriere
collectioncollection<uint16> sau collection<uint8>Datele sursă. Un blob nu este acceptat.
offsetnumărPoziția valorii, de la 0 — în registre pentru collection<uint16>, în octeți pentru collection<uint8>.
dataTypetip de date ModbusDe exemplu Uint16, BigEndianFloat, LittleEndianUint32.
lengthnumărObligatoriu pentru String: numărul de registre (câte 2 caractere) sau de octeți (câte 1 caracter). Textul se termină la primul octet zero.

Returnează — un număr; bool pentru Bool; int64 sau uint64 pentru tipurile întregi pe 64 de biți; un șir de caractere pentru String.

Observații — RECEIVEDMSG.PAYLOAD este un blob și nu este acceptat. Într-un script listener TCP sau UDP folosiți RECEIVEDBYTES, care este o colecție de octeți, sau convertiți textul cu TOBYTES.

Exemplu — valori dintr-o singură citire de bloc 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);

Exemplu — un număr din octeții primiți

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

Erori — 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 scrie o valoare cu tip într-o colecție de registre sau de octeți la poziția dată și returnează aceeași colecție, modificată.

1
PACKVALUE(collection, offset, dataType, value)

Observații

  • Colecția se modifică pe loc; valoarea returnată este aceeași colecție.
  • String nu este acceptat.
  • Tipurile întregi rotunjesc valoarea la un număr întreg. O valoare în afara intervalului tipului sau NaN scris într-un tip întreg oprește scriptul.

Exemplu — construirea unui bloc de registre și scrierea lui într-o singură tranzacție

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

Exemplu — octeți pentru o comandă TCP sau 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

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

Ordinea octeților în colecții

Aceleași nume de tipuri de date descriu ordinea registrelor într-o collection<uint16> și ordinea octeților într-o collection<uint8>.

Indicatorcollection<uint16> (registre)collection<uint8> (octeți)
BigEndian (implicit)Registrul cel mai semnificativ primul.Octetul cel mai semnificativ primul.
LittleEndianOrdinea registrelor inversată (word swap); la un tip pe 16 biți se inversează cei doi octeți ai registrului.Little-endian adevărat: octetul cel mai puțin semnificativ primul.
ByteSwapCei doi octeți din fiecare registru se inversează.Cei doi octeți din fiecare pereche se inversează.
Tip de dateRegistreOcteți
Bool11
Int16, Uint1612
Int32, UInt32, Float24
Int64, UInt64, Double48

Observații — Într-o colecție de octeți LittleEndian inversează deja toți octeții, așa că adăugarea lui ByteSwap nu schimbă nimic.

Consultați și — Tipuri de date Modbus, MODBUSRBLOCK, RECEIVEDBYTES.