TapHome

Modbus-Funktionen

Modbus-Funktionen der TapHome-Skripte — MODBUSR, MODBUSW, MODBUSWNE und die Blockfunktionen MODBUSRBLOCK, MODBUSWBLOCK, MODBUSWBLOCKNE — sowie die Modbus-Registertypen C, D, H und A.

Modbus-Funktionen lesen und schreiben die Coils und Register des Modbus-Geräts, zu dem ein Skript gehört. Sie funktionieren nur in den Skripten eines Modbus-Moduls oder -Geräts; überall sonst hält das Skript mit ModbusFunction - unknown modbus device to work with an. Die Namen der Datentypen (Uint16, BigEndianFloat, …) finden Sie unter Modbus-Datentypen. Die Einrichtung des Moduls und der Vorlagen ist unter Modbus-Integration beschrieben.

Registertypen

Das erste Argument jeder Modbus-Funktion ist der Registertyp.

TypModbus-ObjektFunktionscodesZugriff
CCoilFC01 Lesen, FC05 / FC15 SchreibenLesen und Schreiben
DDiscrete InputFC02nur Lesen
HHolding-RegisterFC03 Lesen, FC06 / FC16 SchreibenLesen und Schreiben
AInput-RegisterFC04nur Lesen

SC und SH sind ältere Werte, die Skripte weiterhin akzeptieren. Sie adressieren dieselben Coils und Holding-Register wie C und H, das Modul liest sie jedoch bei jedem Aufruf vom Gerät statt aus dem Cache und schreibt sie mit einem Register pro Anfrage (FC05 / FC06). Verwenden Sie in neuen Skripten C und H. Dieses Verhalten stammt aus dem Code der Engine und wurde nicht an einem Gerät überprüft.

MODBUSR

MODBUSR liest einen Wert aus einer Coil, einem Discrete Input oder einem oder mehreren Registern und wandelt ihn in den angegebenen Datentyp um.

1
2
MODBUSR(registerType, register, dataType)
MODBUSR(registerType, register, String, numberOfRegisters)
NameTypBeschreibung
registerTypeC, D, H, ASiehe Registertypen.
registerZahlRegisteradresse 0 – 65535, dezimal oder hexadezimal (0x14).
dataTypeModbus-DatentypBestimmt, wie viele Register gelesen werden: 1, 2 oder 4.
numberOfRegistersZahlErforderlich für String, 0 – 123. Ein Register enthält 2 Zeichen.

Rückgabewert — eine Zahl für die 16- und 32-Bit-Typen, Float und Double; bool für Bool; int64 oder uint64 für Int64 und UInt64; ein String für String, der am ersten Nullbyte endet.

Hinweise — Ein Wert über mehrere Register wird in einer Anfrage gelesen, sodass alle seine Register vom selben Zeitpunkt stammen.

Beispiel

MODBUSR(H, 20, Int16) / 100;
# Result: the register as a signed number, divided by 100
MODBUSR(A, 0x0040, Uint32);
MODBUSR(H, 14, String, 4);
# Result: text of up to 8 characters

Fehler — Invalid register number: X; String data type must have specified length - number of registers to read.

MODBUSW

MODBUSW schreibt einen Wert oder bis zu 101 Werte in aufeinanderfolgende Register und gibt TRUE zurück.

1
MODBUSW(registerType, register, dataType, value [, value2, …])

Hinweise

  • Bei mehreren Werten verschiebt sich die Registeradresse um die Größe des Datentyps — 1, 2 oder 4 Register pro Wert.
  • Eine Coil (C) akzeptiert nur den Datentyp Bool; D und A können nicht geschrieben werden.
  • Wie Werte gerundet und geprüft werden, ist unter Werte schreiben beschrieben.

Beispiel

MODBUSW(H, 20, Int16, Te * 100);
MODBUSW(H, 100, Uint16, 1, 2, 3);
# Result: TRUE — registers 100, 101 and 102 are written
MODBUSW(C, 5, Bool, St);

Fehler — WriteInt16: Cannot write Int16 to coils (und dasselbe für andere Typen); Invalid register number: X.

MODBUSWNE

MODBUSWNE („write if not equal“, schreiben, wenn ungleich) schreibt einen Wert wie MODBUSW, aber nur dann, wenn er sich vom Wert im Register unterscheidet. Das spart Busverkehr und die EEPROM-Schreibzyklen des Geräts.

1
MODBUSWNE(registerType, register, dataType, value)

Hinweise

  • Der Wert wird mit dem Registercache des Moduls verglichen. Bei eingeschaltetem Prefetch ist das der Wert aus dem letzten Prefetch (das Register wird in den Prefetch aufgenommen); ein noch nicht gelesenes Register wird zuerst gelesen. Bei No prefetch wird das Register unmittelbar vor dem Vergleich vom Gerät gelesen.
  • Er wird nie mit dem zuletzt geschriebenen Wert verglichen: Ein Schreibvorgang ändert den Wert im Cache erst, wenn das Register wieder gelesen wird.
  • Ein Wert über mehrere Register wird als Ganzes verglichen und geschrieben.

Beispiel — Konfiguration im Initialisierungsskript

MODBUSWNE(H, 27, Uint16, 0);

MODBUSRBLOCK

MODBUSRBLOCK liest einen Block aufeinanderfolgender Register oder Coils in einer Modbus-Transaktion und gibt sie als Sammlung zurück.

1
MODBUSRBLOCK(registerType, register, count)
RegistertypRückgabewertMaximales count
H, Acollection<uint16>123 (FC03 / FC04)
C, Dcollection<bool>2000 (FC01 / FC02)

Hinweise — Bei eingeschaltetem Prefetch werden Register, die bereits im Cache sind, nicht erneut gelesen; die fehlenden werden in einer Anfrage gelesen. Typisierte Werte lesen Sie aus dem Block mit UNPACKVALUE. Ein Blocklesevorgang ersetzt viele Einzellesevorgänge.

Beispiel

collection<uint16> data := MODBUSRBLOCK(H, 100, 4);
UNPACKVALUE(data, 0, BigEndianFloat);
# Result: the float in registers 100 and 101

Fehler — MODBUSRBLOCK: count must be between 1 and 123 for 16-bit registers (H); MODBUSRBLOCK: invalid register range X..Y.

Verfügbar — Core 2026.1, Build 39001 oder neuer (App ab Build 39016). Dasselbe gilt für MODBUSWBLOCK und MODBUSWBLOCKNE.

MODBUSWBLOCK

MODBUSWBLOCK schreibt eine ganze Sammlung in einer Modbus-Transaktion in aufeinanderfolgende Holding-Register oder Coils und gibt TRUE zurück. Ein Block, der länger ist als die Prefetch-Gruppengröße des Moduls (standardmäßig 100), wird in mehrere aufeinanderfolgende Anfragen aufgeteilt.

1
MODBUSWBLOCK(registerType, register, collection)
RegistertypSammlungMaximale Länge
Hcollection<uint16>123 (FC16)
Ccollection<bool>1968 (FC15)

Beispiel — Coils 0 und 3 setzen, Coils 1, 2 und 4 bis 7 löschen

collection<bool> coils := BOOLCOLLECTION(8);
SETAT(coils, 0, TRUE);
SETAT(coils, 3, TRUE);
MODBUSWBLOCK(C, 0, coils);

Fehler — MODBUSWBLOCK: cannot write to read-only registers (D); MODBUSWBLOCK: register type C expects Collection<Bool>, got Collection<UInt16>.

MODBUSWBLOCKNE

MODBUSWBLOCKNE schreibt eine Sammlung wie MODBUSWBLOCK, aber nur dann, wenn sich mindestens ein Wert vom aktuellen Inhalt der Register unterscheidet; ein geänderter Block wird auf dieselbe Weise geschrieben und nach derselben Gruppengröße aufgeteilt.

1
MODBUSWBLOCKNE(registerType, register, collection)

Hinweise — Der aktuelle Inhalt wird auf dieselbe Weise gelesen wie bei MODBUSWNE.

Beispiel — ein Register eines Blocks mit minimalem Busverkehr ändern

collection<uint16> c := MODBUSRBLOCK(H, 100, 4);
PACKVALUE(c, 1, Uint16, 9);
MODBUSWBLOCKNE(H, 100, c);

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