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.

 


 

Kommentare

Hallo zusammen,

anbei meine Projektdateien.
Ihr braucht folgende Files:

Die Datei wurde Quick and Dirty erstellt und ich übernehme keine Garantie für die schlussendliche Richtigkeit der Source. Ja, ich verbinde einen Raspberry PI Rev. B mit einer 0BA7. Zzt. verfüge selbst nur über ein Grundmodul und ein DM8. Somit kann ich nicht alles testen. Der Merker M6 steuert bei mir den Ausgang Q8.

YT: Verpasst du bitte dem Code einen entsprechenden Look und bettest ihn auf deiner Seite ein?
Alternativ würde ich dich bitten die Sourcen hoch zu laden.

main.cpp & Test_Applikation.pro (Plain Text)

Ich schaue ab und zu mal vorbei und gebe update. Falls dies gewünscht ist.

Noch eine Bitte: Ich bin badner. Wem es g'fallt darf sich gern melden. Wem ebbs ned g'fallt, soll sei dumme Lab halde!

 

Hallo Benjamin, falls du hier noch einmal vorbeischaust, kannst du evtl. mal beschreiben wie du das Problem mit der -1 beim connect gelöst hast? Ich versuche auch einen Raspberry mit der Logo zu verbinden. Mit Beispielprogrammen aus dem Siemens-Forum unter Windows funktioniert es. Vom Raspberry aus versuche ich es mit Perl aber da bekomme ich bei "$res=Nodave::daveConnectPLC($dc);" als Ergebnis immer -1 zurück. Denke mal das ich sonst alles richtig eingestellt habe: Rack 1, Slot 0, Port 102, IP-Adresse der usw. Habe mir auch schonen deinen Code angeschaut und das sieht eigentlich so ähnlich aus wie unter Perl.

MfG Jens

Huhu Jens,

für mich hört sich das nach Hindernis Nummer 3 an. Fehlerhaft Programmierung / Konfiguration der Logo.

»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 kann mich aber auch irren, da ich nicht der Spezi dafür bin. Also werd ich Nemori noch mal anstupsen, ob sie dazu eine Idee hat. Ob Rasperry, Ubuntu oder Disksstation spielt dabei IMHO keine Rolle.

Mit "laienhaften" Grüßen,
yt

Hallo Jens,

ich kenne deinen Perl code nicht.
Ich habe bei meiner Steuerung das Problem das der Raspberry ab und an haengen bleibt. Leider konnte ich das Thema nicht weiter verfolgen (Studium begonnen) und habe das Programm auf Eis gelegt.

Warum willst du unbedingt ein Perl Programm verwenden?

Gruss,
Ben

Die LOGO! ist hardwareseitig sehr beschränkt (max. 24 Eingänge bzw. 16 Ausgänge).
Ich würde eher das I/O-System 750 von WAGO empfehlen. Die Controller werden mit dem Standard-Programmiertool "CoDeSys" programmiert (wird von vielen Herstellern genutzt).
Es gibt eine große Auswahl an Ein-/Ausgabemodulen, Kopplungen zu fast allen Bussystemen (KNX, LON, CAN ...) und auch Controller mit Linux.

Wir werden uns das System mal anschauen. Bei der Logo kommen wir jetzt schon wieder an Grenzen. Eine einfache Schaltung zur Dimmung kostet unheimlich viel Speicherplatz *im Maßstab der Logo*.

Mit freundlichen Grüßen,
yt
 

 

Hi an alle.

Habe mit Interesse diesen Beitrag verfolgt, habe auch eine Hausinstallation mit LOGO's verwiklicht und bin nun auf der Suche nach einer benutzfreundlichen Software für PC oder Smartphone mit Bedienoberfläche für die Ein-/ und Ausgänge der LOGO's.
Wie ich verstanden habe, sagt ihr, man könne die LOGO Ein-/ und Ausgänge nicht von aussen ansteuren.
Was ist aber mit den virtuellen Ein-/ Ausgängeblöcken????????
Die sind definitiv über Ethernet ansteuerbar. Man müsste nur die Schaltung im LOGO Programm anpassen (statt Blöcke I1-I24 eben Blöcke NI1-NI64 verwenden).
Dann sollte einer Ansteuerung im laufenden Betrieb der LOGO doch nichts mehr im Wege stehen....
oder sehe ich da was falsch?

Siehe auch: tinyurl[dot]com[slash]oncgv3t (Link verkürzt und SEO-STOP, yt)

Hallo ihr Lieben,

mit viel Interesse habe ich euren spannenden Bericht gelesen. Ich beschäftige mich gerade (zwangsweise ;) ) zum ersten mal mit Logo-Programmierung. Gerade hänge ich am "3. Hindernis - Mit Logo in Verbindung treten". In diesem Abschnitt habt ihr einen Link eingebunden, der nicht mehr gültig ist.
Könnt ihr eine alternative Quelle nennen? Oder mir einen anderen Hinweis geben?
Ich habe ganz offensichtlich die Schnittstelle mit Logo!SoftComfort ebenfalls nicht richtig konfiguriert (pingbar ist das 0ba7, aber ich komme mit der API - libnodave & PLCcom - nicht dran).

Vielen Dank!

Das Internet Archiv - dort findet man auch ältere Webseiten wieder.

http://web.archive.org/web/20130614225620/http://www.automation-se.de/index.php/contlogohowto

Danke auch für den Hinweis, ich werd den Link dann mal durch ein "Standbild" ersetzen. Wegen deines Problems stups ich mal meine Frau an, vielleicht kann sie dir weiterhelfen und hat eine Idee.

Mit freundlichen Grüßen,
yt

 

PS: Ich habe den Verdacht, dass dein Rechner mit Schadsoftware / Such-Toolbars infiziert ist.
 

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
Du musst diese schwere Aufgabe bewältigen, um einen Hinweis darauf zu geben, dass du ein "realer" Mensch bist.
Fill in the blank.