Modbus adattípusok
Modbus adattípusok a TapHome szkriptekben — Int16, Uint16, Int32, UInt32, Float, Bool, String és a 64 bites Int64, UInt64 és Double — big-endian, little-endian és bájtcserés változatokkal.
Az adattípus a MODBUSR, a MODBUSW és a MODBUSWNE, valamint az UNPACKVALUE és PACKVALUE harmadik argumentuma. Ez határozza meg, hány 16 bites regisztert foglal egy érték, és milyen sorrendben tárolódnak a bájtjai. Az adattípusnevek nem érzékenyek a kis- és nagybetűkre.
Alap adattípusok
Minden alap adattípus rögzített számú 16 bites regisztert foglal, és rögzített típusú értéket ad a szkriptnek.
| Típus | Regiszterek | Tartomány | Érték a szkriptben |
|---|---|---|---|
Bool | 1 | 0 = FALSE, bármi más TRUE | bool |
Int16 | 1 | −32 768 … 32 767 | szám |
Uint16 | 1 | 0 … 65 535 | szám |
Int32 | 2 | −2 147 483 648 … 2 147 483 647 | szám |
UInt32 | 2 | 0 … 4 294 967 295 | szám |
Float | 2 | IEEE 754 egyszeres pontosság | szám |
Int64, UInt64 | 4 | 64 bites egész számok | int64, uint64 |
Double | 4 | IEEE 754 dupla pontosság | szám |
String | 1 – 123 | regiszterenként 2 karakter | szöveg |
Sok eszköz a tizedes értéket rögzített skálájú egész számként tárolja — olvasás után oszd el, például MODBUSR(H, 20, Int16) / 10. A BCD-kódolt értékeket a FROMBCD függvénnyel alakíthatod át.
Bájtsorrend-változatok
Minden típusnak van big-endian és little-endian változata; a 32 és 64 bites típusoknak bájtcserés változatai is.
| |
| Jelző | Jelentése a regisztereknél |
|---|---|
BigEndian | A legnagyobb helyiértékű regiszter van elöl. Ez az alapértelmezés: az Int32 azonos a BigEndianInt32 típussal. |
LittleEndian | A regiszterek sorrendje megfordul (szócsere). Az egyetlen regiszterből álló 16 bites típusnál a regiszteren belüli két bájt cserélődik fel. |
ByteSwap | Minden regiszteren belül felcserélődik a két bájt. |
Megjegyzések
- Az olvasás és az írás minden jelzőt ugyanúgy alkalmaz, így ha egy értéket ugyanazzal a típussal írsz és olvasol vissza, ugyanazt az értéket kapod. A 2026.1-nél régebbi Core verziókon a
MODBUSWés aMODBUSWNEfigyelmen kívül hagyta aByteSwapjelzőt azInt32ésUInt32típusnál. - Ha egy érték értelmetlen számként olvasódik ki, próbáld ki a változatokat az alkalmazás kézi Modbus műveleteiben, amelyek ugyanazon regisztereken váltják az adattípust.
- Bájtgyűjteményben a jelzők a bájtok sorrendjét jelentik — lásd: Bájtsorrend a gyűjteményekben.
Példa
MODBUSR(H, 0x0100, LittleEndianFloat);
MODBUSR(A, 30, BigEndianUint32ByteSwap);64 bites adattípusok
Az Int64, az UInt64 és a Double négy regisztert foglal; az Int64 és az UInt64 64 bites egész számként olvasódik ki, a teljes tartományban pontosan, mert a double az egész számokat csak 2^53-ig tárolja pontosan.
Megjegyzések — A 64 bites érték mind a 64 bitjét megtartja a bitfüggvényekben, így egy riasztási szó 32–63. bitje is elérhető.
Példa — energiaszámláló Wh-ban, kWh-ban megjelenítve
VAR energy := MODBUSR(H, 100, UInt64);
energy / 1000;Hibák — Modbus data type ‘X’ not supported. Please update your core unit to be able to use this feature. — ha a szkriptet régebbi Core verzióhoz mented.
Elérhetőség — Core 2026.1, build 40595 vagy újabb.
String
A String regiszterenként két karakterben tárolt szöveget olvas ki, a felső bájttal kezdve; a regiszterek száma a negyedik argumentum.
Megjegyzések
- A
MODBUSR0–123 regisztert olvas ki; a szöveg az első nulla bájtnál ér véget. Minden bájt egy karakter. - A
Stringcsak olvasható. AMODBUSWés aPACKVALUEnem írja.
Példa
MODBUSR(H, 14, String, 4);
# Result: text of up to 8 characters, for example a serial numberÉrtékek írása
A MODBUSW, a MODBUSWNE és a PACKVALUE írás előtt az adattípusra alakítja az értéket.
- Az egész típusok a legközelebbi egész számra kerekítenek; a pontosan félúton lévő érték a páros szám felé kerekedik, így a
2.5értékből2, a3.5értékből4íródik. - Az
Int16,Uint16vagyFloattartományán kívüli érték leállítja a szkriptet: Overflow when writing X as UInt16. NaNcsakFloatésDoubletípusba írható. Egész típusba írva leállítja a szkriptet: RegisterValueToWrites: Can’t write double.NaN to modbus register (MODBUSW,MODBUSWNE) vagy PACKVALUE: Can’t write double.NaN to modbus register.- A
Boola 0-tól eltérő bármely értékre 1-et ír. ATRUEés aFALSEszámtípusokba is írható, 1-ként és 0-ként.
Példa — alapjel egy tizedesjeggyel
MODBUSW(H, 20, Int16, ROUND(Te * 10));Lásd még — Modbus függvények, Modbus szkriptek és prefetch, Bináris adatok.