Dati binari
Funzioni degli script TapHome PACKVALUE e UNPACKVALUE — leggere e scrivere valori tipizzati in collezioni di registri e di byte, con ordine big-endian, little-endian e byte swap.
UNPACKVALUE e PACKVALUE convertono tra valori tipizzati — interi, float, testo — e i registri o i byte grezzi di una collezione. Non accedono al bus, quindi funzionano in ogni script: su blocchi di registri Modbus, su payload TCP e UDP in uno script listener del Packet parser o in una smart rule. Il tipo di dati è uno dei tipi di dati Modbus. Entrambe le funzioni richiedono Core 2026.1, build 39001 o più recente, e un’app di build 39016 o più recente.
UNPACKVALUE
UNPACKVALUE legge un valore tipizzato da una collezione di registri (collection<uint16>) o da una collezione di byte (collection<uint8>) all’offset indicato.
| |
| Nome | Tipo | Descrizione |
|---|---|---|
collection | collection<uint16> o collection<uint8> | Dati di origine. Un blob non è accettato. |
offset | numero | Posizione del valore, da 0 — in registri per collection<uint16>, in byte per collection<uint8>. |
dataType | tipo di dati Modbus | Ad esempio Uint16, BigEndianFloat, LittleEndianUint32. |
length | numero | Obbligatorio per String: numero di registri (2 caratteri ciascuno) o di byte (1 carattere ciascuno). Il testo termina al primo byte zero. |
Valore restituito — un numero; bool per Bool; int64 o uint64 per i tipi interi a 64 bit; una stringa per String.
Note — RECEIVEDMSG.PAYLOAD è un blob e non è accettato. In uno script listener TCP o UDP usa RECEIVEDBYTES, che è una collezione di byte, oppure converti il testo con TOBYTES.
Esempio — valori da un’unica lettura a blocco 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);Esempio — un numero dai byte ricevuti
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: 250Errori — 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 scrive un valore tipizzato in una collezione di registri o di byte all’offset indicato e restituisce la stessa collezione modificata.
| |
Note
- La collezione viene modificata sul posto; il valore restituito è la stessa collezione.
Stringnon è supportato.- I tipi interi arrotondano il valore a un numero intero. Un valore fuori dall’intervallo del tipo, oppure
NaNscritto in un tipo intero, interrompe lo script.
Esempio — costruire un blocco di registri e scriverlo in un’unica transazione
collection<uint16> block := UINT16COLLECTION(4);
PACKVALUE(block, 0, BigEndianFloat, 21.5);
PACKVALUE(block, 2, Uint16, 100);
MODBUSWBLOCK(H, 200, block);Esempio — byte per un comando TCP o UDP
collection<uint8> frame := BYTECOLLECTION(4);
PACKVALUE(frame, 0, Uint16, 0x0102);
PACKVALUE(frame, 2, LittleEndianUint16, 0x0304);
SENDDATA(frame);
# frame is now 01 02 04 03Errori — PACKVALUE: String data type is not supported; PACKVALUE: Can’t write double.NaN to modbus register; Overflow when writing X as UInt16.
Ordine dei byte nelle collezioni
Gli stessi nomi dei tipi di dati descrivono l’ordine dei registri in una collection<uint16> e l’ordine dei byte in una collection<uint8>.
| Flag | collection<uint16> (registri) | collection<uint8> (byte) |
|---|---|---|
BigEndian (predefinito) | Prima il registro più significativo. | Prima il byte più significativo. |
LittleEndian | Ordine dei registri invertito (word swap); per un tipo a 16 bit i due byte del registro vengono scambiati. | Vero little-endian: prima il byte meno significativo. |
ByteSwap | I due byte all’interno di ogni registro vengono scambiati. | I due byte di ogni coppia vengono scambiati. |
| Tipo di dati | Registri | Byte |
|---|---|---|
Bool | 1 | 1 |
Int16, Uint16 | 1 | 2 |
Int32, UInt32, Float | 2 | 4 |
Int64, UInt64, Double | 4 | 8 |
Note — In una collezione di byte LittleEndian inverte già tutti i byte, quindi aggiungervi ByteSwap non cambia nulla.
Vedi anche — Tipi di dati Modbus, MODBUSRBLOCK, RECEIVEDBYTES.