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,

Der Temperaturwert von ZWave_SENSOR_MULTILEVEL_5 enthält nicht nur die Temperatur sondern auch die Einheit. Diese kannst du aber nicht auf ein Register schreiben. Du musst den Wert von der Einheit trennen, eine Variante ist
Define read.Power at +*00:00:10 { fhem "set Leistung " . (ReadingsVal('Kostal','AC.Power',99)+0) }
die aber zu einer Warnung im Log führt. Wenn du es 'sauber' haben möchtest kannst du z.B.
Define read.Power at +*00:00:10 {my @x=split / /,ReadingsVal('ZWave_SENSOR_MULTILEVEL_5','temperature',99);; fhem "set Temperatur ".$x[0]}verwenden.

Grüße,

ChrisD

yogi74

Hey, you are the man.

Vielen Dank, funktioniert auf anhieb  ;D ;D

StinkyHexor

#392
Ich hoffe die Frage wurde nicht schon beantwortet.

Ich habe eine Variable FHEM_Schalter_WZ_Deckenlicht als BOOL auf der Wago. (MX0.0)
Warum kann ich diese Variable nicht an einem Baustein als VAR_IN_OUT benutzen?
Als Fehlermeldung kommt das der Baustein eine Variable mit Schreibzugriff benötigt.

Danke für jeden Tip.


*Edit*
Ich lass es mal stehen, aber es gibt dafür keine Lösung. Das Schreiben aus einem FB in einen Merker funktioniert nicht.
Eine Ausführliche Beschreibung habe ich hier gefunden: https://www.sps-forum.de/codesys-und-iec61131/47586-var_in_out-mit-merker.html

Dann muss ich es in der Wago doch nochmal anders machen.

uwe85

Hallo,

seit Weichnachten versuche Modbus mit B&R Steuerung komunizieren.

Bis heute schaffe ich die Register hin und herschicken  die Bit schreiben funktionierts, aber lesen nicht, ich vermute dass att fehlte/stimmte etwas nicht.

Logabzug:2017.01.23 14:36:34 5: AddRQueue [20 00 00 00 00 06] 01 03 20 00 00 01
2017.01.23 14:36:34 5: SimpleWrite [20 00 00 00 00 06] 01 03 20 00 00 01
2017.01.23 14:36:34 5: AddRQueue [60 00 00 00 00 06] 01 03 60 00 00 01
2017.01.23 14:36:34 5: adding to RQUEUE - 1
2017.01.23 14:36:34 5: AddRQueue [00 00 00 00 00 06] 01 01 00 00 00 08
2017.01.23 14:36:34 5: adding to RQUEUE - 2
2017.01.23 14:36:34 5: AddRQueue [40 00 00 00 00 06] 01 01 40 00 00 08
2017.01.23 14:36:34 5: adding to RQUEUE - 3
2017.01.23 14:36:34 5: ModbusTCPServer_Parse: received [20 00 00 00 00 05] 01 03 02 00 7B
2017.01.23 14:36:34 5: Modbus_BuR: dispatch ModbusRegister:1:8192:3:1:123
2017.01.23 14:36:34 5: ModbusRegister_Parse: 3 1 8192
2017.01.23 14:36:34 4: RQUEUE: 3
2017.01.23 14:36:34 5: SimpleWrite [60 00 00 00 00 06] 01 03 60 00 00 01
2017.01.23 14:36:34 5: ModbusTCPServer_Parse: received [60 00 00 00 00 05] 01 03 02 01 41
2017.01.23 14:36:34 5: Modbus_BuR: dispatch ModbusRegister:1:24576:3:1:321
2017.01.23 14:36:34 5: ModbusRegister_Parse: 3 1 24576
2017.01.23 14:36:34 4: RQUEUE: 2
2017.01.23 14:36:35 5: SimpleWrite [00 00 00 00 00 06] 01 01 00 00 00 08
2017.01.23 14:36:35 5: ModbusTCPServer_Parse: received [00 00 00 00 00 03] 01 81 02
2017.01.23 14:36:35 2: ModbusTCPServer_Parse: except (code 2)
2017.01.23 14:36:35 4: RQUEUE: 1
2017.01.23 14:36:35 5: SimpleWrite [40 00 00 00 00 06] 01 01 40 00 00 08
2017.01.23 14:36:35 5: ModbusTCPServer_Parse: received [40 00 00 00 00 03] 01 81 02
2017.01.23 14:36:35 2: ModbusTCPServer_Parse: except (code 2)
2017.01.23 14:36:44 5: AddRQueue [20 00 00 00 00 06] 01 03 20 00 00 01
2017.01.23 14:36:44 5: SimpleWrite [20 00 00 00 00 06] 01 03 20 00 00 01
2017.01.23 14:36:44 5: AddRQueue [60 00 00 00 00 06] 01 03 60 00 00 01
2017.01.23 14:36:44 5: adding to RQUEUE - 1
2017.01.23 14:36:44 5: AddRQueue [00 00 00 00 00 06] 01 01 00 00 00 08
2017.01.23 14:36:44 5: adding to RQUEUE - 2
2017.01.23 14:36:44 5: AddRQueue [40 00 00 00 00 06] 01 01 40 00 00 08
2017.01.23 14:36:44 5: adding to RQUEUE - 3
2017.01.23 14:36:44 5: ModbusTCPServer_Parse: received [20 00 00 00 00 05] 01 03 02 00 7B
2017.01.23 14:36:44 5: Modbus_BuR: dispatch ModbusRegister:1:8192:3:1:123
2017.01.23 14:36:44 5: ModbusRegister_Parse: 3 1 8192
2017.01.23 14:36:44 4: RQUEUE: 3
2017.01.23 14:36:44 5: SimpleWrite [60 00 00 00 00 06] 01 03 60 00 00 01
2017.01.23 14:36:44 5: ModbusTCPServer_Parse: received [60 00 00 00 00 05] 01 03 02 01 41
2017.01.23 14:36:44 5: Modbus_BuR: dispatch ModbusRegister:1:24576:3:1:321
2017.01.23 14:36:44 5: ModbusRegister_Parse: 3 1 24576
2017.01.23 14:36:44 4: RQUEUE: 2
2017.01.23 14:36:44 5: SimpleWrite [00 00 00 00 00 06] 01 01 00 00 00 08
2017.01.23 14:36:44 5: ModbusTCPServer_Parse: received [00 00 00 00 00 03] 01 81 02
2017.01.23 14:36:44 2: ModbusTCPServer_Parse: except (code 2)
2017.01.23 14:36:44 4: RQUEUE: 1
2017.01.23 14:36:44 5: SimpleWrite [40 00 00 00 00 06] 01 01 40 00 00 08
2017.01.23 14:36:44 5: ModbusTCPServer_Parse: received [40 00 00 00 00 03] 01 81 02
2017.01.23 14:36:44 2: ModbusTCPServer_Parse: except (code 2)


Attr hatte vieles ausprobiert und finde nichts zum laufen,
obrige logs steht folgende Parameter:
defmod BuRlesenBit ModbusCoil 1 1
attr BuRlesenBit IODev Modbus_BuR
attr BuRlesenBit room B und R
attr BuRlesenBit source Input
attr BuRlesenBit verbose 5


lösung und erklährung wär mir dankbar..

ChrisD

Hallo,

Der Controller liefert beim Lesen der Adressen 0 und 16384 eine Fehlermeldung. Code 2 bedeutet dass die angeforderte Adresse nicht erlaubt ist. Welche Steuerung verwendest du ?

Grüße,

ChrisD

uwe85

Hallo ChrisD,

Benütze aktuellste von B&R AS4 und die X20CP1382

Dort kann bei Konfigurator Modbus Stuktur aufbauben/ adressieren und Variablen anbinden für E/A oder Programm
ID ist sowie die 1 . Element Nummer hab ich als Standard genommen:
Coil:16384
Discrete : 0 + 1
InputReg:8192
Holding Reg:24576

wie gesagt alles funktioniert außer Discrete
und bei der SPS Seite zählt FehlerConter hoch beim abfragen.

pc1246

Moin
Ich waere vorsichtig beim benutzen von "identifiern" als Name! Benenne probehalber mal coil um!?
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,

Kannst du versuchen ob es mit
attr BuRlesenBit disableRegisterMapping 1
attr BuRlesenBit source Input

funktioniert ?

Wenn ja, kann es sein dass du einen Offset von 1 bekommst, in dem Fall musst du die Definition anpassen:
defmod BuRlesenBit ModbusCoil 1 0

Grüße,

ChrisD

uwe85

Hallo,

lösung gefunden: Sollte bei der SPS B&R  8 Bit für Input auflegen , anscheinend holt FHEM Byteweise ab , denk ich.

Daten austausch funktioniert nun,   so jetzt fange mit Projekt an.

Danke nochmals.

Gruss Uwe

der-Lolo

Hallo ChrisD,
endlich bin ich dazu gekommen einen FunctionBlock aus der Taster Dimm DMX Geschichte zu machen...
Bis hierher war es ja so das der Slider sowohl auf änderungen aus der SPS heraus reagierte, als auch damit die möglichkeit bestand den Wert zu verändern.

Bei meiner jetzigen Version mit einen FB funktioniert das leider nicht mehr. Ich habe auch keine Idee mehr woran das liegt.
Vielleicht schaust Du mal darauf - ich habe ein paar Screenshots gemacht.
Würde mich freuen wenn Du mir sagen kannst wo mein Denkfehler liegt.

ChrisD

Hallo,

Die Verbindung zu FHEM erfolgt über die Variable F_LL_Schlafen1, diese ist aber nicht mit dem Baustein verbunden. Wenn du F_LL_Schlafen1 mit dem Ausgang F_LightLevel verbindest kannst du zwar den Wert in FHEM sehen, ihn aber nicht ändern.

Eine Möglichkeit ist die Variablendeklaration des Bausteines so zu ändern dass LightLevel as IN_OUT übergeben wird:
VAR_INPUT
OnSwitch : BOOL;
OffSwitch : BOOL;
F_Trigger : BOOL;
F_preSet : INT;
END_VAR
VAR_IN_OUT
LightLevel : INT;
END_VAR
VAR_OUTPUT
F_response : BOOL;
DMX_Value : BYTE;
END_VAR


Den Ausgang DMX_Value habe ich hinzugefügt damit der Wert direkt ins Array abDMX_Values geschrieben werden kann.

Im FB hat der Schritt 6 keine Funktion da die Ausgangsvariable im Schritt 7 überschrieben wird. Einer von beiden kann entfallen.

Schritt 8 würde ich ersetzen durch Bild_1.

Der Aufruf des Bausteines könnte dann wie in Bild_2 gezeigt erfolgen. Schritt 2 aus dem Hauptprogramm (INT_TO_BYTE) ist damit nicht mehr nötig.

Grüße,

ChrisD




der-Lolo

Tausend Dank!

Mal wieder funktioniert alles wie gewünscht.
Am Ende hast Du unser Haus programmiert ;-)

Jetzt kann es endlich weiter gehen...
Du hörst sicher von mir.

vicky

Hallo zusammen,
ich bin am Versuch meinen CX1010(Beckhoff) mit dem FHEM zu verbinden und den Wert einer REAL-Variable zu lesen/schreiben.
Leider bisher ohne Erfolg.

Eine Verbindung besteht.
Das Lesen der Variable funktioniert dennoch nicht(siehe Anhang FHEM1.png).
Zumindest denke ich das, da ich nur 3 Fragezeichen sehe.
Oder bin ich da falsch? Kann ich bei der Ansicht "Everything" keine Werte sehen?


Definiert habe ich(siehe fhem.cfg):
FHEM:
define CX1010 ModbusTCPServer 172.16.17.20:801
define SPS_Real ModbusRegister CX1010 MF400
PLC:
F_400    AT %MD400 : REAL    ; (*Modbusadresse 12688*)

Kennt sich jemand von euch mit der Anbindung an Beckhoff-SPSen aus.
Gibt es da besondere Definitionen

Ich vermute, das sich das CX1010-System irgendwie anderst ansprechen lässt als WAGO-SPSen.

Folgende Anhänge:
Konifg: "fhem.cfg",
Web/PLC: FHEM1.png
Version: FHEM Version1.png


Danke schon mal im Voraus
vicky

ChrisD

Hallo,

Bist du dir sicher dass der Port 801 ist. Wenn ich die Dokumentation von Beckhoff richtig verstehe ist das der ADS-Port.

Die Definition
define SPS_Real ModbusRegister CX1010 MF400
kann eigentlich nur mit Wago-Steuerungen verwendet werden da das Modul das Mapping von Wago kennt. Nach ModbusRegister muss auch 'wago' stehen.

Das Default-Mapping von Beckhoff scheint aber für die Merkerbereiche ähnlich wie das von Wago zu sein, MW0 liegt wie bei Wago auf Adresse 12288. Du könntest also folgende Definition probieren:

define CX1010 ModbusTCPServer 172.16.17.20:502
define SPS_Real ModbusRegister wago MF400


Da ich das interne Speicherlayout von Beckhoff nicht kenne ist es auch möglich dass eventuell
define SPS_Real ModbusRegister wago MF200funktioniert.

Grüße,

ChrisD

vicky

Hallo ChrisD,

ZitatBist du dir sicher dass der Port 801 ist. Wenn ich die Dokumentation von Beckhoff richtig verstehe ist das der ADS-Port.
Nein.
Ich habe mit dem Port 502 nur keine Verbindung bekommen. Daher habe ich den mir bekannten Port benutzt. Der meldet nach dem "define cx801 ModbusTCPServer  172.16.17.20:801" auch schön "opened". Port "502" eben nicht.
Siehe Anhang (FHEM2.png).
Dort habe ich explizit nochmal 2 separate Definitionen angelegt:
1. define cx502 ModbusTCPServer  172.16.17.20:502
2. define cx801 ModbusTCPServer  172.16.17.20:801



Jetzt ist es halt so, das ich die 27 Seiten dieses Threads hier durchgegangen bin, da mit dem Suchbegriff "BECKHOFF" dieser auch auftauchte.
Darin schreiben ja der ein oder andere(bk9050, der-Lolo), daß Sie mit Beckhoff-Hardware arbeiten und es wohl funkioniert.
Oder geht's so doch nicht? Das konnte ich nirgends rauslesen.
Ich verwende einen CX1010(Windows Embedded) mit TwinCat 2.11

Evenutell sollte meine Anfrage auch in einen eigenen Thread verschoben werden, um Diesen nicht zu zerpflücken.