neues Modul: SIEMENS Anbindung / S7 / Siemens Logo

Begonnen von charlie71, 12 August 2014, 15:33:23

Vorheriges Thema - Nächstes Thema

ThomasRamm

Zitat von: zicki am 09 Oktober 2014, 12:46:16
Hallo zusammen,

ich arbeite gerade selber an einem Modul mit libnodave als Grundlage. Ich möchte eine Verbindung zur S7 200 (CP 243-1) aufbauen. Klapt auch ganz gut, allerdings stürzt die FHEM komplett ab wenn der CP nicht erreichbar ist. Wie sieht das bei dem 44_S7.pm Modul aus? Hat jemand ähnliches Verhalten beobachten können oder ist das kein Problem?
Ich werde das Modul mal testen allerdings muss ich erst meinen Raspberry neu aufsetzen. Werde dann berichten.

Was spricht gegen die Nutzung des Moduls aus diesem Thread oder des Moduls: http://forum.fhem.de/index.php/topic,27577.0.html?
Mein Modul läuft bei mir fehlerfrei und sehr performant.
Wenn du den Define-Teil um die Anbindung an deine S7 200 erweiterst kannst du DB bereits lesen und schreiben :-)

Würde mich freuen wenn wir evtl. gemeinsam an einem Modul arbeiten könnten.
Mir fehlt z.B. aktuell die Möglichkeit Analoge Werte zu verarbeiten, sowie Ein- Ausgänge und Merker. Da die Grundlogik steht ist das ganze nicht mehr sehr aufwendig.
Fliege leider übermorgen für 2 Wochen in die USA und habe deshalb nicht so viele Möglichkeiten, wollte Unterwegs mein Modul um eine "dummy"-Definition erweitern damit man zum testen auch ohne SPS arbeiten kann. Dann gäbe es einfach mehrere Parameter S5,S7,dummy,S7200 mit dem ein und dasselbe Modul aufgerufen werden kann. Dies entspräche auch eher dem Prinzip von FHEM.
Je nachdem wie weit dein eigenes Modul ist könnte ich mir aber auch vorstellen dich bei der Weiterentwicklung deines Moduls zu Unterstützen und dafür meins zu löschen.

Gruß
Thomas

zicki

#16
Sorry,

nicht falsch verstehen, es spricht absolut nichts dagegen das Modul aus dem Thread zu verwenden habe es allerdings gesten erst gefunden! Naja kommt immer darauf an wie man sucht  ;) . Bin gerade noch bei meinen Raspberry neu aufzusetzen dann werde ich es testen. Bin allerdings dann auch eine Woche im Urlaub werde mich dann auf jeden Fall melden und berichten.

Gruß Zicki
Raspberry PI 2 Jessie mit FHEM; FritzBox 7580 FritzOS 06.83; S7 200 für Heizung und Solar;AVR-NET-IO informiert die S7 200 über das Wetter von morgen und die aktuellen Temperaturen (5x 1-Wire)im Solarspeicher sowie 1x AVR-NET-IO mit Ethersex 10x 1-Wire Raumtemperaturen und Status Fensterkontakte

ThomasRamm

Würde mich freuen wenn wir uns zur weiteren Entwicklung zusammenfinden können.
Meine Anfangsintension war seinen Code um eine Unterstützung für meine S5 zu erweitern (mein erster Beitrag in diesem Thread).
Charlie71 hat sich leider nach seinem Anfangsthread nie wieder gemeldet so dass ich nach und nach immer mehr seines Codes geändert habe. Auch die aktuellen Diskussionen in diesem Thread habe ich bzw. werde ich noch in meinem Code einfließen lassen.
Was ich an seinem Code alles geändert habe:
Einen Nachteil sah ich darin das man entweder lesende oder schreibende Logische Module definieren konnte, ich aber gerne die Bits- lesen und schreiben wollte (Also eine Lampe mit lesendem Status und demselben schreibenden Bit zum steuern).
Die systemlast bei 130 logischen Modulen war bei meinem Raspberry bei über 70%, weshalb ich die ganze Lese-Schreib Logik komplett neu aufgesetzt habe.
Im Log wurden einige Fehler angezeigt die ich alle "weg" haben wollte
Die Stati (on/off) wurden nicht automatisch erkannt und mit default-Symbolen versehen
Eine doppelte Definition der zu lesenden Bereiche einmal am physikalischen und dann nochmal an den logischen Modulen fand ich zu umständlich.
Ich habe bei der arbeit noch ein paar Bugs gefunden die dazu führen das das Modul in bestimmten Konfigurationen nicht funktionieren würde, das habe ich auch noch in meinem Code behoben.

Könntest du dich denn damit anfreunden das wir gemeinsam ein Modul entwickeln? Ich kenne deinen Code nicht und kann deshalb nicht einschätzen welche Codebasis besser wäre. Verfolgst du evtl. noch ein anderes Konzept zum Verwalten der Daten?

Gruß
Thomas

goerdi

Hi !

Kann viell. mal einer beschreiben was an der Logo eingestellt werden muss und wie die libnodave gepatcht werden sollte...
ich habe mir die 0.8.5 kompiliert und hänge immer noch noch test mit testISO_TCP =>
IF1 error in daveConnectPLC() step 1. retrying...IF1 error in daveConnectPLC() step 1. retrying...IF1 error in daveConnectPstep 1. retrying...Couldn't connect to PLC.
Please make sure you use the -2 option with a CP243 but not with CPs 343 or 443.


Ciao Gerd

pc1246

Hallo Ihr zwei Urlauber
Jetzt sollten ja alle wieder da sein! Ich bin auch sehr interessiert an Eurem Modul! Wie Ihr sehen koennt, habe ich per Modbus schon eine Verbindung zur S7 aufgebaut! Das ist leider aber auch nicht trivial, udnd was fuer mich schlimmer ist, sehr Speicherlastig in der S7! Das waere mit der libnodave dann weg, und der Zugriff ist auch einfacher, aber es faengt schon mit dem Einbinden der libnodave an! Grundsaetzlich funktioniert es wohl, aber mit den Beispielen, komme ich, wie andere auch, erstmal zum freeze von fhem! Ok, lesen hilft, und das Problem ist schnell behoben, aber wo kommen die Anweisungen her, warum gehen die nicht, usw. usw.! Auch ist es ja nicht zielfuehrend, dass alles ueber einen Kamm geschoren wird: Logo, S5 und S7! Jeder kuemmert sich um das, was er hat und gerade braucht, und der Rest bleibt auf der Strecke, obwohl Name des Threads etwas anderes suggerieren!
Ich wuerde gerne helfen, bin aber zugegebenermassen annaehernd unbeleckt, was Programmierung in Perl o.ae. betrifft. Ich kann aber relativ gut vorhandenen Code lesen, analysieren und pruefen oder korrigieren!
Mein Interesse liegt derzeit klar in der Kommunikation mit der S7, was ich auch realisieren kann, da ich eine im Keller habe! Wie waere es also, wenn wir uns irgendwie zusammentun (Oh weh, GIT ist zwar toll, aber verstanden habe ich es nicht wirklich) und etwas zusammenbauen, was dann wirklich allen gerecht wird!
Mit S5 bin ich auch mehr oder minder per Du, ab und zu darf ich noch mal eine begluecken, aber leider habe ich keinen direkten Zugriff auf eine! Logo's hatte ich mal, aber in Ermangelung der, jetzt vorhandenen, Ethernetschnittstelle, habe ich mich dann zu Gunsten einer S7-300 von Ihnen getrennt!
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

ThomasRamm

Ja du hast recht, bin inzwischen wieder seit einer Woche zurück, war aber leider nicht im Urlaub unterwegs sondern musste dienstlich in die USA. Urlaub gibt es erst wieder zu Weihnachten.

Zu deiner eigentlichen Frage, ja ich würde mich über eine Teamarbeit sehr freuen, sehe da ganz klar die Vorteile der Codequalität, Support, Testen, etc.
Wir müssten klären welcher Code die Grundlage sein soll und wie wir uns die Arbeit aufteilen wollen (insbesondere an zicki gerichtet).

@zicki: würdest du mir deinen Code mal zusenden dann könnte ich ihn mir mal anschauen.
Kannst du eine Einschätzung geben welcher Code als gemeinsame Grundlage die bessere Wahl ist?

Zur Zeit bin ich privat in einem anderen Programmierprojekt stärker eingebunden, aber wenn dort das nächste Release fertig ist habe ich wieder mehr Zeit und definitiv auch die Motivation hier weiter zu machen.

Gruß
Thomas

zicki

Hallo pc1246,

wenn du an deiner S7 300 einen Ethernet CP zu stecken hast welcher TCP unterstützt ist die Kommunikation auch ohne ein Modul in der FHEM sehr einfach. Habe es bei mir schon selber probiert man legt in der FHEM einfach einen Dummy (z.B. "SPS_Werte") an welchen mann dann mit dem Befehl aus der SPS (zuvor muss eine Verbindung in der Hardware zu FHEM Port 7072 angelegt werden) dann mit set SPS_Werte xxx beschreibt. Andere Richtung funktioniert es ähnlich. Wenn du diesen Weg mal probieren möchtest, dabei könnte ich dich unterstützen.

Gruß zicki
Raspberry PI 2 Jessie mit FHEM; FritzBox 7580 FritzOS 06.83; S7 200 für Heizung und Solar;AVR-NET-IO informiert die S7 200 über das Wetter von morgen und die aktuellen Temperaturen (5x 1-Wire)im Solarspeicher sowie 1x AVR-NET-IO mit Ethersex 10x 1-Wire Raumtemperaturen und Status Fensterkontakte

pc1246

Hallo Zicki
Da bin ich schon interessiert dran, nur hoert es sich erst einmal etwas kryptisch an! Was brauche ich denn wo? Abgesehen von TCP-CP auf S7-Seite und Lan auf fhem-Seite?
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

zicki

Hallo pc1246

ich weiß nicht wie fit du in Step7 bist somit habe ich dir eine kleine Anleitung zusammengebastelt.

Gruß zicki
Raspberry PI 2 Jessie mit FHEM; FritzBox 7580 FritzOS 06.83; S7 200 für Heizung und Solar;AVR-NET-IO informiert die S7 200 über das Wetter von morgen und die aktuellen Temperaturen (5x 1-Wire)im Solarspeicher sowie 1x AVR-NET-IO mit Ethersex 10x 1-Wire Raumtemperaturen und Status Fensterkontakte

pc1246

Hallo Zicki
Das hoert sich jetzt eher einfach an! Ich habe die fhem-Seite nicht verstanden! Ist die Dummyvariable automatisch richtig? Wieviel passt da rein, und ASCII ist ja nicht zwingend sinnvoll, wenn ich bits, bytes usw. brauche! Wie kriege ich das zudem wieder auseinander? Und warum landet das an der richtigen Stelle? Da fehlt doch etwas, oder?
Gruss Christoph

P.S.: S7-Seite ist kein Problem!
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

zicki

Hallo pc1246

die Dummyvariable ist natürlich nicht automatisch richtig. Es war nur ein Beispiel. Über diese Verbindung kann jetzt auch wie in der FHEM direkt eine Variable gesetzt werden. Ob Bit Byte Real ist egal, z.B. legst du eine Variable in der FHEM an "Fenster_WZ" mit set Fenster_WZ 1 kannst du die Variable auf 1 steuern und genau diesen Befehl sendest du auch von der CPU einfach die ASCII Zeichen senden und mit CR LF beenden. Wenn mann sich jetzt einen Datenbaustein nimmt in den man einige Variablen vorbereitet braucht man diese nur noch auswählen mit dem richtigen Wert versorgen oder man speichert diese gleich komplett mit Wert so braucht man sie bei einem bestimmten Ereignis nur noch zu senden. Um bei der Variable zu bleiben ist das Fenster auf sendet man set Fenster_WZ 1 $CR $LF oder bei geschlossenem Fenster set Fenster_WZ 0 $CR $LF oder auch set Fenster_WZ geschlossen $CR $LF wie auch immer du es in der FHEM brauchst. Also man braucht nichts hinterher auseinander frimel wenn es gleich an die richtige Stelle geschrieben wird.

Ich hoffe es hilft ein wenig weiter. Vielleicht auch mal per Telnet vom PC mit der FHEM verbinden das ist das gleiche lässt sich aber einfacher testen.

Gruß Zicki
Raspberry PI 2 Jessie mit FHEM; FritzBox 7580 FritzOS 06.83; S7 200 für Heizung und Solar;AVR-NET-IO informiert die S7 200 über das Wetter von morgen und die aktuellen Temperaturen (5x 1-Wire)im Solarspeicher sowie 1x AVR-NET-IO mit Ethersex 10x 1-Wire Raumtemperaturen und Status Fensterkontakte

pc1246

Hallo Zicki
Das klingt mir fast zu einfach! Da werde ich mich mal ranmachen! Aber erstmal muss mein fhem wieder laufen! SD-Karte gestorben, kein aktuelles Backup, und natuerlich nur Exoten am Start!
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

Neo2304

Hallo,

ich habe probiert mit dem Modul und einer S7-300 zu kommunizieren. Hat leider nicht geklappt.
FHEM hängt sich auf.

Mit der Libnodave testISO_TCP klappt es.

Gibt es schon eine 44_S7.pm Datei die mit einer S7 funktioniert?


Gruß Michael

goerdi

So ich habe jetzt mal fhem angeworfen und mit dem angehaengten Modul meine Logo's "bespasst"
Sieht gut aus, nur die Fehlermeldungen Irritieren mich

config
# Logo Definitions
define logokg S7 2 0 192.168.63.101 1 0 102 960
define logoeg S7 2 0 192.168.63.102 1 0 102 960
define logodg S7 2 0 192.168.63.103 1 0 102 960
define logoga S7 2 0 192.168.63.104 1 0 102 960


Log

2014.11.19 10:14:29 3: S7 Define: plcMPI=2, localMPI=0, ip_address=192.168.63.101,rack=1, slot=0, ip_port=102, PDULength= 960
2014.11.19 10:14:29 3: port handle: 11
2014.11.19 10:14:29 1: RÜCKMELDUNG PLC: 0=ok
2014.11.19 10:14:29 3: S7 Define: plcMPI=2, localMPI=0, ip_address=192.168.63.102,rack=1, slot=0, ip_port=102, PDULength= 960
2014.11.19 10:14:29 3: port handle: 12
2014.11.19 10:14:29 1: RÜCKMELDUNG PLC: 0=ok
2014.11.19 10:14:29 3: S7 Define: plcMPI=2, localMPI=0, ip_address=192.168.63.103,rack=1, slot=0, ip_port=102, PDULength= 960
2014.11.19 10:14:29 3: port handle: 13
2014.11.19 10:14:29 1: RÜCKMELDUNG PLC: 0=ok
2014.11.19 10:14:29 3: S7 Define: plcMPI=2, localMPI=0, ip_address=192.168.63.104,rack=1, slot=0, ip_port=102, PDULength= 960
2014.11.19 10:14:29 3: port handle: 14
2014.11.19 10:14:29 1: RÜCKMELDUNG PLC: 0=ok
[color=red]2014.11.19 10:14:29 1: configfile: 0
0
0
0[/color]


Wenn ich dann sets und attrs wie in den Posts vorher nehme hagelt es noch mehr Fehler....

Gruss Gerd

Cnetrwal

Hi

Ich habe mir das Modul angesehen und einige Dinge gefunden.
ich hoffe das es soweit passt.

Meine Voraussetzung:
Ich verwende ein LOGO 0BA7 und habe für meine ersten Tests nur reads konfiguriert.

define logo1 S7 2 0 192.168.20.43 0 0 102 960
attr logo1 ReadDB-Config 1 0 64
attr logo1 ReadOutputs-Config 1 0 2
define logo1_AM16_r1 S7_ARead db 1 0 s16
...
define logo1_Q1_r1 S7_DRead outputs 1 0
...

libnodave verwende ich in der Version 0.8.5.1

Zuallererst musste ich den erwähnten Patch nachvollziehen.
für mich ist folgende Lösung rausgekommen:
--------------------------------------------------------------------------------------------------------
--- PERL.ori/Nodave.xs  2009-07-11 21:03:44.000000000 +0200
+++ PERL/Nodave.xs      2014-11-20 17:42:58.602267634 +0100
@@ -865,6 +865,30 @@
        PUSHs(sv_2mortal(newSVpvn(&buffer[0],daveOrderCodeSize)));
        PUSHs(sv_2mortal(newSViv(rv)));

+
+void daveSetCommunicationType(dc, ct)
+    DaveConnection dc
+    int                ct
+  PROTOTYPE: $$
+  PPCODE:
+       daveSetCommunicationType(dc, ct);
+
+void setmaxPDUlength(dc, PDUlength)
+    DaveConnection dc
+    int           PDUlength
+  PROTOTYPE: $$
+  PPCODE:
+       dc->maxPDUlength=PDUlength;
+
+char * getlibnodaveversion()
+  PROTOTYPE:
+  CODE:
+       char libversion[]="8.5.1";
+        RETVAL = libversion;
+  OUTPUT:
+        RETVAL
+
+
MODULE = Nodave                PACKAGE = DaveInterface PREFIX = di_

void di_DESTROY(di)

--------------------------------------------------------------------------------------------------------

dieser Patch funktioniert für alle libnodave Versionen  >= 0.8.5
bei älteren Versionen muss die Funktion  daveSetCommunicationType weggelassen werden,
da diese noch nicht unterstützt wird.

nun zu den Änderungen in den Modulen:

Es gibt auch negative Floats ;)
diff -ur fhem_S7.orig/FHEM/44_S7_ARead.pm fhem_S7/FHEM/44_S7_ARead.pm
--- fhem_S7.orig/FHEM/44_S7_ARead.pm    2014-08-12 10:50:06.000000000 +0200
+++ fhem_S7/FHEM/44_S7_ARead.pm 2014-11-23 18:16:16.916643448 +0100
@@ -17,7 +17,7 @@

sub isfloat{
   my $val = shift;
-  return $val =~ m/^\d+.\d+$/;
+  return $val =~ m/^-*\d+.\d+$/;
}



0 modulo 3 ergibt auch 0 ist aber falsch
--- fhem_S7.orig/FHEM/44_S7.pm  2014-08-12 12:59:44.000000000 +0200
+++ fhem_S7/FHEM/44_S7.pm       2014-11-23 18:16:16.926643115 +0100
@@ -300,9 +316,11 @@
        my $name = $hash->{NAME};

        for (my $j = 0;$j < int(@areasconfig);$j++) {
-          my @a = split( "[ \t][ \t]*", AttrVal($name,@areasconfig[$j],""));
-          if (int(@a) % 3 == 0) {
+          my @a = split( "[ \t][ \t]*", AttrVal($name,$areasconfig[$j],""));
+          Log3 $name, 5,"readFromPLC ".$areasconfig[$j]." --> <".AttrVal($name,$areasconfig[$j],"")."> -- ".int(@a);
+          if (int(@a) % 3 == 0 and int(@a) != 0) {
                #we need to read some data out from the PLC
+               Log3 $name, 5,"readFromPLC Do $name ".$daveareas[$j]." --> <".AttrVal($name,$areasconfig[$j],"")."> -- ".int(@a);
                for (my $i = 0; $i< int(@a);$i+=3){
                        Log3 $name, 4, "S7: readFromPLC  ".$daveareas[$j].",".$a[$i].",".$a[$i+1].",".$a[$i+2];
                        my $res;


es sollten nur dispached werden  wenn für diese Aerea Devices definiert wurden.

@@ -312,20 +330,26 @@
                        #therefore we habe to notify the clients to get the data out
                        $res=Nodave::daveReadBytes($dc,$daveareas[$j],$a[$i],$a[$i+1],$a[$i+2]);

-                       my $dmsg = "A ".$areaname[$j]." ".$a[$i]." ".$a[$i+1]." ".$a[$i+2];
-                       $hash->{"${name}_MSGCNT"}++;
-                       $hash->{"${name}_TIME"} = TimeNow();
-                       $hash->{RAWMSG} = $dmsg;
-                       my %addvals = (RAWMSG => $dmsg);
-                       Dispatch($hash, $dmsg, \%addvals);
+                       if (defined($modules{S7_ARead}{defptr}{$areaname[$j]." ".$a[$i]}))
+                       {
+                               my $dmsg = "A ".$areaname[$j]." ".$a[$i]." ".$a[$i+1]." ".$a[$i+2];
+                               $hash->{"${name}_MSGCNT"}++;
+                               $hash->{"${name}_TIME"} = TimeNow();
+                               $hash->{RAWMSG} = $dmsg;
+                               my %addvals = (RAWMSG => $dmsg);
+                               Dispatch($hash, $dmsg, \%addvals);
+                       }


-                       my $dmsg = "D ".$areaname[$j]." ".$a[$i]." ".$a[$i+1]." ".$a[$i+2];
-                       $hash->{"${name}_MSGCNT"}++;
-                       $hash->{"${name}_TIME"} = TimeNow();
-                       $hash->{RAWMSG} = $dmsg;
-                       my %addvals = (RAWMSG => $dmsg);
-                       Dispatch($hash, $dmsg, \%addvals);
+                       if (defined($modules{S7_DRead}{defptr}{$areaname[$j]." ".$a[$i]}))
+                       {
+                               my $dmsg = "D ".$areaname[$j]." ".$a[$i]." ".$a[$i+1]." ".$a[$i+2];
+                               $hash->{"${name}_MSGCNT"}++;
+                               $hash->{"${name}_TIME"} = TimeNow();
+                               $hash->{RAWMSG} = $dmsg;
+                               my %addvals = (RAWMSG => $dmsg);
+                               Dispatch($hash, $dmsg, \%addvals);
+                       }

                }


Alles andere sind nur debug Meldungen
hoffe geholfen zu haben
SG

Christian