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

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

Vorheriges Thema - Nächstes Thema

pc1246

Hallo ChrisD

Mir fehlt irgendwo eine Info!? Ich habe allerdings auch nicht das Modbus-Diplom! Wo definiere ich, welche Daten (Ich benutze extra nicht Variablen) abgeholt/geschrieben werden. Ich moechte eine S7 anbinden, habe auch die passenden Bausteine, aber finde noch nicht so ganz den Weg zwischen den Beiden! Lege ich einfach nur einen Bereich fest, in dem ich dann auf beiden Seiten fuer das richtige Versorgen der Informationen sorgen muss? Kann ich dann mehrere Bereiche definieren, um einmal Ausgaenge einmal Eingaenge einmal Merker usw. zu kommunizieren? Bei Wago, kenne ich ein bisschen, ist das ja etwas anders, da liegt das doch alles irgendwie hintereinander, oder?
Sorry fuer soviel Unwissenheit, aber mir fehlt wirklich nur derAnsatz!

Danke und 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

ChrisD

Hallo,

Welche S7 (1200, 300/400 mit/ohne CP) möchtest du wie (seriell, Ethernet) anbinden ?

Bei der 1200 kannst du MB_SERVER über die PN-Schnittstelle verwenden, der Datenaustausch erfolgt für Register entweder über einen DB oder über Merker. Bitzugriffe sind nicht auf DBs möglich, nur direkt auf Ein- und Ausgänge. Beim Aufruf von MB_SERVER übergibst du in MB_HOLD_REG die Adresse wo die Daten sind, aus FHEM kannst du dann über das Register 40001 auf das erste Wort zugreifen.

Grüße,

ChrisD



pc1246

Zitat von: ChrisD am 22 August 2014, 15:52:51
Hallo,

Welche S7 (1200, 300/400 mit/ohne CP) möchtest du wie (seriell, Ethernet) anbinden ?


Grüße,

ChrisD

Ne noch S7-300 mit Ethernet!
Register 40001 ??? Ich muss noch mal alles durchlesen!

Danke
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

ChrisD

#183
Hallo,

Bei der 300 ist die Konfiguration es etwas aufwendiger, es gibt aber von Siemens einen Modbus TCP Wizard der bei der Erstellung der Konfiguration hilft. In diesem kannst du die Modbus-Daten einzelnen DBs zuordnen. Coils werden von FHEM aus ab 1, Inputs ab 10001, Input Registers ab 30001 und Holding Registers ab 40001 angesprochen.

Grüße,

ChrisD

pc1246

Hallo ChrisD

Rein theoretisch funktioniert die Kommunikation mit der S7-300! Praktisch kann ich auch auf die S7 schreiben und von Ihr lesen! Du schreibst in http://forum.fhem.de/index.php/topic,12655.msg193450.html#msg193450 , dass mit "attr MBC01 webCmd on:off:on-for-timer 1" eine Schaltflaeche angezeigt wird.
Das funktioniert natuerlich auch, aber man kann ja die Schaltflaeche nicht betaetigen, da es ja ein Input ist! Wo ist jetzt mein Problem!
Mein define sieht so aus: define MBTest01 ModbusCoil 0 16288
Ich wuerde gerne auch coils schreiben, oder geht das nicht?

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

pc1246

Hallo
Schreiben geht, wenn dann das Register kleiner als 10000 gewaehlt wird! Dafuer habe ich aber ein anderes Problem. Lege ich mehrere Coils an, so werden diese nicht richtig gelesen. Ist das auf anderen Steuerungen auch so? Ich habe heute morgen dann um 1:38Uhr aufgegeben, da ja um 5:45 der Wecker schon wieder klingelt! Ich vermute es wird nicht wirklich ein Bit geholt, sondern ein Wort, und auf das Bit wird gefiltert! Wenn ich jetzt 5 hintereinander liegende Bits abfrage, so sehe ich anscheinend nur das zuletzt abgefragte! Im S7 sehe ich auch nur, dass fuenfmal ein Bit geholt wird, nicht einmal fuenf Bit!
Meine Bits:
define A_5_0 ModbusCoil 0 10041
define A_5_1 ModbusCoil 0 10042
define A_5_2 ModbusCoil 0 10043
define A_5_3 ModbusCoil 0 10044
define A_5_4 ModbusCoil 0 10045

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

ChrisD

Hallo,

In der ursprünglichen Modbus-Implemtierung waren verschiedene Bereiche für den Datenzugriff vorgesehen:
Coilnummern 1-9999 : Output-Bereich, lesen & schreiben
Coilnummern 10001-19999 : Input-Bereich, nur lesen
Registernummern 30001-39999 : Input-Bereich, nur lesen
Registernummern 40001-49999 : Output-Bereich, lesen & schreiben

Dabei wurden die einzelnen Bereiche über unterschiedliche FCs und den Adressen 0-9998 angesprochen.

Ich habe diese Bereiche in den Modulen integriert da auch heute noch diverse Geräte darüber angesprochen werden. Wie du aber beobachtet hast kannst du nicht auf die Input-Bereiche schreiben. Es gibt keinen FC der dies erlauben würde.

Du kannst diese Bereiche zwar über das Attribut disableRegisterMapping abschalten, allerdings werden dann die Coil/Registernummern direkt als Adressen durchgereicht (muss z.B bei Steuerungen von Wago so gemacht werden).

Im Moment werden fortlaufende Zugriffe nicht zusammengefasst, bei deinem Beispiel werden deshalb 5 Aufträge für jeweils ein einzelnes Bit ausgeführt. Die SPS muss dafür sorgen dass das korrekte Bit aus dem Byte/Wort entnommen und übertragen wird, auf FHEM-Seite kommt nur 0 oder 1 an. Um zu sehen was genau übertragen wird kannst du im ModbusTCPServer das Attribut 'verbose' für kurze Zeit auf 5 setzen. In der FHEM-Logdatei sollten dann solche Einträge auftauchen:

Zitat2014.10.01 17:34:22.257 5: SimpleWrite [00 29 00 00 00 06] 00 02 00 29 00 01
2014.10.01 17:34:22.258 5: Received [00 29 00 00 00 04] 00 02 01 00
2014.10.01 17:34:22.258 5: wago dispatch ModbusCoil:0:41:2:1:0
2014.10.01 17:34:22.258 5: ModbusCoil_Parse: 2 0 41 1 0

Kannst du einen Auszug davon posten ?

Das Zusammenfassen von Leseaufträgen steht noch immer auf meiner Todo-Liste, ich hatte bis jetzt aber noch nicht die Zeit es zu implementieren und zu testen.

Grüße,
ChrisD

pc1246

Hallo Chris

Ja mache ich gleich! War jetzt ein paar Tage nicht online, und habe Deinen Post gerade erst gelesen! Die VM startet gerade neu, dauert dummerweise 10 Minuten, dann kann ich Dir einen Log-Auszug posten!
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

pc1246

#188
Hallo Chris

2014.10.05 14:47:01 5: SimpleWrite [00 2C 00 00 00 06] 00 02 00 2C 00 01
2014.10.05 14:47:01 5: Received [00 2C 00 00 00 04] 00 02 01 00
2014.10.05 14:47:01 5: MB_S7 dispatch ModbusCoil:0:44:2:1:0
2014.10.05 14:47:01 5: ModbusCoil_Parse: 2 0 44 1 0
2014.10.05 14:47:02 5: AddRQueue [27 0E 00 00 00 06] 00 04 27 0E 00 01
2014.10.05 14:47:02 5: SimpleWrite [27 0E 00 00 00 06] 00 04 27 0E 00 01
2014.10.05 14:47:02 5: AddRQueue [00 28 00 00 00 06] 00 02 00 28 00 01
2014.10.05 14:47:02 5: adding to RQUEUE - 1
2014.10.05 14:47:02 5: AddRQueue [00 29 00 00 00 06] 00 02 00 29 00 01
2014.10.05 14:47:02 5: adding to RQUEUE - 2
2014.10.05 14:47:02 5: AddRQueue [00 2A 00 00 00 06] 00 02 00 2A 00 01
2014.10.05 14:47:02 5: adding to RQUEUE - 3
2014.10.05 14:47:02 5: AddRQueue [00 2B 00 00 00 06] 00 02 00 2B 00 01
2014.10.05 14:47:02 5: adding to RQUEUE - 4
2014.10.05 14:47:02 5: AddRQueue [00 2C 00 00 00 06] 00 02 00 2C 00 01
2014.10.05 14:47:02 5: adding to RQUEUE - 5
2014.10.05 14:47:02 5: Received [27 0E 00 00 00 05] 00 04 02 00 00
2014.10.05 14:47:02 5: MB_S7 dispatch ModbusRegister:0:9998:4:1:0
2014.10.05 14:47:02 5: ModbusRegister_Parse: 4 0 9998
2014.10.05 14:47:02 4: RQUEUE: 5
2014.10.05 14:47:02 5: SimpleWrite [00 28 00 00 00 06] 00 02 00 28 00 01
2014.10.05 14:47:02 5: Received [00 28 00 00 00 04] 00 02 01 03
2014.10.05 14:47:02 5: MB_S7 dispatch ModbusCoil:0:40:2:1:3
2014.10.05 14:47:02 5: ModbusCoil_Parse: 2 0 40 1 3
2014.10.05 14:47:02 4: RQUEUE: 4
2014.10.05 14:47:02 5: SimpleWrite [00 29 00 00 00 06] 00 02 00 29 00 01
2014.10.05 14:47:02 5: Received [00 29 00 00 00 04] 00 02 01 01
2014.10.05 14:47:02 5: MB_S7 dispatch ModbusCoil:0:41:2:1:1
2014.10.05 14:47:02 5: ModbusCoil_Parse: 2 0 41 1 1
2014.10.05 14:47:02 4: RQUEUE: 3
2014.10.05 14:47:02 5: SimpleWrite [00 2A 00 00 00 06] 00 02 00 2A 00 01
2014.10.05 14:47:02 5: Received [00 2A 00 00 00 04] 00 02 01 00
2014.10.05 14:47:02 5: MB_S7 dispatch ModbusCoil:0:42:2:1:0
2014.10.05 14:47:02 5: ModbusCoil_Parse: 2 0 42 1 0
2014.10.05 14:47:02 4: RQUEUE: 2
2014.10.05 14:47:02 5: SimpleWrite [00 2B 00 00 00 06] 00 02 00 2B 00 01
2014.10.05 14:47:02 5: Received [00 2B 00 00 00 04] 00 02 01 00
2014.10.05 14:47:02 5: MB_S7 dispatch ModbusCoil:0:43:2:1:0
2014.10.05 14:47:02 5: ModbusCoil_Parse: 2 0 43 1 0
2014.10.05 14:47:02 4: RQUEUE: 1
2014.10.05 14:47:02 5: SimpleWrite [00 2C 00 00 00 06] 00 02 00 2C 00 01
2014.10.05 14:47:02 5: Received [00 2C 00 00 00 04] 00 02 01 00
2014.10.05 14:47:02 5: MB_S7 dispatch ModbusCoil:0:44:2:1:0
2014.10.05 14:47:02 5: ModbusCoil_Parse: 2 0 44 1 0
2014.10.05 14:47:03 5: AddRQueue [27 0E 00 00 00 06] 00 04 27 0E 00 01
2014.10.05 14:47:03 5: SimpleWrite [27 0E 00 00 00 06] 00 04 27 0E 00 01
2014.10.05 14:47:03 5: AddRQueue [00 28 00 00 00 06] 00 02 00 28 00 01
2014.10.05 14:47:03 5: adding to RQUEUE - 1
2014.10.05 14:47:03 5: AddRQueue [00 29 00 00 00 06] 00 02 00 29 00 01
2014.10.05 14:47:03 5: adding to RQUEUE - 2
2014.10.05 14:47:03 5: AddRQueue [00 2A 00 00 00 06] 00 02 00 2A 00 01
2014.10.05 14:47:03 5: adding to RQUEUE - 3
2014.10.05 14:47:03 5: AddRQueue [00 2B 00 00 00 06] 00 02 00 2B 00 01
2014.10.05 14:47:03 5: adding to RQUEUE - 4
2014.10.05 14:47:03 5: AddRQueue [00 2C 00 00 00 06] 00 02 00 2C 00 01
2014.10.05 14:47:03 5: adding to RQUEUE - 5


Ich hoffe das reicht so!? Der Anhang enthaelt ein Bild von dem tatsaechlichen Zustand der Ausgaenge!

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

ChrisD

Hallo,

Der Auszug aus dem Log ist perfekt. Ich habe aber ein Problem bei der Interpretation der Daten.

Hast du den Modbus-TCP Wizard von Siemens verwendet ?

Wenn ja, kannst du noch einen Screenshot vom Fenster 'Modbus TCP Adressen Abbildung' posten.

Danke,
ChrisD

pc1246

Hallo ChrisD

Nein ich habe den Wizard nicht benutzt! Ich habe aus dem SPS-Forum einen Modbus Server, den ich etwas modifizieren musste, da meine CPU etwas klein ist! Grundsaetzlich liegen meine Daten aber nur in einem DB155! Im S7 Code werden dann die entsprechenden Daten hin und herkopiert!
Natuerlich ist es Quatsch, dass ich die Ausgaenge direkt als schreibend angelegt habe, aber das lag einfach an der Uhrzeit! Ich habe im S7 auch die Abfrage der einzelnen Bits gesehen, aber irgendwie kommen die in fhem nicht richtig an! Heute abend kann ich das gerne noch mal schoen machen, so dass ich Dir dann alle Daten zur Verfuegung stellen kann!
Grundsaetzlich soll es aber so werden, dass ich zumindest die digitalen Ausgaenge direkt auf 10000ff legen wollte, so dass A 0.0 dann 10000 entspricht. Die "echten" Eingaenge analog dazu von 1-200, und danach dann Merker- bzw Datenbits!
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

ChrisD

Hallo,

Ich habe mir die Logs nochmal angesehen. Die Definition von A_5_0 führt durch das Mapping zum Lesen der Adresse 40 mit FC2. Als Antwort kommt der Wert 3 zurück, was bei einem Einzelbit-Zugriff nicht sein sollte.

Wenn du den Modbus-Baustein von L. Weiß verwendest sollte Adresse 40 DB155.DBX5.0 entsprechen. Kannst du ein Bild vom DB155 machen ? Der Rückgabewert von 3 wäre dann auch erklärbar da die Kopierschleife im FB ein Mal zuviel durchlaufen wird.

Grüße,

ChrisD

pc1246

Hallo

Ja das íst die Adresse und der Baustein! Heute abend klappt es dann wirklich, aber verstehen will ich das nicht! 5_1 wird ja richtig angezeigt, und die 5_0 gibt eine 3 zurueck, obwohl das eigene Bit gar nicht gesetzt ist. und was ist mit 5_3? Der ist voellig unter den Tisch gefallen! Wenn Du meinst, dass es an dem Baustein von L.Weiss liegt, dann setze ich mich erstmal an den ran, da der von mir eh umgebaut werden muss, da er ja so nicht in meine Steuerung passt (Lokaldatenspeicher)!
Danke fuer Deine Hilfe
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

pc1246

Hallo ChrisD
Der Hinweis mit der Kopierschleife war auch Gold wert! Schon geht es, da kann ich den Umbau erstmal hintenan stellen!
Danke nochmals
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

lechez

Hallo,

vielleicht kann mir jemand helfen mit MODBUS RTU.

Mein Stromzähler hat die Adresse 60 und das erste Holding Register möchte ich auslesen.

Habe es so gemacht:

define MB_RTU ModbusRTU /dev/ttyUSB1@9600
attr MB_RTU charformat 8E1
attr MB_RTU pollIntervall 5
attr MB_RTU verbose 5

define U_L1 ModbusRegister 60 30001
attr U_L1 plcDataType REAL_BE
attr U_L1 registerType Holding


als Antwort kommt:

2014.10.23 04:54:36 5: AddRQueue 3C 04 00 01 00 02 24 E6
2014.10.23 04:54:36 5: SimpleWrite 3C 04 00 01 00 02 24 E6
2014.10.23 04:54:36 5: Read 3C
2014.10.23 04:54:36 5: Read 3C 84 01
2014.10.23 04:54:36 5: Read 3C 84 01 13 0C
2014.10.23 04:54:36 5: Received 3C 84 01 13 0C
2014.10.23 04:54:36 2: ModbusRTU: except (code 1)

Es ich glaube er scheibt was (04) und liest nicht.

Vielleicht kann mir remand sagen wie ich ein Holding Register mit dem Modul auslese?

Gruß