Modbus Register schalten

Ich stehe gerade ziemlich auf dem Schlauch.

Ich hab ein Modbus Gerät angelegt (PV WR), welches mir seit Monaten zuverlässig diverse Register ausliest. Nun würde ich das erste mal gerne ein Register setzen (Ladeleistung der Batterie begrenzen)

Ich habe dazu eine neue Variable im Gerät angelegt und diese sowohl zum Lesen als auch Schreiben parametriert. Das Register ist lt. Doku 33047 aber hier muss ja (aus welchen Gründen auch immer -1) gerechnet werden. Ich kann dieses Register so auslesen UND über rk auf das Modbus Gerät → Befehl testen–> Schalte Statusvariable auch schalten. Der Wert wird dann übernommen und das gewünschte Verhalten der Batterie stellt sich ein.

Ich schaffe es aber nicht den Wert über ein Skript zu ändern. Ich habe hier z.B. das versucht:

<?php
ModBus_WriteRegister (51909,10);

Mit dem Ergebnis:

Warning: Instanz #51909 existiert nicht in /var/lib/symcon/scripts/33548.ips.php on line 5

Die im Gerät angelegte Variable „Max. Charging Power“ hat dei ID 51909 bekommen.
Wie schaffe ich es das Register per Skript zu setzen?`

Ein RequestAction auf diese Idee hat zum Überlauf der php Threads geführt und die Variable 51909 mit Standardaktion funktioniert auch nicht.

Du verwendest vermutlich das neue Geräte-Modul mit mehreren Variablen? Ich würde erstmal RequestAction ausprobieren.

Ja genau das neue Geräte Modul.

Ich habe RequestAction vorhin einmal probiert und das im Standardskript ersetzt. Dann musste ich neustarten, weil eben der php Thread voll lief.

Habs nun als einzelnen Skript angelegt und hard mit der ID ausgeführt. Das geht komischerweise direkt :smiley:
Kann ich das nicht als Standardskript anlegen mit:

<?php
RequestAction($_IPS['VARIABLE'], $_IPS['VALUE']);

Das Standardscript existiert doch bereits? RequestAction fürt das Standardscript aus. Was fehlt dir, dass du das Script überschreiben wolltest?

Es gibt noch ein Funktion

IPS_RequestAction($InstanzID, $IDENT, $VALUE);

vielleicht hilft dir dir, wenn du das Standardscript wirklich überschreiben musst.

Damit hast du die Endlosschleife selbst gebaut.
Die Variable hat doch, sobald du eine schreiben Adresse setzt, eine Standardaktion. Die darfst du nicht ändern.
Die Variable sollte damit aus den Frontends und über die Aktionen ‚Schalte Variable‘ zu schalten sein.
Um aus einem Script die Variable zu schalten dann wie gehabt RequestAction (mit der VariableID und nicht dem ident) nutzen.
Michael

Ja ihr habt natürlich recht.
Mein Problem war vermutlich, dass das Profil keine Werte hinterlegt hatte (?!). Deswegen konnte ich die im WF nicht schalten und habe vermutet ich muss an der Standardaktion was ändern.
Nun funktioniert es hab das Profil angepasst und es geht per WF und auch per RequestAction.

Jetzt würde mich noch eins Interessieren. Das ist ja nun eine Variable zum Lesen und Schreiben. Angenommen das entfernte Gerät setzt den Wert nicht richtig oder eine andere Stelle überschreibt meinen Setzwert. Das wird dann nach dem Poll Intervall in IPS auch wieder überschrieben oder?

Also ich setze auf 2,5 die Variable in IPS führt diese 2,5 und im Webinterface vom WR setze ich das Register auf 4, dann würde nach dem nächsten Datenpoll die 4 auch in IPS stehen, richtig?

Ja genau so.
Michael

1 „Gefällt mir“

Ok danke euch für die Hilfe.