TapHome

Binarni podaci

Funkcije PACKVALUE i UNPACKVALUE u skripti TapHome — čitanje i zapis vrijednosti s tipom u zbirkama registara i bajtova, s redoslijedom big-endian, little-endian i zamjenom bajtova.

UNPACKVALUE i PACKVALUE pretvaraju između vrijednosti s tipom — cijelih brojeva, decimalnih brojeva, teksta — i sirovih registara ili bajtova zbirke. Ne pristupaju sabirnici, pa rade u svakoj skripti: nad blokovima registara Modbus, nad sadržajem poruka TCP i UDP u listener skripti Packet parsera ili u smart rule. Tip podataka je jedan od tipova podataka Modbus. Obje funkcije zahtijevaju Core 2026.1, build 39001 ili noviji, i aplikaciju s buildom 39016 ili novijim.

UNPACKVALUE

UNPACKVALUE čita jednu vrijednost s tipom iz zbirke registara (collection<uint16>) ili zbirke bajtova (collection<uint8>) na zadanom pomaku.

1
2
UNPACKVALUE(collection, offset, dataType)
UNPACKVALUE(collection, offset, String, length)
NazivTipOpis
collectioncollection<uint16> ili collection<uint8>Izvorni podaci. Blob se ne prihvaća.
offsetbrojPoložaj vrijednosti, od 0 — u registrima za collection<uint16>, u bajtovima za collection<uint8>.
dataTypetip podataka ModbusNa primjer Uint16, BigEndianFloat, LittleEndianUint32.
lengthbrojObavezno za String: broj registara (po 2 znaka) ili bajtova (po 1 znak). Tekst završava na prvom nultom bajtu.

Vraća — broj; bool za Bool; int64 ili uint64 za 64-bitne cjelobrojne tipove; string za String.

Napomene — RECEIVEDMSG.PAYLOAD je blob i ne prihvaća se. U listener skripti za TCP ili UDP koristite RECEIVEDBYTES, koji je zbirka bajtova, ili tekst pretvorite funkcijom TOBYTES.

Primjer — vrijednosti iz jednog čitanja bloka 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);

Primjer — broj iz primljenih bajtova

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

Pogreške — 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 upisuje jednu vrijednost s tipom u zbirku registara ili bajtova na zadanom pomaku i vraća istu, izmijenjenu zbirku.

1
PACKVALUE(collection, offset, dataType, value)

Napomene

  • Zbirka se mijenja na mjestu; povratna vrijednost je ista zbirka.
  • String nije podržan.
  • Cjelobrojni tipovi zaokružuju vrijednost na cijeli broj. Vrijednost izvan raspona tipa ili NaN upisan u cjelobrojni tip zaustavlja skriptu.

Primjer — sastavljanje bloka registara i zapis u jednoj transakciji

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

Primjer — bajtovi za naredbu TCP ili 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

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

Redoslijed bajtova u zbirkama

Isti nazivi tipova podataka opisuju redoslijed registara u collection<uint16> i redoslijed bajtova u collection<uint8>.

Zastavicacollection<uint16> (registri)collection<uint8> (bajtovi)
BigEndian (zadano)Najznačajniji registar prvi.Najznačajniji bajt prvi.
LittleEndianObrnut redoslijed registara (zamjena riječi); kod 16-bitnog tipa zamijenjena su dva bajta registra.Pravi little-endian: najmanje značajan bajt prvi.
ByteSwapZamijenjena su dva bajta unutar svakog registra.Zamijenjena su dva bajta svakog para.
Tip podatakaRegistriBajtovi
Bool11
Int16, Uint1612
Int32, UInt32, Float24
Int64, UInt64, Double48

Napomene — U zbirci bajtova LittleEndian već obrće sve bajtove, pa dodavanje ByteSwap ne mijenja ništa.

Vidi također — Tipovi podataka Modbus, MODBUSRBLOCK, RECEIVEDBYTES.