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.
| |
| Naziv | Tip | Opis |
|---|---|---|
collection | collection<uint16> ili collection<uint8> | Izvorni podaci. Blob se ne prihvaća. |
offset | broj | Položaj vrijednosti, od 0 — u registrima za collection<uint16>, u bajtovima za collection<uint8>. |
dataType | tip podataka Modbus | Na primjer Uint16, BigEndianFloat, LittleEndianUint32. |
length | broj | Obavezno 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: 250collection<uint8> frame := BYTECOLLECTION("FA 00 00 00");
UNPACKVALUE(frame, 0, LittleEndianUint32);
# Result: 250Pogreš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.
| |
Napomene
- Zbirka se mijenja na mjestu; povratna vrijednost je ista zbirka.
Stringnije podržan.- Cjelobrojni tipovi zaokružuju vrijednost na cijeli broj. Vrijednost izvan raspona tipa ili
NaNupisan 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 03Pogreš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>.
| Zastavica | collection<uint16> (registri) | collection<uint8> (bajtovi) |
|---|---|---|
BigEndian (zadano) | Najznačajniji registar prvi. | Najznačajniji bajt prvi. |
LittleEndian | Obrnut redoslijed registara (zamjena riječi); kod 16-bitnog tipa zamijenjena su dva bajta registra. | Pravi little-endian: najmanje značajan bajt prvi. |
ByteSwap | Zamijenjena su dva bajta unutar svakog registra. | Zamijenjena su dva bajta svakog para. |
| Tip podataka | Registri | Bajtovi |
|---|---|---|
Bool | 1 | 1 |
Int16, Uint16 | 1 | 2 |
Int32, UInt32, Float | 2 | 4 |
Int64, UInt64, Double | 4 | 8 |
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.