TapHome

Tipuri de date Modbus

Tipurile de date Modbus din scripturile TapHome — Int16, Uint16, Int32, UInt32, Float, Bool, String și tipurile pe 64 de biți Int64, UInt64 și Double — cu variantele big-endian, little-endian și byte-swap.

Tipul de date este al treilea argument al funcțiilor MODBUSR, MODBUSW și MODBUSWNE și al funcțiilor UNPACKVALUE și PACKVALUE. El decide câte registre de 16 biți ocupă o valoare și în ce ordine sunt stocați octeții ei. Numele tipurilor de date nu țin cont de majuscule și minuscule.

Tipuri de date de bază

Fiecare tip de date de bază ocupă un număr fix de registre de 16 biți și dă scriptului o valoare de un tip fix.

TipRegistreIntervalValoarea în script
Bool10 = FALSE, orice altceva TRUEbool
Int161−32 768 … 32 767număr
Uint1610 … 65 535număr
Int322−2 147 483 648 … 2 147 483 647număr
UInt3220 … 4 294 967 295număr
Float2IEEE 754 simplă precizienumăr
Int64, UInt644numere întregi pe 64 de bițiint64, uint64
Double4IEEE 754 dublă precizienumăr
String1 – 1232 caractere per registrușir de caractere

Multe dispozitive stochează o valoare zecimală ca număr întreg cu o scară fixă — împărțiți-o după citire, de exemplu MODBUSR(H, 20, Int16) / 10. Valorile codificate BCD se convertesc cu FROMBCD.

Variante ale ordinii octeților

Fiecare tip există într-o variantă big-endian și una little-endian; tipurile pe 32 și 64 de biți și în variante byte-swap.

1
2
3
4
5
6
7
8
BigEndianInt16      LittleEndianInt16
BigEndianUint16     LittleEndianUint16
BigEndianInt32      LittleEndianInt32       BigEndianInt32ByteSwap      LittleEndianInt32ByteSwap
BigEndianUint32     LittleEndianUint32      BigEndianUint32ByteSwap     LittleEndianUint32ByteSwap
BigEndianFloat      LittleEndianFloat       BigEndianFloatByteSwap      LittleEndianFloatByteSwap
BigEndianInt64      LittleEndianInt64       BigEndianInt64ByteSwap      LittleEndianInt64ByteSwap
BigEndianUint64     LittleEndianUint64      BigEndianUint64ByteSwap     LittleEndianUint64ByteSwap
BigEndianDouble     LittleEndianDouble      BigEndianDoubleByteSwap     LittleEndianDoubleByteSwap
IndicatorSemnificație pentru registre
BigEndianRegistrul cel mai semnificativ este primul. Aceasta este varianta implicită: Int32 este BigEndianInt32.
LittleEndianOrdinea registrelor este inversată (word swap). La un tip pe 16 biți, care are un singur registru, se inversează cei doi octeți din el.
ByteSwapCei doi octeți din fiecare registru se inversează.

Observații

  • Citirile și scrierile aplică toți indicatorii la fel, așa că o valoare scrisă și citită înapoi cu același tip dă aceeași valoare. Pe Core mai vechi decât 2026.1, MODBUSW și MODBUSWNE ignorau ByteSwap pentru Int32 și UInt32.
  • Când o valoare se citește fără sens, încercați variantele în operațiile Modbus manuale din aplicație, care schimbă tipul de date peste aceleași registre.
  • Într-o colecție de octeți indicatorii înseamnă în schimb ordinea octeților — consultați Ordinea octeților în colecții.

Exemplu

MODBUSR(H, 0x0100, LittleEndianFloat);
MODBUSR(A, 30, BigEndianUint32ByteSwap);

Tipuri de date pe 64 de biți

Int64, UInt64 și Double ocupă patru registre; Int64 și UInt64 se citesc ca numere întregi pe 64 de biți, exacte pe tot intervalul, deoarece un double reține exact numerele întregi doar până la 2^53.

Observații — O valoare pe 64 de biți își păstrează toți cei 64 de biți în funcțiile pe biți, așa că biții 32 până la 63 ai unui cuvânt de alarmă sunt accesibili.

Exemplu — contor de energie în Wh, afișat în kWh

VAR energy := MODBUSR(H, 100, UInt64);
energy / 1000;

Erori — Modbus data type ‘X’ not supported. Please update your core unit to be able to use this feature. — când scriptul se salvează pentru un Core mai vechi.

Disponibilitate — Core 2026.1, build 40595 sau mai nou.

String

String citește text stocat câte două caractere per registru, octetul superior primul; numărul de registre este al patrulea argument.

Observații

  • MODBUSR citește 0 până la 123 de registre; textul se termină la primul octet zero. Fiecare octet este un caracter.
  • String se poate doar citi. MODBUSW și PACKVALUE nu îl scriu.

Exemplu

MODBUSR(H, 14, String, 4);
# Result: text of up to 8 characters, for example a serial number

Scrierea valorilor

MODBUSW, MODBUSWNE și PACKVALUE convertesc valoarea în tipul de date înainte de scriere.

  • Tipurile întregi rotunjesc la cel mai apropiat număr întreg; o valoare aflată exact la jumătate merge spre numărul par, așa că 2.5 se scrie ca 2, iar 3.5 ca 4.
  • O valoare în afara intervalului tipurilor Int16, Uint16 sau Float oprește scriptul: Overflow when writing X as UInt16.
  • NaN se poate scrie doar în Float și Double. Într-un tip întreg oprește scriptul: RegisterValueToWrites: Can’t write double.NaN to modbus register (MODBUSW, MODBUSWNE) sau PACKVALUE: Can’t write double.NaN to modbus register.
  • Bool scrie 1 pentru orice valoare diferită de 0. TRUE și FALSE se pot scrie și în tipurile numerice ca 1 și 0.

Exemplu — valoare dorită cu o zecimală

MODBUSW(H, 20, Int16, ROUND(Te * 10));

Consultați și — Funcții Modbus, Scripturi Modbus și prefetch, Date binare.