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

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

Vorheriges Thema - Nächstes Thema

sukram

Eine andere Variante wäre das Hochsetzen des Parameter updateInterval nur für diesen Eingang.

Das habe ich bei einem Analogeingang so gelöst, dass der Wert nur alle 30 Sekunden aktualisiert wird (um das Log zu entlasten).

der-Lolo

Das klingt schon eher nach einer Lösung - schau ich mir an, Danke Dir...

sukram

Gutten Abend,

Ich muss leider das Thema mit mehreren Wagos noch mal hochholen. Ich habe derzeit 2x 750-342 Koppler im Einsatz und dabei seit kurzem ein seltsames Phänomen entdeckt. Kurz: ModbusCoil Schaltzustände von DO (QX) werden nur beim ersten Modbus Gerät richtig wieder zurückgelesen.

An dem ersten Koppler hängen derzeit nur 8x DI und 4x DO, damit werden Türen und der Gaszähler abgefragt sowie ein Pumpenrelais geschaltet. Das funktioniert soweit, wenn ich die ModbusCoil auf on schalte bleibt der Zustand on.

An dem zweiten Koppler hängt ein ganzes Sammelsurium an Karten (28DO, 38 DI, 2 AO, 4 AI). Die Analogkarten mit ModbusRegister klappen sauber, die Inputs auch (auch wenn die Zählweise der QX-Adressen irritierend anders ist als im Handbuch - der Offset durch Analogkarten "fehlt"). Wenn ich nun einen DO anlege:

define wago02_QX0_0 ModbusCoil wago QX0.0
attr wago02_QX0_0 IODev wago_02
attr wago02_QX0_0 alias LED00
attr wago02_QX0_0 event-on-change-reading .*
attr wago02_QX0_0 room Wago


Dann kann ich den zwar auf on setzen, der Ausgang wird auch aktiviert, aber state hüpft sofort wieder auf off zurück.

Zwischendurch der Hinweis: die Analogkarten waren bisher an der ersten Wago angebaut, dort hat die Adressierung aber auch funktioniert.

Zum Vergleich auch das list zweier Ausgänge. Der Funktioniert:
Internals:
   DEF        wago QX0.0
   FUUID      5fdd21ea-f33f-64c3-c334-af686b68dc32b481
   IODev      wago_01
   LASTInputDev wago_01
   MSGCNT     217780
   ModbusCoil_lastRcv 2020-12-22 00:27:59
   NAME       wago01_QX0_0
   NR         130
   NTFY_ORDER 50-wago01_QX0_0
   STATE      off
   TYPE       ModbusCoil
   lastUpdate Tue Dec 22 00:27:58 2020
   nextUpdate Tue Dec 22 00:27:59 2020
   wago_01_MSGCNT 217780
   wago_01_TIME 2020-12-22 00:27:59
   READINGS:
     2020-12-22 00:27:59   state           off
   helper:
     addr       1 0 512
     address    512
     disableRegisterMapping 1
     lastUpdate 0
     nextUpdate 1608593279.36165
     nread      8
     readCmd    
     register   512
     registerType 1
     unitId     0
     updateIntervall 0.1
     wago       1
     wagoDOOffset 0
     wagoT      Q
Attributes:
   DbLogExclude .*
   IODev      wago_01
   alias      Zirkulationspumpe
   event-on-change-reading .*
   icon       sani_pump
   room       Heizung,Wago


und der nicht:
Internals:
   DEF        wago QX0.0
   FUUID      5fdd4141-f33f-64c3-659b-f794418a96ad37df
   IODev      wago_02
   LASTInputDev wago_02
   MSGCNT     143812
   ModbusCoil_lastRcv 2020-12-22 00:28:42
   NAME       wago02_QX0_0
   NR         166
   NTFY_ORDER 50-wago02_QX0_0
   STATE      off
   TYPE       ModbusCoil
   lastUpdate Tue Dec 22 00:28:42 2020
   nextUpdate Tue Dec 22 00:28:42 2020
   wago_02_MSGCNT 143812
   wago_02_TIME 2020-12-22 00:28:42
   READINGS:
     2020-12-22 00:28:42   state           off
   helper:
     addr       1 0 512
     address    512
     disableRegisterMapping 1
     lastUpdate 0
     nextUpdate 1608593322.76173
     nread      8
     readCmd    
     register   512
     registerType 1
     unitId     0
     updateIntervall 0.1
     wago       1
     wagoDOOffset 0
     wagoT      Q
Attributes:
   IODev      wago_02
   alias      LED00
   event-on-change-reading .*
   room       Wago
   verbose    0


Die beiden ModbusTCPServer sind auch praktisch identisch angelegt:
define wago_01 ModbusTCPServer 10.102.1.211
attr wago_01 DbLogExclude .*
attr wago_01 combineReads 10:20
attr wago_01 pollInterval 0.4
attr wago_01 presenceLink wago01_presence
attr wago_01 room Wago
attr wago_01 serverType Wago

define wago_02 ModbusTCPServer 10.102.1.212
attr wago_02 DbLogExclude .*
attr wago_02 combineReads 10:48
attr wago_02 pollInterval 0.4
attr wago_02 presenceLink wago02_presence
attr wago_02 room Wago
attr wago_02 serverType Wago


Passend dazu auch der ausführliche List:
Internals:
   DEF        10.102.1.212
   DeviceName 10.102.1.212:502
   FD         14
   FUUID      5f26df9a-f33f-64c3-7a6b-51dbfed69d7af17a
   NAME       wago_02
   NOTIFYDEV  global
   NR         101
   NTFY_ORDER 50-wago_02
   PARTIAL   
   STATE      ok
   TYPE       ModbusTCPServer
   server     Wago 750-342
   statistics 433363 / 433363 / 5165662 / 5200356
   READINGS:
     2020-12-20 17:33:59   state           opened
   helper:
     delayNextRead 0
     delayNextWrite 0
     fc         1
     hd_tr_id   64433
     hd_unit_id 0
     lastFrame  SimpleWrite [FB B1 00 00 00 06] 00 01 01 E0 00 10
     lastSimpleWrite ���
     last_fc    1
     last_hd_tr_id 64432
     presence   wago02_presence
     seq        65182
     seqCoils   64434
     state      idle
     Wago:
       AI         4
       AO         2
       DI         38
       DIOffset   64
       DO         28
       DOOffset   32
       INFO_ITEM  342
       INFO_MAJOR 255
       INFO_MINOR 255
       INFO_REVISION 19
       INFO_SERIES 750
       initDone   1
       x          1
     combineReads:
       cfg:
         maxSize    48
         maxSpace   10
       coils:
         ARRAY(0x556e3427ab48)
         ARRAY(0x556e3367f580)
         ARRAY(0x556e342377f0)
         ARRAY(0x556e342b7930)
         ARRAY(0x556e34144e68)
         ARRAY(0x556e341d5a28)
         ARRAY(0x556e33b130b8)
         ARRAY(0x556e33b4c6a0)
         ARRAY(0x556e3414f2e0)
         ARRAY(0x556e340b26e0)
         ARRAY(0x556e2f0bdfe0)
         ARRAY(0x556e33861d60)
         ARRAY(0x556e342c6620)
         ARRAY(0x556e340b2f98)
         ARRAY(0x556e33cb1438)
         ARRAY(0x556e32f25a38)
         ARRAY(0x556e2f0be418)
         ARRAY(0x556e342c65a8)
         ARRAY(0x556e3442ea28)
         ARRAY(0x556e342151a0)
         ARRAY(0x556e33cf0280)
         ARRAY(0x556e342c6980)
         ARRAY(0x556e340c2658)
         ARRAY(0x556e32e9a498)
         ARRAY(0x556e32fd22d0)
         ARRAY(0x556e34439118)
         ARRAY(0x556e33d2f330)
         ARRAY(0x556e33b10730)
         ARRAY(0x556e33b7a130)
         ARRAY(0x556e33ce6890)
       data:
         64058:
           0
           1
           0
           16
         64314:
           0
           1
           0
           16
         65082:
           0
           3
           512
           1
         65338:
           0
           3
           512
           1
       registers:
         ARRAY(0x556e3406d618)
     statistics:
       bytesIn    5165662
       bytesOut   5200356
       pktIn      433363
       pktOut     433363
Attributes:
   DbLogExclude .*
   combineReads 10:48
   pollInterval 0.4
   presenceLink wago02_presence
   room       Wago
   serverType Wago


Was kann man da tun?

Und wenn wir das behoben haben, komme ich mit noch was obskurerem um die Ecke: einen Wago 750-815 Modbus Controller, der über RTU angefahren wird ;D Da kann ich nicht mit ModbusCoil auf die Merker Adressen (ab 12288) zugreifen. Aber das ist scheinbar auch nicht vorgesehen - zumindest steht kein Wort davon im Handbuch zu dem alten Teil...

ChrisD

Hallo,

Die Konfiguration und Adressen sehen richtig aus. Der 1. digitale Ausgang wird immer über Adresse 512 angesprochen, unabhängig davon wie viele AO vorhanden sind. Da der Ausgang schaltet ist die Adresse richtig. Bleibt der Ausgang geschaltet auch wenn FHEM 'off' anzeigt ?

Welche Version des ModbusTCPServer-Modules hast du ?

Du könntest noch versuchen den DOOffset auf 0 zu setzen
{$defs{wago_02}->{helper}{Wago}{DOOffset}=0}
und dann noch mal zu schreiben.

Dies ist aber nur provisorisch da der Wert bei einem neuen Verbindungsaufbau zur SPS wieder überschrieben wird.

Grüße,

ChrisD




sukram

Hallo,

danke für deine Tips. Der Ausgang selbst bleibt an, es wird nur der state falsch zurückgelesen (steht kurz auf on und springt im nächsten Lesezyklus wieder auf off) womit z.B. die toggle SetExtension nicht funktioniert.

Versionen:
98_Modbus.pm               20182 2019-09-17 12:53:40Z StefanStrobel
98_ModbusAttr.pm           19133 2019-04-06 18:40:30Z StefanStrobel
37_ModbusCoil.pm              14 2017-01-14 16:46:00Z ChrisD
37_ModbusRegister.pm          24 2018-02-06 21:22:00Z CD
36_ModbusTCPServer.pm         23 2019-09-06 21:05:00Z CD


Die Installation ist weitestgehend ,,offiziell" (keine neueren Versionen seitwärts eingepasst), das letzte Update lief am letzten Samstag. Ich könnte noch probeweise die Koppler untereinander tauschen, aber eigentlich habe ich beide auf die aktuellste Firmware (v19) gebracht und auch mit dem Ethernet Settings Tool müssten beide gleich eingestellt sein.

ChrisD

Hallo,

Setze bitte DOOffset auf 0, damit sollte das Lesen funktionieren. Das Problem kommt durch den Versuch dies zu integrieren:

Zitat(auch wenn die Zählweise der QX-Adressen irritierend anders ist als im Handbuch - der Offset durch Analogkarten "fehlt")

Leider werden dabei die Adressen falsch berechnet. Ich werde diesen Punkt nochmal überarbeiten, das wird aber dazu führen dass die Adressen angepasst werden müssen, aus QX0.0 wird dann bei dir z.B. QX28.0.

Grüße,

ChrisD

sukram

Hallo Chris,

jetzt nach den Feiertagen habe ich mal Zeit  ;D Also dein Perl-Schnippsel führt zum erwarteten Ergebnis. Die vorhandenen ModbusCoil Instanzen behalten den state richtig.

Das hilft mir erstmal, danke!

Mittelfristig ändert sich da sowieso noch einiges - das Abfragen von Tastern ist ziemlich träge (trotz 0.4 Sek Zyklus) bzw fühlt sich komisch an. Deshalb kommen die 2 Gira SPS Tastsensoren direkt an den 815er Controller, der die Rollos steuert.

WagoAndreas

Hey Leute. Erstmal ein gutes neues :-)
Naja zwischen den Jahren hat man ja bissl Zeit zum Bastln.

Ich hätte mal wieder eine Frage.
Ich habe PUSHNOTIFIER installiert. Läuft auch alles wunderbar.
Ich kann Puhsnachrichten verschicken usw. Also wenn z.b. In der Heizung die Temperatur zu geringt ist, dann wird das nicht nur an das Panel der SPS übergeben, sondern auch an FHEM und dann eben an einen Pushdienst
Ich hab das Ähnlich aufgebaut:

define mbcALARM1X15 ModbusCoil wago MX351.15
hier frage ich das MX351.15 ab. Das ist mein Test-Alarm
Danach gibt es noch ein Notify:
define nFHT_ALARM1X15 notify mbcALARM1X15 { fhem "set pushmsg message TestAlarm!"}

So normalerweise setzte ich ja beim mbcAlarm1X15 nocht das Attribut event-on-change-reading
Wenn ich das mache bekomm ich KEINE einzige Nachricht Das Bit wird aus der SPS gesetzt und das Icon der Lampe Leuchte in der FHEM Übersicht leuchtet (Aber nur wenn ich die Seite aktualisiere!!)

Wenn ich aber das Attribut event-on-change-reading NICHT setzte, dann bekomme ich im Sekundentakt eine Nachricht. Ob das Bit 1 oder 0 ist - egal.
Hat da jemand einen Tip für mich?

sukram

Gesundes Neues,

Erweitere mal das Regex in mbcALARM1X15:state:on

Dann sollte das nur bei aktivem Merker losbrüllen.

WagoAndreas

Danke. aber funzt nicht :-(

CFGFN
   
DEF    
mbcALARM1X15:state:on { fhem "set pushmsg message TestAlarm!"}
NAME
   
nFHT_ALARM1X15
NOTIFYDEV
   
mbcALARM1X15
NR
   
502
NTFY_ORDER
   
50-nFHT_ALARM1X15
REGEXP
   
mbcALARM1X15:state:on
STATE
   
active
TYPE
   
notify

**event on change reading hab ich enfernt (beim mbc) . aber jetzt sendet er gar nichts mehr :-)

sukram

Ok, da fehlt noch ein .* am Ende.

Hier ein Beispielnotify aus meinem Produktivsystem:

defmod nLichtAn notify wago02_IX0_6:.* set MQTT2_zigbee_group_2 brightness 255

Der zugehörige Eingang aus der Wago:

defmod wago02_IX0_6 ModbusCoil wago IX0.6
attr wago02_IX0_6 IODev wago_02
attr wago02_IX0_6 alias Taster10
attr wago02_IX0_6 devStateIcon .*:
attr wago02_IX0_6 event-on-change-reading .*
attr wago02_IX0_6 room Wago
attr wago02_IX0_6 webCmd :


Das webcmd ist nur da, um die on/off Links auszublenden.

WagoAndreas

#536
Also mit:
define nFHT_ALARM1X1 notify mbcALARM1X1:on { fhem "set pushmsg....

funktioniert es, wenn das bit 1 das er was sendet. Jedoch sendet er im Sekundentakt dann.
Ich hab es jetzt so programmiert, dass das Bit 2 Sekunden bei einer Störung aktiv ist. Somit sendet er mind. 1 max. jedoch 2 Nachrichten ab. Bissl von hinten durch die Brust. aber es funktioniert. :-)
Vielen Dank

Ich habs gefunden. bei dem event on change reading muss ja am Schluss ein .* hin. Da war bei mir eine 1. Daher hat es nicht funktioniert :-) DANKE für die Hilfe!

Thomas Stark

Hallo in die Runde.
Ich bin etwas am verzweifeln.
Ich habe eine PCL200 von Wago als Modbus Master laufen.
Es ist ein Register mit 16 Eingängen 32001.0-----32001.15 als Bool Register definiert.
Ebenso ein Register mit 16 Ausgängen 1.0 ------1.15 als Bool Regsiter definiert.
Die Ausgänge möchte ich schreiben können, sondern nur Lesen.
Das funktioniert auch einwandfrei mit folgender Definition in Fhem

define Ausgang_0 ModbusRegister 0 1
attr Ausgang_0 event-on-change-reading .*
attr Ausgang_0 room Wago
attr Ausgang_0 group Output


Ich bekomme einen Dezimalwert zurück, welcer mit das jeweilige Bit wiedergibt.
Hier meine erste Frage
Wie kann ich mir in Fhem das Register als BIT Folge anzeigen lassen, um dann bitweise auf Dummies zu interpretieren?

Die nächste Sorge sind meine Eingänge.
Laut Wago dürfen diese bei der PLC erst bei 32000 beginnen, was ich natürllch berücksichtigt habe und der Übersicht halber mit 32001 begonnen habe.

Hier nun meine Definition in FHEM

define Eingang_0 ModbusRegister 0 32001
attr Eingang_0  registerType Holding
attr Eingang_0  event-on-change-reading .*

Der Versuch auf das Register zu schreiben endet immer mit der Meldung
writing to input registers not allowed

Um nicht ganz zu verzweifeln, habe ich das ganze mit NodeRed parallel aufgebaut.
Hier funktioniert das ganze einwandfrei , was mich darin bestätigt, das es nicht an der Wago Steuerung liegen kann.
Hier nutze ich zum Schreiben den Befehl FC6 Write Single Holding Register.
Zum Laufen lernen habe ich erstmal dezimal geschrieben. Die Finale Lösung soll auch hier sein bit weise mit Dummies zu schreiben 0 oder 1

Ich bin für jede Hilfe Dankbar und würde mich über regen Austausch freuen.

Gruss Thomas





pc1246

Moin
Wieso willst du auf Eingaenge schreiben, das geht doch gar nicht! Kann man auch irgendwo in der Registerbeschreibung nachlesen, da steht ReadOnly, wenn ich mich nach 6ca. 6 Jahren richtig erinnere!
Gruss Christoph
HP T610
Onkyo_AVR;3 Enigma2; SB_Server ; SB_Player; HM-USB mit 15 HM-CC-RT-DN, 3 HM_WDS10_TH_O, 6 HM-Sec-SCo, 4 HM-Sec-MDIR-2, 1 HM-Sen-MDIR-O-2, 8 Ferion 5000 OW ; PhilipsTV; 4 harmony hub; Jeelink mit 9 PCA301; Somfy; S7-300; 3 LGW; HUE; HM-IP auf Charly

Thomas Stark

Hallo,
ja ich möchte auch auf Eingänge schreiben um Fehlfunktionen zu vermeiden.
Die Eingänge sind keine physikalischen Eingänge bei mir, sondern globale Variablen die in meine Funktionsbausteine implementiert sind.
Wago lässt dies ja auch explizit zu und mit Nodered kann ich es ja auch einwandfrei tun. FC6 Write Register

Gruss Thomas