Wago /SPS über Modbus(TCP/IP) in FHEM steuern

Begonnen von lechez, 05 Mai 2013, 10:50:13

Vorheriges Thema - Nächstes Thema

ChrisD

Hallo,

Es gab vor Kurzem Änderungen am IODev-System in FHEM. Dies hat bereits bei diversen anderen Modulen zu Problemen geführt. Ich muss mir auf einem Testrechner ansehen wieso es nicht mehr richtig funktioniert.

Grüße,

ChrisD

sukram

Hallo Chris,

ich bin gerade über meine eigene Blindheit gestolpert  ::)  Würde es dir etwas ausmachen, in die "Device Specific Help" für ModbusRegister einen kurzen, dicken, fetten, Satz reinzuschreiben, dass die "wago XY123" Notation nur funktioniert, wenn der Server auch auf "Servertype Wago" steht?

Ich habe gerade einige Zeit damit verbracht, bis ich dann die verschiedenen Instanzen mal Attributweise verglichen habe  ;D

Die auf der vorhergehenden Seite genannten Timeouts habe ich auch gelegentlich, habe das aber bisher auf mein massiv untermotorisiertes Modbus TCP-RTU Gateway (AVR Netio mit Ethersex Firmware) geschoben.

ChrisD

Hallo,

Vielen Dank für den Hinweis, ich werde dies zur Dokumentation hinzufügen.

Grüße, ChrisD

der-Lolo

Boah, hier ist es still geworden ;)
Zeugt davon das alles bestens funktioniert!

Ich bin leider wieder, nach ein paar ruhigen Monaten,  Opfer des memory-leaks geworden. Mein Haupt-FHEM muss ich mittlerweile alle 6-8 Stunden neu starten.

Ich bereite derzeit einen "umzug" vor - neuer Host wird mein alter 2010er iMac mit Debian11.

In wie weit kann ich zwei FHEM Instanzen parallel benutzen? Ich habe so viele I/Os das ich den Umzug nicht am einem Tag bewältigen kann, zumal ich alles sauberer definieren möchte. Wie harmoniert das ganze wenn ein zweiter Wago Controller ( 750-842 ) hinzukommt?
Die zweite Wago einheit läuft derzeit an einem Pi als separiertes FHEM. Die FHEM-Instanz wird zwar auch für anderes ( I2C - Messungen, OneWire ) gebraucht, kann mir aber vorstellen das die I/Os ins Haupt-FHEM umziehen.

Wie würdet ihr vorgehen?

der-Lolo

Ich nutze gerne ein "set on-for-timer" - gibt es eine möglichkeit die Restlaufzeit im Device darzustellen?

ChrisD

Hallo,

Du kannst versuchen ein userReading dafür zu verwenden, z.B.:

attr mx_1_0 userReadings oftRest {if(defined($defs{mx_1_0}{TIMED_OnOff})) {$defs{mx_1_0}{TIMED_OnOff}{START}+$defs{mx_1_0}{TIMED_OnOff}{DURATION}-time()} else {'-'}}

Wenn on-for-timer aktiv ist ist der Startpunkt und die Dauer im Hash des Gerätes unter {TIMED_OnOff} abgelegt.

Grüße,

ChrisD

der-Lolo

#561
Wow, cool ChrisD - Danke das klappt auf anhieb!

Mir fällt nur auf das doch recht viele events erzeugt werden - ich brauch das auch nicht sekundengenau, minuten würden ausreichen, ich glaube ich muss mich dringend mal mit der "macht" der userReadings auseinandersetzen.

der-Lolo

Ok - event-min-interval ist mein freund ;) Das hat ganz gut geholfen...
Wenn ich jetzt mit on-for-timer starte und via set off schalte läuft der Timer weiter ;) - kann man da was optimieren?

oftRest hätte ich gerne ohne komma un bin unsicher wo ich das bestimmen soll - kannst du nochmal helfen..?

ChrisD

Hallo,

Dies
ZitatoftRest hätte ich gerne ohne komma un bin unsicher wo ich das bestimmen soll - kannst du nochmal helfen..?
kannst du mit einem 'int' lösen:

attr mx_1_0 userReadings oftRest {if(defined($defs{mx_1_0}{TIMED_OnOff})) {int($defs{mx_1_0}{TIMED_OnOff}{START}+$defs{mx_1_0}{TIMED_OnOff}{DURATION}-time())} else {'-'}}

Das Ganze in Minuten (ohne Sekunden):
attr mx_1_0 userReadings oftRest {if(defined($defs{mx_1_0}{TIMED_OnOff})) {int(($defs{mx_1_0}{TIMED_OnOff}{START}+$defs{mx_1_0}{TIMED_OnOff}{DURATION}-time())/60)} else {'-'}}

ZitatWenn ich jetzt mit on-for-timer starte und via set off schalte läuft der Timer weiter ;) - kann man da was optimieren?
Der Timer läuft weiter, set off beendet ihn nicht. Nach der eingestellten Zeit wird der Befehl ausgeführt. Wenn bereits ausgeschaltet war bemerkst du es nur nicht.

Diese Variante blendet in dem Fall die Zeit aus:
attr mx_1_0 userReadings oftRest {if(defined($defs{mx_1_0}{TIMED_OnOff})){if($defs{mx_1_0}{TIMED_OnOff}{NEXTCMD} ne $defs{mx_1_0}{STATE}){int($defs{mx_1_0}{TIMED_OnOff}{START}+$defs{mx_1_0}{TIMED_OnOff}{DURATION}-time())} else {'-'}} else {'-'}}

Da das Ganze etwas groß und unhandlich wird wäre es sinnvoll den Code in eine externe Funktion auszulagern und diese im userReading aufzurufen.

Grüße,

ChrisD

der-Lolo

Danke für Deine Hilfe beim on-for-timer "Restlaufzeit" auslesen - funktioniert wunderbar!
Nun hätte ich gerne noch eine "Fortschrittsanzeige", vielleicht hast Du eine Idee...
Ich habe im Bereich meiner Pool Steuerung "Belimo" 24V Stellantriebe, die drehen Kugelhähne in entsprechende stellungen ( SolarAN/SolarAus )
Die Laufzeit um den Kugelhahn um 90° zu drehen beträgt etwa 143 sekunden, diese Zeit habe ich fix im Wago Projekt hinterlegt.

Ich hatte mal im Netz gesucht und dieses Beispiel gefunden - siehe Anhang

Die entsprechende bilbliothek habe ich hinzugefügt - ich bekomme es aber leider nicht ans laufen.





ChrisD

Hallo,

Das Beispiel sieht eigentlich gut aus.

Was genau funktioniert nicht ?

Lässt sich der Code nicht kompilieren ?

Grüße,

ChrisD

der-Lolo

genau - vielleicht liegt es daran das ich die 0-100 ja dann in einem Register also als Byte Wert zu FHEM übertragen wollte. ( REAL to BYTE )

Gemeldet wurde jedenfalls beim compilieren ein Fehler - ich müsste es nochmal nachstellen um die genaue Meldung zu bekommen.

sukram

Zitat von: der-Lolo am 01 August 2022, 13:59:52
genau - vielleicht liegt es daran das ich die 0-100 ja dann in einem Register also als Byte Wert zu FHEM übertragen wollte. ( REAL to BYTE )

Ist denn das Ausgaberegister auch als Byte definiert? "Normalerweise" hat Modbus als Mindestgröße 16 Bit (=Word = Unsigned Int), du müsstest das Register also als Word beschreiben mit REAL_TO_WORD.

der-Lolo

Hallo ChrisD -
ich habe seit ein paar Tagen immer mal wieder sowas hier im Log...

Kannst Du etwas dazu sagen?

2022.11.16 16:33:47 3: EichenheimWago: Unknown code ModbusCoil:0:12547:5:1:65280, help me!
2022.11.16 16:33:47 3: EichenheimWago: Unknown code ModbusCoil:0:12547:5:1:0, help me!
2022.11.16 16:33:49 3: EichenheimWago: Unknown code ModbusCoil:0:12547:5:1:65280, help me!
2022.11.16 16:33:49 3: EichenheimWago: Unknown code ModbusCoil:0:12547:5:1:0, help me!

ChrisD

Hallo,

Die Meldungen kommen von einem Schreibauftrag auf Adresse 12547. Das Modul versucht die Rückmeldung vom Schreibauftrag einem Coil zuzuordnen welches nicht existiert.

Verwendest du das Attribut writeMode mit dieser Adresse ?

Grüße,

ChrisD