TapHome

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.

1
2
UNPACKVALUE(collection, offset, dataType)
UNPACKVALUE(collection, offset, String, length)
NomeTipoDescrizione
collectioncollection<uint16> o collection<uint8>Dati di origine. Un blob non è accettato.
offsetnumeroPosizione del valore, da 0 — in registri per collection<uint16>, in byte per collection<uint8>.
dataTypetipo di dati ModbusAd esempio Uint16, BigEndianFloat, LittleEndianUint32.
lengthnumeroObbligatorio 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: 250
collection<uint8> frame := BYTECOLLECTION("FA 00 00 00");
UNPACKVALUE(frame, 0, LittleEndianUint32);
# Result: 250

Errori — 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.

1
PACKVALUE(collection, offset, dataType, value)

Note

  • La collezione viene modificata sul posto; il valore restituito è la stessa collezione.
  • String non è supportato.
  • I tipi interi arrotondano il valore a un numero intero. Un valore fuori dall’intervallo del tipo, oppure NaN scritto 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 03

Errori — 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>.

Flagcollection<uint16> (registri)collection<uint8> (byte)
BigEndian (predefinito)Prima il registro più significativo.Prima il byte più significativo.
LittleEndianOrdine 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.
ByteSwapI due byte all’interno di ogni registro vengono scambiati.I due byte di ogni coppia vengono scambiati.
Tipo di datiRegistriByte
Bool11
Int16, Uint1612
Int32, UInt32, Float24
Int64, UInt64, Double48

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.