Modbus-Skripte und Prefetch
Die Skripte eines TapHome-Modbus-Moduls und -Geräts — Initialisierung, Lesen, Wert lesen, Wert schreiben, Service-Attribute und Service-Aktionen — und wie Prefetch und der Registercache sie beeinflussen.
Ein Modbus-Modul und jedes seiner Geräte haben mehrere Skripte, und die Modbus-Funktionen funktionieren in allen. Wie oft die Skripte laufen und welche Register sie vom Bus lesen, hängt vom Abfrageintervall und vom Prefetch-Modus des Geräts ab. Wann jedes Skript läuft und welche Variablen es sieht, ist ausführlich unter Modbus-Integration beschrieben.
Skripte von Modbus-Modulen und -Geräten
Jedes Modbus-Skript hat seinen eigenen Zeitpunkt der Ausführung und seinen typischen Inhalt.
| Skript | Läuft | Typischer Inhalt |
|---|---|---|
| Initialisierung (Modul, Gerät) | Einmal nach dem Start | MODBUSWNE für Konfigurationsregister. |
| Lesen (Modul, Gerät) | Bei jeder Abfrage | Alarmregister und ADDERROR. |
| Wert lesen (Gerät) | Bei jeder Abfrage | MODBUSR und eine Umrechnung. Die letzte Anweisung ist der Gerätewert. |
| Wert schreiben (Gerät) | Wenn sich der Wert ändert, und mit Periodic write bei jeder Abfrage | MODBUSW der Gerätevariablen, zum Beispiel des Sollwerts. |
| Service-Attribut | Beim Öffnen der Serviceeinstellungen | MODBUSR, in Text umgewandelt. |
| Service-Aktion | Beim Drücken ihrer Schaltfläche | MODBUSW mit den Parametern der Aktion, die über ihr Kürzel verfügbar sind. |
Hinweise
- Am Modul oder am Gerät definierte Variablen behalten ihren Wert zwischen den Skriptläufen — nutzen Sie sie, um einen Wert aus einem Leseskript an ein Service-Attribut weiterzugeben. Modulvariablen können ab Core 2026.1, Build 39507, Sammlungen sein.
ADDERROR,ADDWARNINGundADDINFOfunktionieren nur in einigen dieser Skripte — siehe ADDERROR.
Beispiel — Skript Wert lesen eines Temperatursensors
MODBUSR(H, 20, Int16) / 10;Beispiel — Service-Aktion mit einem Parameter ID
MODBUSW(H, 20, Float, ID);Prefetch und der Registercache
Der Prefetch-Modus eines Modbus-Geräts bestimmt, ob seine Skripte Register aus dem Cache des Moduls oder vom Bus lesen.
| Modus | Auswirkung auf Skripte |
|---|---|
| Normal | Von den Skripten verwendete Register werden vor dem Lauf der Skripte in gruppierten Anfragen gelesen. Liest ein Lauf dasselbe Register zweimal, kostet das eine Transaktion. |
| Isolated | Wie Normal, aber die Register des Geräts werden nicht mit den Registern anderer Geräte zusammengeführt. |
| No prefetch | Kein Cache. Jedes MODBUSR und MODBUSRBLOCK ist eine echte Transaktion, in der geschriebenen Reihenfolge. |
Hinweise
- Wählen Sie No prefetch für Geräte, die eine genaue Abfolge von Transaktionen benötigen; speichern Sie dann einen einmal gelesenen Wert in einer Variablen, statt ihn erneut zu lesen.
- Bevorzugen Sie einen Blocklesevorgang gegenüber einer Schleife aus Einzellesevorgängen —
MODBUSRBLOCK(H, 100, 100)ersetzt 100 Transaktionen. MODBUSWNEundMODBUSWBLOCKNEvergleichen mit dem Wert im Cache — siehe MODBUSWNE.- Die Größe der gruppierten Anfragen und die Prefetch-Modi stellen Sie ein wie unter Prefetch beschrieben.
Beispiel — ein Block statt vier Lesevorgängen
collection<uint16> data := MODBUSRBLOCK(H, 100, 4);
VAR voltage := UNPACKVALUE(data, 0, Uint16) / 10;
VAR current := UNPACKVALUE(data, 1, Uint16) / 100;
VAR power := UNPACKVALUE(data, 2, BigEndianFloat);Siehe auch — Modbus-Datentypen, Beispiele.