Sie sind hier

Haussteuerung mit der Siemens LOGO! 0BA7

 

Als unser neues Haus in Planung war, dachten wir sofort an eine Haussteuerung.

Ich hatte mir folgendes Konzept überlegt:

  1. Beschreibung des Hauses (inklusive aller Ein- und Ausgänge)  in xml
  2. Import der Hausbeschreibung in eine Datenbank
  3. Umwandlung der Hausbeschreibung in php Seiten
  4. Ein Stylesheet, das diesen Seiten ein hübsches Aussehen gibt
  5. Eine Steuerung, die auch auf dem Webserver läuft und zwischen Weboberfläche und der Steuerung vermittelt.

Soweit so gut. Erste Programierentwürfe, die den Weg einmal abbildeten, waren vielversprechend.

1. Hindernis - Die passende Programiersprache finden

Beruflich entwickle ich in c++ unter linux mit dem Framework Qt. Daher startete ich den ersten Entwurf mit dieser Umgebung auf meinem PC. Mein Mann (yt) besorgte aber als Hausrechner eine Diskstation von Synology. Ein sehr stromsparendes universell einsetzbares Ding, jedoch mit einem arm-Prozessor ausgestattet. Nach ein paar Stunden, die ich verschwendete, um meine Testentwicklung zu portieren, gab ich auf, es war zu aufwändig.

Qt ist einfach zu fett für so eine kleine Anwendung. Ich warf also alles in die Tonne und entschied mich Java zu benutzen. Wieder kostete es mich einige Stunden mein Testprogramm nach Java zu portieren.

Aber egal, für meinen Beruf ist es wichtig, immer wieder neue Sachen zu lernen.

2. Hindernis - Eine Bibliothek für die Logo finden

Unser Hauselektriker verbaut standardmäßig die Siemens LOGO!, da er mit anderen Bastellösungen Probleme bei größeren Kunden bekommen hatte. Dieses Ding, versicherte er uns, wäre robust und narrensicher und für ihn käme zur Zeit nichts anderes in Frage. Ok, dann also dieses Modul und zwar mit Ethernetanschluss(0BA7).

Erstmal nach einer Lib gegoogelt. Ergebnis: Es gibt eine kommerzielle Bibliothek von Siemens, aber mal wieder nur für Windows (Grrr). Nach einem Tipp eines Besuchers dieser Seiten, der freundlichweise einen Kommentar hinterliess, stiessen wir auf die freie Bibliothek libNodave. In C geschrieben, also für nahezu jede Maschine kompilierbar. Aber es gab auch eine Version in Java, zwar schon etwas älter als die Version in C, aber damit wollte ich es mal probieren.

3. Hindernis - Mit Logo in Verbindung treten

Logo Comfort SoftwareNun musste ich versuchen unsere Logo mit der libnodave anzusteuern. yt führte einen portscan auf dem Modul durch, aah port 10000 ist offen. Damit wir überhaupt mal das Innenleben der Logo kennenlernen und auch selber eine Änderung der Schaltung vornehmen konnten, besorgten wir das zugehörige Programm Logo!SoftComfort. Wie aufregend, als ich mir zum ersten Mal den Schaltplan auf meinen PC lud. Das Programm ist echt nett, mit der Maus klickt man Bausteine zusammen und anschließend kann man die gebastelte Schaltung in einer Simulation testen.  Es gibt sogar einen online Test für den aktiven Schaltplan. Wie gut. Da ich null Ahnung von Elektrik habe, fand ich so heraus welche Steckdosen und Lichtschalter an welchen Inputs und Outputs hingen.

Nun schnell das Testprogramm der libnodave ausgeführt und - Fehlermeldungen. Es konnte keine Verbindung aufgebaut werden.

Nach einigen Stöbern in diversen Seiten, google sei Dank, fand ich eine Anleitung, wie man eine Schnittstelle mit dem Programm Logo!SoftComfort einrichten muss. Nach weiteren Fehlversuchen fand ich heraus, dass man wohl den Code des Testprogramm der libnodave anpassen muss. Dieses versucht standardmässig eine Verbindung auf rack=0 und slot=2, für die logo muss es aber rack=1 und slot=0 sein. Den Port hatte ich auch schon auf 10000 geändert und einen neuen Versuch gestartet.

Juhu, das Testprogramm bekommt eine Verbindung und redet mit der Logo. Doch die Freude währte nur kurz. Die Kommunikation war zwar hergestellt, aber irgendetwas stimmte hier nicht. Das Java Testprogramm warf zwar irgendwelche Werte raus, aber als ich das C Testprogramm versuchte, das aufgrund des jüngeren Datums mehr Testparamter hatte, gab es merkwürdigerweise keine Verbindung. Ein Aufrufen des Testprogramms im Debugmode ergab folgende Ausgabe:

openSocket: enter OpenSocketopenSocket: OpenSocket: socket is 3
openSocket: Connected to host: logo
openSocket: setsockopt Success 0
send packet: :
0:0x03,0x00,0x00,0x16,0x11,0xE0,0x00,0x00,0x00,0x01,0x00,0xC1,0x02,0x01,0x00,0xC2,
10:0x02,0x02,0x00,0xC0,0x01,0x09,
readISOpacket: 7 bytes read, 256 needed
readISOpacket: packet:
0:0x06,0x03,0x01,0x00,0xC2,0x02,0x38,
IF1 daveConnectPLC() step 1. got packet: :
0:0x06,0x03,0x01,0x00,0xC2,0x02,0x38,
IF1 error in daveConnectPLC() step 1. retrying...readISOpacket: 7 bytes read, 192 needed
readISOpacket: packet:
0:0x06,0x03,0x00,0xC0,0x01,0x09,0x38,
IF1 daveConnectPLC() step 1. got packet: :
0:0x06,0x03,0x00,0xC0,0x01,0x09,0x38,
IF1 error in daveConnectPLC() step 1. retrying...timeout in ReadISOPacket.
IF1 daveConnectPLC() step 1. got packet: :
IF1 error in daveConnectPLC() step 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.

Eine Verbindung kam also zustande aber die Unterhaltung nicht so lief wohl nicht so wie erwartet. Was ist denn nun schon wieder verkehrt. Ich kam und kam nicht drauf.

Irgendwann meldete ich mich dann in einem SPS-Forum an und bekam dort auch nach einigen Stunden den entscheidenden Hinweis. Der Port 10000 ist falsch, der ursprünglich im Testprogramm eingestellte Port 102 ist schon der Richtige. Aber der war bei uns nicht offen. Der Fehler war, das ich zwar mit dem Logo!SoftComfort Programm eine Ethernet Schnittstelle eingerichtet hatte, diese muss aber auf die Logo hochgeladen werden!  Klar, dumm, dass ich das nicht sofort geschnallt habe, aber hinterher ist immer alles ganz einfach.

Nächster Versuch mit dem Testprogram - Wahnsinn, alles funktioniert wie erwartet. Ich kann mit der Logo reden.

Connected.
Trying to read 64 bytes (16 dwords) from data block 1.
DB1:DW0: 0
DB1:DW1: 0
...
DB1:DW32: 0
Trying to read 16 bytes from FW0.
FD0: 262144
FD4: 0
FD8: 0
FD12: 0.000000
Finished.

4. Hindernis - Die SPS verstehen

Nun musste ein eigenes Testprogramm her, mit dem ich die Ausgänge unserer Logo auslesen wollte. Den Rumpf übernahm ich aus dem Testprogramm (Aufbau der Verbindung usw.). Mit welchen Parametern musss ich jetzt die Funktion

dc.readBytes(int area, int DBnum, int start, int len, byte[] buffer)

richtig aufrufen. Ich wollte den Ausgang Nr. 5 wissen. Das ist die Beleuchtung in meinem Arbeitszimmer. In der Doku der libnodave fand ich folgendes Beispiel:

daveReadBytes(dc,daveOutputs,0,8,4,NULL).

Der Parameter DBnum (DB für DataBlock) wird hier nicht benötigt und der buffer auch nicht, also auf 0 setzen.

Na gut also schrieb ich:

dc.readBytes(Nodave.OUTPUTS, 0, 5, 2, null);

Die Werte die nach diesem Aufruf ausgespuckt wurden ergaben keinen Sinn, wenn ich das Licht an und ausschaltete. Also wieder in den Weiten des Internets stöbern. Dort stiess ich auf ein Projekt, das mir einen Denkanstoss gab. Wahrscheinlich waren unsere Ausgänge bitweise codiert und da wir 16 davon haben, mussten sie 2 Bytes belegen. Den Startparameter legte ich auf 0 anstatt 5, so dass der Aufruf folgerndermaßen aussah:

dc.readBytes(Nodave.OUTPUTS, 0, 0, 2, null);

und voilá, das wars. Mit diesem Aufruf purzelten alle Ausgänge korrekt heraus. Schaltete ich verschiedene Lampen an und aus, gab das der ausgespuckte Wert korrekt wieder.

5. Hindernis - Die SPS steuern

Der nächste und letzte Schritt war nun natürlich, das Licht per PC an- und auszuschalten. Also die Funktion dc.writeBytes gegriffen und analog dc.readBytes gefüllt, nur das diesmal der buffer benutzt werden muss. Leider tat sich da nun rein gar nichts. Stöhn, was war denn nun schon wieder das Problem. Nach einigem Lesen im iP-Symcom-Forum und Siemens-Technical-Forum ergab sich, dass die Ausgänge und Eingänge wohl nicht schreibbar sind. Sie werden durch das Logointerne Programm in jedem Zyklus wieder zurückgesetzt. Man kann nun entweder mit einem Timer arbeiten oder Merker ( wofür ich mich entschieden habe) setzen, also den Ausgang mit einem Merker und dem Eingang zu "verodern". Den Schaltplan habe ich erweitert und dann die Funktion so abgewandelt:

dc.writeBytes(Nodave.FLAGS, 0, 0, 1, myBuffer);

Das brachte den ersehnten Erfolg. Das Licht war vom PC an- und ausschaltbar. Da das Licht auf Bit 5 sitzt hab ich nur das erste Byte zurückgeschrieben. Schreibt man mehr als 1 Byte auf einmal zurück, muss man wohl erst die Bytes swappen, dafür bietet die libnodave auch die entsprechenden Funktionen.

Update: da bin ich noch am runprobieren, es  geht wohl auch wenn man 2 Byte zurückschreibt.

 


 

Wieviele Sternchen gibst du?: 
Average: 4.7 (9 votes)

Kommentare

Ich möchte ergänzen, dass wir im Nachhinein die Siemens Logo! nicht für eine Haussteuerung empfehlen würden.
Schon aus ethischen Gründen, denn der Siemens Konzern ist ohne jedes Gewissen und Moral auf Wachstum aus, wie Ferengis hinter dem in goldgepressten Latinum. Wie sehr Siemens sich an Rüstung und Diktaturen beteiligt und bereichert war uns zum Zeitpunkt der Entscheidung nicht ganz klar. Man möge es uns verzeihen. *sorry2*

Die Module sind nicht gerade günstig, die Software lässt keine Kommentarfunktion zu, es gibt keine vernünftige Schnittstelle für Rückmeldungen an ein User-Interface. Man merkt deutlich, dass Siemens hier einen alten Hut einfach versucht hat neu zu schmücken. Nach dem was ich im Internet über die Logo zu lesen fand, ist das beste was man über die Logo Module sagen kann, dass sie unkaputtbar sind und ewig halten. Immerhin. Eine geplante obsoleszenz hätte ich denen auch noch zugetraut. Und dann ist da noch dieses ...  Stuxnet Virus, ... zum Glück heizen wir nicht mit Kernkraft.

Wenn wir nocheinmal vor der Entscheidung stünden, würde ich mich um eine sinnvollere Alternative bemühen, die es ganz sicher schon gibt. Die Anforderungen sind dabei denkbar gering, wenn man davon ausgeht das wir beide Technikaffin sind und in der Lage selbst zu programmieren.

Mit gebastelten Grüßen,
yt

.. nennt euch René.. Das scheint mir sehr treffend. ;)
Ich wäre schon am Punkt1 gescheitert, fand es aber spannend zu lesen was "man mal so eben" programmieren kann.. Es würde mich interessieren ob "unsere" Programmierer in der Firma das so hinbekämen.. ;)

Wo muss ich ne Nummer ziehen wenn ich auch irgendwann mal so weit sein sollte? ^^

*respektvoll*

(add: ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ)

Der Fehler war, das ich zwar mit dem Logo!SoftComfort Programm eine Ethernet Schnittstelle eingerichtet hatte, diese muss aber auf die Logo hochgeladen werden!  Klar, dumm, dass ich das nicht sofort geschnallt habe, aber hinterher ist immer alles ganz einfach.

Ich vermute hier starken Bedarf einer Erklärung wie man das richtig macht. Ein paar Screenshots und eine Step-by-Step Erklärung wären gut.

Mit <3 Grüßen,
yt
 

He
kannst du mir vieleicht mach das program oder den quelltest des java programms zukommen lassen!

Wäre es möglich mal das komplette Coding zu sehen??
Ich krieg das nämlich nicht richtig zum Laufen. Verbindung und so funktioniert, aber die richtigen Ausgänge oder Merker lesen bzw. setzen klappt gar nicht.
Danke

Hier ein Auschnitt aus dem angepassten TestISOTCP.java.

Yt macht ventuell später nochmal Links auf den quellcode.

Viele Grüße Nemori

[edit from yt] Klick mich, ich bin ein Source Code Schnipsel
Ich vermut mal stark, da wird noch ein bisschen Erklärung zu folgen... irgendwann. Wenn mehr Zeit ist.
 

 

thank you for your explanation
Thanks to you I was able to develop my application

https://play.google.com/store/apps/details?id=hmi.oba7&feature=search_re....

Hallo,

ich stieß vor einigen Wochen auf eure Seite und fand viele nützliche Tips.
Danke hierfür!

Habt ihr auch versucht die Libnodave in ein C++ QT Projekt einzubinden?
Ich verzweifle zzt etwas daran, da bei jedem "iRet = daveConnectPLC(dc)" eine "-1" zurück kommt. Habt ihr evtl ähnliche Erfahrungen gemacht? Euren Java-Codeschnipsel habe ich bereits analysiert.

Danke
Ben

Mittlerweile habe ich das QT Projekt am Laufen.
Falls jemand daran Interesse hätte, könnte ich das komplette Projekt zur Verfügung stellen.

Moin Benjamin,

Da kommt bestimmt bald Interesse auf. Wäre toll wenn du ein URL oder Mailadresse einträgst, damit wir dich erreichen können, sobald die quälenden Temperaturen nachlassen und man sich wieder konzentrieren mag :)

Wenn du Spam fürchtest, dann hinterlasse deine Mailadresse doch verschlüsselt oder grafisch, ich binde das gern hier ein, damit dich auch andere Kontaktieren können.

Mit sommerlichen Grüßen,
yt
 

Seiten

Neuen Kommentar schreiben

Filtered HTML

  • Internet- und E-Mail-Adressen werden automatisch umgewandelt.
  • Zulässige HTML-Tags: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd> <strike>
  • HTML - Zeilenumbrüche und Absätze werden automatisch erzeugt.

Plain text

  • Keine HTML-Tags erlaubt.
  • Internet- und E-Mail-Adressen werden automatisch umgewandelt.
  • HTML - Zeilenumbrüche und Absätze werden automatisch erzeugt.
CAPTCHA
Bitte diese Frage beantworten, um einen Kommentar zu hinterlassen.
Fill in the blank.