TapHome

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ípusRegiszterekTartományÉrték a szkriptben
Bool10 = FALSE, bármi más TRUEbool
Int161−32 768 … 32 767szám
Uint1610 … 65 535szám
Int322−2 147 483 648 … 2 147 483 647szám
UInt3220 … 4 294 967 295szám
Float2IEEE 754 egyszeres pontosságszám
Int64, UInt64464 bites egész számokint64, uint64
Double4IEEE 754 dupla pontosságszám
String1 – 123regiszterenként 2 karakterszö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.

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
JelzőJelentése a regisztereknél
BigEndianA legnagyobb helyiértékű regiszter van elöl. Ez az alapértelmezés: az Int32 azonos a BigEndianInt32 típussal.
LittleEndianA 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.
ByteSwapMinden 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 a MODBUSWNE figyelmen kívül hagyta a ByteSwap jelzőt az Int32 és UInt32 tí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 MODBUSR 0–123 regisztert olvas ki; a szöveg az első nulla bájtnál ér véget. Minden bájt egy karakter.
  • A String csak olvasható. A MODBUSW és a PACKVALUE nem í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ől 2, a 3.5 értékből 4 íródik.
  • Az Int16, Uint16 vagy Float tartományán kívüli érték leállítja a szkriptet: Overflow when writing X as UInt16.
  • NaN csak Float és Double tí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 Bool a 0-tól eltérő bármely értékre 1-et ír. A TRUE és a FALSE szá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.