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

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

Vorheriges Thema - Nächstes Thema

verkel

Hallo zusammen. Habe im Moment das gleiche Projekt und möchte meine Wago 750-881 mit Fhem steuern. Ich benutze es erstmal hauptsächlich für meine Jalousiesteuerung. Habe es jetzt hiermit probiert:

define Kind2_d ModbusCoil wago MX1.14
attr Kind2_d IODev SPS
attr Kind2_d writeMode Impulse:MX1.14


Der Impulse ist aber zu kurz für meinen Baustein (benutze einen von Wago). Kann man die zeit verlängern auf ca. 1 sekunde oder muss man das dann über einen anderen Mode machen?

Danke schon mal. Das alles hier hat mir sehr geholfen vor allen das von ChrisD :)

ChrisD

Hallo,

Du kannst bei writeMode zusätzlich die Impulslänge in Sekunden angeben, z.B.
attr Kind2_d writeMode Impulse:MX1.14:1.0
für 1 Sekunde.

Default sind 0.5 Sekunden was eigentlich ausreichen sollte.

Der writeMode ist dazu gedacht Zustand (von SPS gelesen) und Befehl zu trennen. Wenn du nur Impulse senden möchtest musst du immer 'on' verwenden, 'off' bewirkt nichts.

Alternativ kannst du in dem Fall writeMode komplett löschen und stattdessen on-for-timer benutzen:
set Kind2_d on-for-timer 1

Grüße,

ChrisD

golli

Jetzt passt es. Wie vergebe ich denn die Merker. Gibts da spezielle Bereiche?
Würde gerne alle digitale Ein- und Ausgänge mit in FHEM einbinden.

ChrisD

Hallo,

Du kannst bei der Deklaration von Variablen mit angeben ob sie an einer bestimmten Adresse liegen. Den möglichen Adressbereich findest du in CoDeSys in den Zielsystemeinstellungen bei Memory. Bei der 881 sollte 16#4000 stehen, was 16384 Bytes entspricht (MB0 - 16383, MW0 - 8191, MD0 - 4095). In diesem Bereich kannst du Daten ablegen auf die z.B. per ModbusTCP zugegriffen werden soll.

Welche Variable du wohin legst ist dir überlassen, du solltest aber darauf achten dass du keine Adresse doppelt belegst. So zeigen bei Wago z.B. MB400, MW200 und MD100 auf die gleiche Adresse.

Die Ein- und Ausgänge kannst du über Modbus direkt lesen, du musst sie nicht unbedingt auf Merker umkopieren.

Grüße,

ChrisD

verkel

Sorry für die vielleicht doofe Frage aber ich bin ziemlich neu in FHEM.

Hab es mit diesem Code hinbekommen aber der status ändert sich ja dabei nicht:
define Kind2_u ModbusCoil wago MX1.13
attr Kind2_u IODev SPS
attr Kind2_u writeMode Impulse:MX1.13:1.0


Aber wollte es dann auch mit diesem hier machen:
define Wohnzimmer_Links_Hoch ModbusCoil wago MX0.1
attr Wohnzimmer_Links_Hoch IODev SPS
set Wohnzimmer_Links_Hoch on-for-timer 1


Wenn ich jetzt auf die lampe klicke, wird es nicht für 1 sekunde geschaltet sondern normal für immer.

ChrisD

Hallo,

Kannst du weitere Details zu MX1.13, MX0.1 und der Funktionsweise des SPS-Programmes posten ? Es ist mir im Moment nicht klar was du genau machen möchtest.

ZitatHab es mit diesem Code hinbekommen aber der status ändert sich ja dabei nicht

Der Status kann sich nicht ändern weil du nur den Zustand des Befehls zurückliest.

Grüße,

ChrisD

verkel

Sorry für das schlechte erklären. Finde es klasse das hier so schnell auf Fragen geantwortet wird.

Habe mehrere Taster im Haus die über den Baustein (Bild als Anhang) die Jalousien steuern. Möchte jetzt zusätzlich über FHEM die Jalousien hoch und runter Tasten (muss über 0,5 sekunden sein) und dann den Ausgang sehen ob es fährt. Evtl nochmal später den Ausgang der Position visualisieren.
Baustein ist als Anhang und die Deklaration.
Danke schon mal im voraus.

ChrisD

Hallo,

Du könntest es hiermit versuchen:

define m_a_wohn_1_u ModbusCoil wago MX2.0
attr m_a_wohn_1_u event-on-change-reading .*
attr m_a_wohn_1_u eventMap on:auf
attr m_a_wohn_1_u webCmd auf
attr m_a_wohn_1_u writeMode Impulse:MX0.1:1.0

define m_a_wohn_1_d ModbusCoil wago MX2.1
attr m_a_wohn_1_d event-on-change-reading .*
attr m_a_wohn_1_d eventMap on:ab
attr m_a_wohn_1_d webCmd ab
attr m_a_wohn_1_d writeMode Impulse:MX0.2:1.0


Im Moment hast du in der Variablendeklaration 'm_a_wohn_1_u' und 'm_a_wohn_1_d' auf der gleichen Adresse (%MX2.0) liegen, für den Vorschlag habe ich m_a_wohn_1_d auf %MX2.1 verschoben.

Im Detail:

define m_a_wohn_1_u ModbusCoil wago MX2.0
define m_a_wohn_1_d ModbusCoil wago MX2.1

legt fest wo sich der Zustand (in diesem Fall die Ansteuerung) befindet. Damit solltest du bei Verwendung der Taster sehen wenn der Ausgang schaltet

attr m_a_wohn_1_u writeMode Impulse:MX0.1:1.0
attr m_a_wohn_1_d writeMode Impulse:MX0.2:1.0

legt fest dass die Befehle als Impulse auf eine andere Adresse umgeleitet werden sollen

attr m_a_wohn_1_u webCmd auf
attr m_a_wohn_1_d webCmd ab

sorgt dafür dass im Web-Interface statt 'on' und 'off' die Texte 'auf' und 'ab' stehen.

attr m_a_wohn_1_u eventMap on:auf
attr m_a_wohn_1_d eventMap on:ab

wandelt die Befehle 'auf' und 'ab' aus dem Web-Interface intern in 'on' um damit der Impuls an die SPS geschickt wird.

Grüße,

ChrisD

verkel

#368
Ich bin begeistert. Es klappt. Genauso wollte ich es haben. Besten dank :)

golli

Nach diesem Beispiel http://voizchat.de/gaszaehler-verbrauch-erfassen-mit-fhem-und-raspberry-gpio/
würde ich nun gerne vom digitalen Eingang der Wago über Modbus auch den Gasverbrauch loggen.

Habe das mal versucht anzupassen, aber irgendwie will es nicht.

define Gaszaehler ModbusCoil wago IX7.15

define Gasverbrauch HourCounter Gaszaehler:on Gaszaehler:off

ChrisD

Hallo,

Kannst du die einzelnen Teile der Übertragungskette überprüfen:

- Impulse an der Klemme sichtbar ?
- Impulse im SPS-Programm sichtbar ? Wie groß ist die Impulsdauer ? Falls der Impuls zu kurz ist, kann FHEM ihn nicht sehen. In dem Fall musst du den Impuls in der SPS verlängern.
- Impulse im 'Gaszaehler' sichtbar ? Was passiert wenn du eine Brücke auf den Eingang machst, ändert der Wert in FHEM ?

Eine Alternative wäre die Impulse direkt in der SPS zu zählen (z.B. mit CTU) und nur den Zählwert an FHEM zu übertragen. Damit würdest du den Timing-Problemen aus dem Weg gehen.

Grüße,

ChrisD


golli

So konnte den Fehler eingrenzen. Irgendwas stimmt mit meinem Bus nicht. Habe die SPS neu gestartet und es geht für ein paar Tage.
Dann wird wieder kein Gasverbrauch aufgezeichnet. Der digitale Eingang der SPS registriert den Impuls jedoch.
Über Fhem kann ich Lampen über den Bus jedoch noch schalten.

pc1246

Moin golli
Hast Du den Rat von ChrisD befolgt? Wenn Dein Impuls nicht lang genug ist, dann laufen die SPS und fhem irgendwann auseinander. Das heisst es geht mal gut und mal nicht, Du solltest das entweder auf der SPS machen, und das Ergebnis an fhem senden, oder eben den Impuls verlaengern!
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

golli

So mit dem Bus scheint eine einmalige Sache zu sein. Fhem zählt nun weiter ohne Abbrüche.
Aber wie ihr schon geschrieben habt, verschluckt er hier und da einen Impuls.
Würde das gerne mit einem CTU in der SPS lösen. Dieser zählt jedoch nur bis 32767.
Man könnte vielleicht drei hintereinander schalten, aber auf Kosten der Auflösung.
Jemand eine bessere Idee?

ChrisD

Hallo,

Es gibt mehrere Möglichkeiten die Begrenzung des CTU zum umgehen:
- selbst zählen, z.B.:
RT_Gaszaehler(CLK:=iGaszaehler)
IF RT_Gaszaehler.Q THEN Gasverbrauch:=Gasverbrauch+0.01; END_IF;

wobei Gasverbrauch als REAL deklariert sein muss, z.B. auf MD1000.
Denn Zähler kannst du dann in FHEM mit
define Gasverbrauch ModbusRegister wago MF1000
anlegen

- 2 CTU hintereinander schalten, der 1. zählt die Nachkommastellen bis 100, der 2. zählt die Ausgangsimpulse des ersten. An FHEM kannst du dann den Wert des 2. übertragen

- 32-Bit Zähler aus einer Bibliothek verwenden, z.B. OSCAT COUNT_DR

Grüße,

ChrisD