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.
| Typ | Register | Bereich | Wert im Skript |
|---|---|---|---|
Bool | 1 | 0 = FALSE, alles andere TRUE | bool |
Int16 | 1 | −32 768 … 32 767 | Zahl |
Uint16 | 1 | 0 … 65 535 | Zahl |
Int32 | 2 | −2 147 483 648 … 2 147 483 647 | Zahl |
UInt32 | 2 | 0 … 4 294 967 295 | Zahl |
Float | 2 | IEEE 754, einfache Genauigkeit | Zahl |
Int64, UInt64 | 4 | 64-Bit-Ganzzahlen | int64, uint64 |
Double | 4 | IEEE 754, doppelte Genauigkeit | Zahl |
String | 1 – 123 | 2 Zeichen pro Register | String |
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.
| |
| Flag | Bedeutung für Register |
|---|---|
BigEndian | Das höchstwertige Register kommt zuerst. Das ist der Standard: Int32 ist BigEndianInt32. |
LittleEndian | Die Reihenfolge der Register ist umgekehrt (Word-Swap). Bei einem 16-Bit-Typ, der ein Register hat, werden die beiden Bytes darin vertauscht. |
ByteSwap | Die 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
MODBUSWundMODBUSWNEbeiInt32undUInt32dasByteSwapignoriert. - 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
MODBUSRliest 0 bis 123 Register; der Text endet am ersten Nullbyte. Jedes Byte ist ein Zeichen.Stringkann nur gelesen werden.MODBUSWundPACKVALUEschreiben ihn nicht.
Beispiel
MODBUSR(H, 14, String, 4);
# Result: text of up to 8 characters, for example a serial numberWerte 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.5als2und3.5als4geschrieben. - Ein Wert außerhalb des Bereichs von
Int16,Uint16oderFloathält das Skript an: Overflow when writing X as UInt16. NaNkann nur inFloatundDoublegeschrieben 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.Boolschreibt 1 für jeden Wert außer 0.TRUEundFALSEkö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.