Dane binarne
Funkcje skryptowe TapHome PACKVALUE i UNPACKVALUE — odczyt i zapis wartości z typem w kolekcjach rejestrów i bajtów, w kolejności big-endian, little-endian i z zamianą bajtów.
UNPACKVALUE i PACKVALUE przeliczają między wartościami z typem — liczbami całkowitymi, zmiennoprzecinkowymi, tekstem — a surowymi rejestrami lub bajtami kolekcji. Nie komunikują się z magistralą, więc działają w każdym skrypcie: na blokach rejestrów Modbus, na danych TCP i UDP w skrypcie listener modułu Packet parser lub w smart rule. Typ danych to jeden z typów danych Modbus. Obie funkcje wymagają Core 2026.1, kompilacji 39001 lub nowszej, oraz aplikacji w kompilacji 39016 lub nowszej.
UNPACKVALUE
UNPACKVALUE odczytuje jedną wartość z typem z kolekcji rejestrów (collection<uint16>) lub kolekcji bajtów (collection<uint8>) od podanego przesunięcia.
| |
| Nazwa | Typ | Opis |
|---|---|---|
collection | collection<uint16> lub collection<uint8> | Dane źródłowe. Blob nie jest akceptowany. |
offset | liczba | Pozycja wartości, od 0 — w rejestrach dla collection<uint16>, w bajtach dla collection<uint8>. |
dataType | typ danych Modbus | Na przykład Uint16, BigEndianFloat, LittleEndianUint32. |
length | liczba | Wymagany dla String: liczba rejestrów (po 2 znaki) lub bajtów (po 1 znaku). Tekst kończy się na pierwszym bajcie zerowym. |
Zwraca — liczbę; bool dla Bool; int64 lub uint64 dla 64-bitowych typów całkowitych; tekst dla String.
Uwagi — RECEIVEDMSG.PAYLOAD jest blobem i nie jest akceptowany. W skrypcie listener TCP lub UDP użyj RECEIVEDBYTES, który jest kolekcją bajtów, albo przekonwertuj tekst przez TOBYTES.
Przykład — wartości z jednego odczytu bloku 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);Przykład — liczba z odebranych bajtów
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: 250Błędy — 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 zapisuje jedną wartość z typem do kolekcji rejestrów lub bajtów od podanego przesunięcia i zwraca tę samą, zmienioną kolekcję.
| |
Uwagi
- Kolekcja jest zmieniana w miejscu; zwracana wartość to ta sama kolekcja.
Stringnie jest obsługiwany.- Typy całkowite zaokrąglają wartość do liczby całkowitej. Wartość spoza zakresu typu albo
NaNzapisane do typu całkowitego zatrzymuje skrypt.
Przykład — zbudowanie bloku rejestrów i zapis w jednej transakcji
collection<uint16> block := UINT16COLLECTION(4);
PACKVALUE(block, 0, BigEndianFloat, 21.5);
PACKVALUE(block, 2, Uint16, 100);
MODBUSWBLOCK(H, 200, block);Przykład — bajty dla polecenia TCP lub UDP
collection<uint8> frame := BYTECOLLECTION(4);
PACKVALUE(frame, 0, Uint16, 0x0102);
PACKVALUE(frame, 2, LittleEndianUint16, 0x0304);
SENDDATA(frame);
# frame is now 01 02 04 03Błędy — PACKVALUE: String data type is not supported; PACKVALUE: Can’t write double.NaN to modbus register; Overflow when writing X as UInt16.
Kolejność bajtów w kolekcjach
Te same nazwy typów danych opisują kolejność rejestrów w collection<uint16> i kolejność bajtów w collection<uint8>.
| Flaga | collection<uint16> (rejestry) | collection<uint8> (bajty) |
|---|---|---|
BigEndian (domyślnie) | Najbardziej znaczący rejestr pierwszy. | Najbardziej znaczący bajt pierwszy. |
LittleEndian | Odwrócona kolejność rejestrów (zamiana słów); dla typu 16-bitowego zamieniane są dwa bajty rejestru. | Prawdziwy little-endian: najmniej znaczący bajt pierwszy. |
ByteSwap | Zamieniane są dwa bajty wewnątrz każdego rejestru. | Zamieniane są dwa bajty każdej pary. |
| Typ danych | Rejestry | Bajty |
|---|---|---|
Bool | 1 | 1 |
Int16, Uint16 | 1 | 2 |
Int32, UInt32, Float | 2 | 4 |
Int64, UInt64, Double | 4 | 8 |
Uwagi — W kolekcji bajtów LittleEndian już odwraca wszystkie bajty, więc dodanie do niego ByteSwap niczego nie zmienia.
Zobacz też — Typy danych Modbus, MODBUSRBLOCK, RECEIVEDBYTES.