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ă.
| |
| Nume | Tip | Descriere |
|---|---|---|
collection | collection<uint16> sau collection<uint8> | Datele sursă. Un blob nu este acceptat. |
offset | număr | Poziția valorii, de la 0 — în registre pentru collection<uint16>, în octeți pentru collection<uint8>. |
dataType | tip de date Modbus | De exemplu Uint16, BigEndianFloat, LittleEndianUint32. |
length | număr | Obligatoriu 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: 250collection<uint8> frame := BYTECOLLECTION("FA 00 00 00");
UNPACKVALUE(frame, 0, LittleEndianUint32);
# Result: 250Erori — 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ă.
| |
Observații
- Colecția se modifică pe loc; valoarea returnată este aceeași colecție.
Stringnu este acceptat.- Tipurile întregi rotunjesc valoarea la un număr întreg. O valoare în afara intervalului tipului sau
NaNscris î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 03Erori — 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>.
| Indicator | collection<uint16> (registre) | collection<uint8> (octeți) |
|---|---|---|
BigEndian (implicit) | Registrul cel mai semnificativ primul. | Octetul cel mai semnificativ primul. |
LittleEndian | Ordinea 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. |
ByteSwap | Cei doi octeți din fiecare registru se inversează. | Cei doi octeți din fiecare pereche se inversează. |
| Tip de date | Registre | Octeți |
|---|---|---|
Bool | 1 | 1 |
Int16, Uint16 | 1 | 2 |
Int32, UInt32, Float | 2 | 4 |
Int64, UInt64, Double | 4 | 8 |
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.