TapHome

Modbus-Datentypen

Modbus-Datentypen in TapHome-Skripten — Int16, Uint16, Int32, UInt32, Float, Bool, String und die 64-Bit-Typen Int64, UInt64 und Double — mit Varianten Big-Endian, Little-Endian und Byte-Swap.

Der Datentyp ist das dritte Argument von MODBUSR, MODBUSW und MODBUSWNE sowie von UNPACKVALUE und PACKVALUE. Er bestimmt, wie viele 16-Bit-Register ein Wert belegt und in welcher Reihenfolge seine Bytes gespeichert sind. Bei den Namen der Datentypen wird die Groß- und Kleinschreibung nicht unterschieden.

Grunddatentypen

Jeder Grunddatentyp belegt eine feste Anzahl von 16-Bit-Registern und liefert dem Skript einen Wert eines festen Typs.

TypRegisterBereichWert im Skript
Bool10 = FALSE, alles andere TRUEbool
Int161−32 768 … 32 767Zahl
Uint1610 … 65 535Zahl
Int322−2 147 483 648 … 2 147 483 647Zahl
UInt3220 … 4 294 967 295Zahl
Float2IEEE 754, einfache GenauigkeitZahl
Int64, UInt64464-Bit-Ganzzahlenint64, uint64
Double4IEEE 754, doppelte GenauigkeitZahl
String1 – 1232 Zeichen pro RegisterString

Viele Geräte speichern einen Dezimalwert als ganze Zahl mit festem Skalierungsfaktor — teilen Sie ihn nach dem Lesen, zum Beispiel MODBUSR(H, 20, Int16) / 10. BCD-kodierte Werte wandeln Sie mit FROMBCD um.

Varianten der Bytereihenfolge

Jeder Typ existiert in einer Big-Endian- und einer Little-Endian-Variante; die 32- und 64-Bit-Typen zusätzlich in Byte-Swap-Varianten.

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
FlagBedeutung für Register
BigEndianDas höchstwertige Register kommt zuerst. Das ist der Standard: Int32 ist BigEndianInt32.
LittleEndianDie Reihenfolge der Register ist umgekehrt (Word-Swap). Bei einem 16-Bit-Typ, der ein Register hat, werden die beiden Bytes darin vertauscht.
ByteSwapDie beiden Bytes in jedem Register werden vertauscht.

Hinweise

  • Lesen und Schreiben wenden alle Flags auf dieselbe Weise an, sodass ein geschriebener und mit demselben Typ zurückgelesener Wert gleich bleibt. Auf Core-Versionen älter als 2026.1 haben MODBUSW und MODBUSWNE bei Int32 und UInt32 das ByteSwap ignoriert.
  • Wenn ein Wert unsinnig gelesen wird, probieren Sie die Varianten in den manuellen Modbus-Operationen der App aus, die den Datentyp über denselben Registern umschalten.
  • In einer Bytesammlung bedeuten die Flags stattdessen die Reihenfolge der Bytes — siehe Bytereihenfolge in Sammlungen.

Beispiel

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

64-Bit-Datentypen

Int64, UInt64 und Double belegen vier Register; Int64 und UInt64 werden als 64-Bit-Ganzzahlen gelesen, die über den gesamten Bereich exakt sind, da ein double ganze Zahlen nur bis 2^53 exakt darstellt.

Hinweise — Ein 64-Bit-Wert behält in den Bitfunktionen alle 64 Bits, sodass auch die Bits 32 bis 63 eines Alarmworts erreichbar sind.

Beispiel — Energiezähler in Wh, angezeigt in kWh

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

Fehler — Modbus data type ‘X’ not supported. Please update your core unit to be able to use this feature. — wenn das Skript für eine ältere Core-Version gespeichert wird.

Verfügbar — Core 2026.1, Build 40595 oder neuer.

String

String liest Text, der mit zwei Zeichen pro Register gespeichert ist, das höherwertige Byte zuerst; die Anzahl der Register ist das vierte Argument.

Hinweise

  • MODBUSR liest 0 bis 123 Register; der Text endet am ersten Nullbyte. Jedes Byte ist ein Zeichen.
  • String kann nur gelesen werden. MODBUSW und PACKVALUE schreiben ihn nicht.

Beispiel

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

Werte schreiben

MODBUSW, MODBUSWNE und PACKVALUE wandeln den Wert vor dem Schreiben in den Datentyp um.

  • Ganzzahltypen runden auf die nächste ganze Zahl; ein Wert genau in der Mitte geht zur geraden Zahl, daher wird 2.5 als 2 und 3.5 als 4 geschrieben.
  • Ein Wert außerhalb des Bereichs von Int16, Uint16 oder Float hält das Skript an: Overflow when writing X as UInt16.
  • NaN kann nur in Float und Double geschrieben werden. In einen Ganzzahltyp hält es das Skript an: RegisterValueToWrites: Can’t write double.NaN to modbus register (MODBUSW, MODBUSWNE) oder PACKVALUE: Can’t write double.NaN to modbus register.
  • Bool schreibt 1 für jeden Wert außer 0. TRUE und FALSE können auch in Zahlentypen als 1 und 0 geschrieben werden.

Beispiel — Sollwert mit einer Dezimalstelle

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

Siehe auch — Modbus-Funktionen, Modbus-Skripte und Prefetch, Binärdaten.