# LibNoDave kompilieren auf raspberry pi?



## scrolllkock (21 November 2012)

Hallo!

Mein Anliegen steht eigentlich schon im Titel.
Ich bekomme nächste Woche (hoffentlich) meinen raspberry pi geliefert und möchte ihn nutzen um verschiedene Daten aus der SPS (315 2PN/DP) auszulesen und zusammen mit ein paar Temperaturwerten als Auswertung auf einem Webserver darzustellen. Ähnlich zu http://www.notdefine.de/projects.php?project=heizungssteuerung-mit-linux-ubuntu-arm
Nur möchte ich nichts steuern, sondern nur Werte protokollieren und im Heimnetzwerk darstellen können.

Hat schon mal jemand versucht libnodave auf einem ARM-Prozessor zu kompilieren? 

Über Erfahrungen würde ich mich freuen!

Bernhard


----------



## Jochen Kühner (21 November 2012)

Ich habs schon mal für einen AVR compiliert, aber nie verwendet (da Ich kein Serielles Interface hatte!). 
Abe runter Linux läufts, und mit dem IOS Sdk lässts sich auch kompilieren und unter einem IPhone verwenden!


----------



## scrolllkock (5 Dezember 2012)

Hat geklappt!  Verbindung mit testISO_TCP war möglich.
Man muß nur im Makefile eine Zeile aktivieren und schon klappt es wie auf einem normalen Linux Rechner!
Das neu kompilieren von testISO_TCP.c war aber nicht so einfach möglich - ging aber nach etwas Recherche dann auch.
Hat es jemand schon mal unter PHP oder Python zum laufen gebracht?


----------



## phyrexianer (14 Dezember 2012)

Super... ich bekomme meinen pi auch in den nächsten Tagen und wollte auch was von der CPU lesen....

kannst du mir vielleicht im Vorfeld sagen auf was ich da achten soll bzw. wie ich das ganze hinbekomme, vielleicht ein kleines Tutorial ?

gruß


----------



## scrolllkock (19 Dezember 2012)

phyrexianer schrieb:


> Super... ich bekomme meinen pi auch in den nächsten Tagen und wollte auch was von der CPU lesen....
> 
> kannst du mir vielleicht im Vorfeld sagen auf was ich da achten soll bzw. wie ich das ganze hinbekomme, vielleicht ein kleines Tutorial ?
> 
> gruß



Sorry für die späte Antwort, bin leider nicht früher dazu gekommen.

Ich wollte am Wochenende sowieso die SD-Karte nochmal neu aufsetzen und die Schritte protokollieren.
Alles in allem hat es gut geklappt. Bin allerdings weder ein Linux, noch ein C oder Script Spezialist ;-)
Werde mich dann hier melden.

Bei direkten Fragen einfach nochmal melden!

Bernhard


----------



## phyrexianer (19 Dezember 2012)

Das ist ok.... ich bin auch kein Programmiergenie, aber wenn einer schon mal was grobes vorgeben kann, kann man ja hier und da vielleicht auch zusammen arbeiten bzw. die Erfahrungen teilen *ggg*


----------



## scrolllkock (26 Dezember 2012)

Hallo,

hier nochmal kurz die Vorgehensweise. Ich lese im Moment über einen cronjob alle 10 Minuten Werte aus der SPS und schreibe sie in eine rrd Datenbank und syncronisiere 1x am Tag die Uhr des raspberry mit der SPS.  
Außerdem ist noch ein Webserver mit php installiert. Die von rrd erzeugten Grafiken werden im Webserver eingebunden und sind so abrufbar.
Im Moment werden Gas und Außentemperatur (DS18S20) geloggt, die Bauteile für einen Lesekopf am Stromzähler liegen schon im Keller.



> libnodave auf raspberry kopieren nach /home/pi/sps
> 
> 
> 
> ...


----------



## tomatensaft (14 Januar 2013)

Hallo scrolllock,

das klingt ja wirklich super.

Kannst du mal den Teil posten mit der Kommunikation SPS <-> Rdd DB ?


----------



## scrolllkock (23 Januar 2013)

Hallo,

da gibt es nicht viel zu posten.
Ich lese mit einem C-Programm über libnodave die Werte aus der SPS aus und lege sie in eine lokale Datei.
Von hier holt sie ein script ab und schreibt sie in eine rrd Datenbank.
Beides geschieht über Cronjobs.

Nicht sehr elegant. Vielleicht ändere ich das noch, damit alles in einem python Programm läuft.


----------



## PeterHollanda (17 Februar 2013)

Es lauft auf meine Pi mit Gambas 2 :smile:
danke nochmals zu *scrolllkock*   :s12:

Aber auch Zugriff mit im gambas2 verfügbare Socket componente und AG_send und AG_Receive


----------



## emilio20 (8 Januar 2014)

Hallo
was für eine Datei Kopiert Ihr aud das Pi ? Ich habe den Ordner libnodave-0.8.5
in diesem befindet sich der ordner usb2mpi-Linux-2.6,

Welche Datei muss kopiert werden ?


----------



## scrolllkock (9 Januar 2014)

Ohne jetzt nachzuschauen, ich hatte den ganzen Ordner auf den Pi kopiert.
Im Hauptverzeichnis liegt dann alles was du brauchst. Einfach mal meinen Beitrag http://www.sps-forum.de/hochsprache...-kompilieren-auf-raspberry-pi.html#post418660 anschauen und probieren. Bei Fragen kannst du gerne nochmal nachfragen.


----------



## emilio20 (12 Januar 2014)

Hallo
kann mir jemand sagen ob dies auch bei einem Arduino Yun Funktioniert. Das Yun hat einen Linux Prozessor Atheros AR9331 und eine ATmega32u4.
Wenn Libnodave auf der Linux seite laufen würde, könnte ich über Bridge mit der Arduinoseite Variablen austauschen. 
http://arduino.cc/en/Main/ArduinoBoardYun?from=Main.ArduinoYUN


----------



## emilio20 (13 Januar 2014)

Hallo *scrolllkock*

Ich versuche auf einen Arduino Yun auf der Linux seute Libnodave einzurichten. Ich habe den Ordner Libnodave nach root kopiert und die Datei CFLAGS+=-DARM_FIX in Makefile abgeändert. Jetzt kommten die Punkte make, sudo make install . Was muss ich da genau machen ?






scrolllkock schrieb:


> Hallo,
> 
> hier nochmal kurz die Vorgehensweise. Ich lese im Moment über einen cronjob alle 10 Minuten Werte aus der SPS und schreibe sie in eine rrd Datenbank und syncronisiere 1x am Tag die Uhr des raspberry mit der SPS.
> Außerdem ist noch ein Webserver mit php installiert. Die von rrd erzeugten Grafiken werden im Webserver eingebunden und sind so abrufbar.
> Im Moment werden Gas und Außentemperatur (DS18S20) geloggt, die Bauteile für einen Lesekopf am Stromzähler liegen schon im Keller.


----------



## Zottel (14 Januar 2014)

make clean, damit die x86-linux-files gelöscht werden-
make. 
Es gibt kein make install. 
Wenn du die neueste Version 0.8.5 nimmst, kannst du dir auch das CFLAGS+=-DARM_FIX sparen.


----------



## emilio20 (14 Januar 2014)

Hallo
ich verstehe das noch nicht so ganz.

Wie genau muss ich mit der Date 0.8.5 vorgehen ?

Was muss ich wohinKopieren ? Muss ich irgentetwas Installieren ?


 Es gibt für Linux in Python Programm.

https://github.com/netdata/python-libnodave

Wäre super wenn mir jemand genau erklären könnte wie ich vorgehen muss  damit Libnodave auf dem Linux System richtig istalliert ist.


----------



## aticio (9 Februar 2014)

Hallo.
Habe versucht libnodave nach der Anleitung auf Seite 1 dieses Threads auf einem Raspberry zu builden.
Leider bekomme ich bereits beim "make" folgende Fehlermeldungen:
cc -m64 -Wall -Winline -DLINUX -DDAVE_LITTLE_ENDIAN -fPIC -DARM_FIX  -m64 -Wall -Winline -DLINUX -DDAVE_LITTLE_ENDIAN -fPIC  -c -o openSocket.o openSocket.c
cc1: error: unrecognized command line option â-m64â
cc1: error: unrecognized command line option â-m64â
make: *** [openSocket.o] Fehler 1

Ein Ändern der option -m64 auf -m32 bringt nichts.

Hat hier irgendjemand eine Idee und könnte mir Tipps geben was zu tun ist?
Vielen Dank schon mal im Vorhinein!
LG


----------



## scrolllkock (10 Februar 2014)

Hallo,

leider kann ich nur wiederholen was auf Seite 1 steht - bei mir hat das genau so funktioniert.
Welche Version von libnodave nimmst du? Wo ist libnodave abgelegt? Evtl. mal eine ältere Version probieren.


----------



## aticio (10 Februar 2014)

Hallo.
Danke für Deine Antwort.
Ich habe die aktuelle Version von libnodave versucht.
(Welche hast du in Verwendung?)
Muss man den Gnu Compiler am Raspberry ev. installieren oder ist der bereits installiert?
(ich nehme an er ist installiert sonst würde make gar nix tun oder?)
Muss man das #define für Linux irgendwo einstellen?
LG


----------



## volker (10 Februar 2014)

scrolllkock schrieb:


> ... die Bauteile für einen Lesekopf am Stromzähler liegen schon im Keller.


Jetzt wo der etwas ältere Thread nach oben gerutscht ist.

Kannst du mal eine Bauteilliste und das layout von dem ding posten?
Ich nehme an, daß du den roten Streifen auf der Scheibe damit erfaßt.

Falls jmd ein fertiges Teil kennt welches das macht immer her mit der Info.

Also für mich wäre am besten was mit 24V. soll halt in eine sps.


----------



## scrolllkock (10 Februar 2014)

Ne, ist ein IR-Lesekopf.
Aber ich habe die Teile von www.volkszaehler.org

Hier gibts aber auch was für dich -> http://wiki.volkszaehler.org/hardware/channels/meters/power/ferraris-zaehler


----------



## scrolllkock (10 Februar 2014)

> Kannst du mal eine Bauteilliste und das layout von dem ding posten?
> Ich nehme an, daß du den roten Streifen auf der Scheibe damit erfaßt.
> 
> Falls jmd ein fertiges Teil kennt welches das macht immer her mit der Info.
> ...



Ne, ist ein IR-Lesekopf.
Aber ich habe die Teile von www.volkszaehler.org

Hier gibts aber auch was für dich -> http://wiki.volkszaehler.org/hardware/channels/meters/power/ferraris-zaehler


----------



## aticio (10 Februar 2014)

Hallo.
@scrolllkock: 
Nochmals die Fragen: (Bitte um Beantwortung)
- Welche Version v. libodave verwendest Du denn?
- Welche distri v. Raspberry (welche Version)
- Hast Du Compiler o. Entwicklungsumgebung am Raspberry selbst installiert?

edit: Ich habe nun die vorletzte Version von libnodave versucht.
Damit klappt das make nun.

nun habe ich ./testISO_TCP 192.168.0.128 versucht.
Damit bekomme ich folgende Fehlermeldung:
IF1 error in daveConnectPLC() step 1. retrying...IF1 error in daveConnectPLC() step 1. retrying...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.

Konnekten möhte ich eine Logo OBA7.
Hat noch jemand Tipps?

Danke!


----------



## scrolllkock (10 Februar 2014)

aticio schrieb:


> Hallo.
> Danke für Deine Antwort.
> Ich habe die aktuelle Version von libnodave versucht.
> (Welche hast du in Verwendung?)
> ...



Hi aticio,

hast du gerade noch ein Post von dir gelöscht?!?

Ich hatte die libnodave 0.8.4.5
Linux raspbian wheezy ??? irgendwas
Compiler usw. hab ich nichts installiert

Ich wollte demnächst nochmal das System neu aufsetzten (als read-only) - dann kann ich das ja nochmal alles hier reinschreiben. Frühestens aber am Wochenende.


----------



## aticio (11 Februar 2014)

scrolllkock schrieb:


> Hi aticio,
> 
> hast du gerade noch ein Post von dir gelöscht?!?
> 
> ...



Nein, nur editiert.
Meine Posts werden aber immer erst von einem Moderator freigeschalten. (weil Neuling?)
Der edit Post ist dabei verschwunden?

Ich schrieb: mit der vorletzten Version von libnodave klappt das make.
(allerdings mit vielen Warnungen)
Der Aufruf von testISO_TCP wird aber mit einer Fehlermeldung beendet.
(die genaue Meldung kann ich am Abend posten)
Ich möchte eine Logo OBA7 auslesen.
Gitb es dabei ev. etwas zu beachten?


----------



## aticio (11 Februar 2014)

Mein Posting #23 inkl. edit ist nun wieder aufgetaucht....


----------



## scrolllkock (11 Februar 2014)

aticio schrieb:


> Der Aufruf von testISO_TCP wird aber mit einer Fehlermeldung beendet.
> (die genaue Meldung kann ich am Abend posten)
> Ich möchte eine Logo OBA7 auslesen.
> Gitb es dabei ev. etwas zu beachten?



Vom Logo hab ich keine Ahnung, aber bei den Jungs hier läuft das...

http://www.automation.siemens.com/forum/guests/PostShow.aspx?PostID=307760&Language=de&PageIndex=7


----------



## aticio (11 Februar 2014)

Danke für den link.


----------



## aticio (11 Februar 2014)

Hi.
Super, das Testprogramm funktioniert einmal.
Der Aufruf erfolgt bei mir mit: ./testISO_TCP --slot=0 192.168.0.128
Wobei im c source (wie im siemens forum geschrieben) folgendes geändert wurde:
dc =daveNewConnection(di,2,*1*,useSlot);  // insert your rack and slot here (für die Logo könnte man den Slot hier auch fix auf 0 setzen, und dann im aufruf weglassen)

Damit werden 16dwords des VM Speichers gelesen. (Müssen unter Extras->Parameter-VM-Zuordnung in der Logo!Soft konfiguriert werden)

LG


----------



## christoph2630 (21 Februar 2014)

Hi alle!
Bin kompletter Linux-Neuling, möchte aber meinen Raspberry Pi B (512) auch nutzen um von meiner Heim-S7 (315-2DP) Daten auszulesen. Bevor ich mir dazu einen konkreten Plan zurechtlege bitte ich euch um eure Meinung / Erfahrung / Infos zu meinen Fragen:
- auf welchen Schnittstellenadapter beziehen sich die bisherigen Posts?
- gibts mit einem Helmholz Netlink Pro Compact auch Erfahrungen und Infos - den habe ich nämlich?
- gibts mit einem IBH-Netlink auch Erfahrungen und Infos? Den hätt ich auch
- habe mir Python ein bisschen angesehen, gefällt mir gut. Bin in C absolut unerfahren - ist immer ein mühsames Zusammensuchen wenn ich was ändern soll. Sollte ich Python weiterverfolgen oder ist das ne Sackgasse und ich MUSS C nehmen?

Danke erst mal - freu mich schon auf eure Ansichten!

LG

Update:
Hab nun den IBH-Netlink schon erfolgreich gekoppelt dank der tollen Anleitung von *scrolllkock* am Beginn dieses Themas - danke nochmal dafür! D.h. ich kann nun mit dem beiliegenden C-Programm 'testIBH.c' herumspielen und bekomme auch tatsächlich die Werte aus der CPU raus
Bleiben nun noch die Fragen zu Helmholz offen und was wir am meisten am Herzen liegt: die Programmiersprache! 
LG, Christoph


----------



## gartenfuzi (8 März 2014)

Hallo!

Woher habt ihr die Datei libnodave für den Raspberry? Wie installiert man diese Datei auf den Raspberry? 
Möchte gerne meine Logo A7 auslesen. Die Daten der analogen Eingänge (AI) möchte ich gerne mitloggen und auf einen Webserver legen. Ist es möglich auch die Eingänge und Ausgänge auszulesen?

Danke und Gruß Alex


----------



## gartenfuzi (9 März 2014)

Hallo!

Hab das libnodave endlich auf meinen Raspi oben. Morgen werd ich mal dies ausprobieren ob dies funktioniert.  Ich hab auch gelesen ich muss bzw kann dieses machen.

C Programm umschreiben nach Bedarf kompilieren durch den Befehl:
 gcc -Wall -DLINUX -DDAVE_LITTLE_ENDIAN programm.c -lnodave -o programm

Aber was ist das für ein File und wo finde ich dieses? Kann mir jemand dies erklären?

Danke und Gruß Alex


----------



## aticio (10 März 2014)

Hallo.
Also, bei mir klappt das so:
Nachdem ich libnodave installiert habe, gibt es im Verzeichnis von libnodave ein file Namens: "testISO_TCP.c"
Dieses ist der Quelltext des mitgelieferten Testprogramms. mittels Befehl "make" wird dieses kompiliert.
Und mittels:  ./testISO_TCP --slot=0 192.168.0.128 wird das zuvor kompilierte Programm ausgeführt (192.168.0.128 ist bei mir die Logo)
Und zu deiner vorherigen Frage: JA, das sollte möglich sein (Eingänge lesen, in Datei schreiben etc)
Aber: Dazu brauchts sicher C-Kenntnisse.
LG


----------



## scrolllkock (10 März 2014)

gartenfuzi schrieb:


> Hab das libnodave endlich auf meinen Raspi oben. Morgen werd ich mal dies ausprobieren ob dies funktioniert.  Ich hab auch gelesen ich muss bzw kann dieses machen.



Nur das Verzeichnis drauf gezogen oder auch kompiliert? Wie es geht steht auf der ersten Seite des Threads.
Ich hatte die libnodave 0.8.4.5 installiert, das hat bei mir geklappt wie beschrieben.



gartenfuzi schrieb:


> C Programm umschreiben nach Bedarf kompilieren durch den Befehl:
> gcc -Wall -DLINUX -DDAVE_LITTLE_ENDIAN programm.c -lnodave -o programm
> 
> Aber was ist das für ein File und wo finde ich dieses? Kann mir jemand dies erklären?



Wenn du das libnodave erfolgreich kompiliert hast, liegt in deinem Verzeichnis die Datei 'testISO_TCP'
Diese wie von atico beschrieben mit ./testISO_TCP --slot=0 192.168.0.128 ausführen.

Beachte auch den Beitrag von atico hier: http://www.sps-forum.de/hochsprache...ompilieren-auf-raspberry-pi-3.html#post480650

Wenn eine Verbindung erfolgreich war, kannst du beginnen die Datei testISO_TCP.c für deine Bedürfnisse anzupassen.
Dieses geänderte c-File musst du dann mit 
gcc -Wall -DLINUX -DDAVE_LITTLE_ENDIAN dein_programm.c -lnodave -o dein_programm
kompilieren.

Vom Logo habe ich keine Ahnung, aber bei meiner PN - CPU hat alles recht reibungslos funktioniert.

Viel Erfolg!


----------



## gartenfuzi (17 März 2014)

Hallo!

Leider kommt bei mir die gleiche Fehlermeldung wie in Posting 23.
Scheinbar habe ich was falsch gemacht. 
Habe also die SD Karte formatiert und nochmals das Image aufgespielt.
Ich beschreibe mal was ich gemacht habe:

1.) SD formatiert
2.) SD mit neuen Image bespielt
3.) einen neuen Ordner erstellt - heißt sps
4.) Ordner libnodave 0.8.4.5 in Ordner sps kopiert
5.) Befehl nano /home/pi/sps/Makefile eingegeben - es passiert nichts. Habe den Inhalt des Ordner direkt in den sps Ordner kopiert und siehe da ich kann das Makefile öffnen.
6.) in Zeile 24 steht bereits der Namen CFLAGS+=-DARM_FIX
was muss ich da enablen? Was muss ich da hineinschreiben? Da komme ich nicht ganz mit.
7.) make funktioniert - da arbeitet der raspi
8.) sudo make install funktioniert auch.
9.) ./testISO_TCP 192.168.1.11 oder ./testISO_TCP --slot=0 192.168.1.11 kommt wieder die Fehlermeldung von Posting 23

Also was habe ich falsch gemacht?

Gruß Alex


----------



## scrolllkock (17 März 2014)

Beitrag #27


Vom Logo hab ich keine Ahnung, aber bei den Jungs hier läuft das...


http://www.automation.siemens.com/fo...de&PageIndex=7


Beitrag #29


Hi.
Super, das Testprogramm funktioniert einmal.
Der Aufruf erfolgt bei mir mit: ./testISO_TCP --slot=0 192.168.0.128
Wobei im c source (wie im siemens forum geschrieben) folgendes geändert wurde:
dc =daveNewConnection(di,2,1,useSlot); // insert your rack and slot here (für die Logo könnte man den Slot hier auch fix auf 0 setzen, und dann im aufruf weglassen)


Damit werden 16dwords des VM Speichers gelesen. (Müssen unter Extras->Parameter-VM-Zuordnung in der Logo!Soft konfiguriert werden)


LG


----------



## gartenfuzi (17 März 2014)

Hallo!

Der VM Speicher wurde schon zu geordnet. Da ist schon alles drinnen. 
Aber was ist bei diesen File "CFLAGS+=-DARM_FIX" zu Enablen? Oder stimmt dies schon was da drinnen steht?

Gruß Alex


----------



## gartenfuzi (17 März 2014)

Hallo!

Wir reden also von dieser Datei:

testISO_TCP.c

c bedeutet ja dies ist in c geschrieben. Aber mit welchen Programm mache ich dieses File auf? Geht dies auch mit nano?

Gruß Alex


----------



## scrolllkock (17 März 2014)

Zum 1.:

vor CFLAGS+=-DARM_FIX soll kein # stehen, dann ist die Zeile enabled.

Zum 2.:

Ja, du kannst ein .c File auch in nano editieren.
Und dann...
Der Aufruf erfolgt bei mir mit: ./testISO_TCP --slot=0 192.168.0.128
Wobei im c source (wie im siemens forum geschrieben) folgendes geändert wurde:
dc =daveNewConnection(di,2,1,useSlot); // insert your rack and slot here (für die Logo könnte man den Slot hier auch fix auf 0 setzen, und dann im aufruf weglassen)

Also das testISO_TCP.c wie oben ändern, neu kompilieren und dann wie oben aufrufen.


----------



## gartenfuzi (17 März 2014)

Hallo!

OK. Das Zeichen# ist jetzt weg. Muss ich dies nochmals mit make und sudo make install kompilieren?

Gruß Alex


----------



## scrolllkock (17 März 2014)

Der Einäugige führt den Blinden ;-)

Ja, musst du, aber hast du auch das .c file geändert?


----------



## gartenfuzi (17 März 2014)

Das mit den Zeichen in deiner Beschreibung hab ich nicht gesehen. Aber jetzt hab ich es nochmals durchgelesen und auch gesehen. 
Jetzt wollte ich nochmals make ausführen so schreibt mir der pi folgendes heraus:

make: *** keine Targets angegeben und keine  >make<- Steuerdatei gefunden. Schluss.

Bei anderen File bin ich noch beim suchen. Sind doch laut Forum in Zeile 311 zu ändern.


----------



## gartenfuzi (17 März 2014)

Scheinbar stehe ich ein wenig auf der Leitung


----------



## gartenfuzi (17 März 2014)

Hurra!

Hab dieses gefunden "dc =daveNewConnection(di,2,1,useSlot); // insert your rack and slot here "

Aber wo ändere ich das File? Kommt die 0 zwischen die Klammern hinein? 
Scheinbar kapiere ich da etwas nicht. Entschuldige schon mal meine Fragen. Logo programmieren da hab ich keine Probleme ab da steige ich bald aus. Etwas zu hoch für mich. Seit ihr Prgrammierer?

Gruß alex


----------



## scrolllkock (18 März 2014)

Frag doch mal aticio nach seinem .c File und dem kompilierten Programm. Vielleicht kommst du damit weiter. Wenn dich das Thema aber interessiert, solltest du mal ein kleines C Tutorial durcharbeiten (Stichwort "Hallo Welt"). Dann fällt vieles leichter. 
Nebenbei sind die meisten hier im Forum (SPS-) Programmierer. ;-)


----------



## crazyben (26 Juni 2014)

Hallo zusammen,

ich krame nochmal das alte Thema heraus, da ich hierzu noch ein paar Fragen habe aber keinen neuen Thread aufmachen möchte. Aktuell setze ich einen Raspberry PI zusammen mit der Libnodave ein um verschiedene Informationen auszutauschen.
Leider hat die von mir eingesetzte alte Library scheinbar Probleme mit Memory-Leaks.

Daher wollte ich heute meine Programme neu kompilieren.
Das Kompilieren an sich war auch problemlos möglich.

Leider habe ich jetzt das Problem das meine Programme keine Daten mehr austauschen.
Ich erhalte Fehlermeldungen die darauf hindeuten, das Datentypen nicht zusammen passen.

Ich habe folgendes Probiert:
- Siemens Logo 0BA7 (192.168.0.1:102   255.255.255.0   kein Gateway!)
  Logo ist Pingbar von Rasperry.

- Raspberry PI mit Debian wheezy (Linux RASPBERRY 3.12.22+ #691 PREEMPT Wed Jun 18 18:29:58 BST 2014 armv6l GNU/Linux)

- Das Logo-Programm:
  Keine VM Speichers konfiguriert. (Müssen unter  Extras->Parameter-VM-Zuordnung in der Logo!Soft konfiguriert werden)
  Ich will ja erstmal nur Verbinden können.

- Make Aufruf:
  CFLAGS+=-DARM_FIX
  CFLAGS=-Wall -Winline -DLINUX -DDAVE_LITTLE_ENDIAN
  CTFLAGS=-Wall -Winline -fPID -DLINUX -DDAVE_LITTLE_ENDIAN
  CPPFLAGS=-Wall -Winline -DLINUX -DDAVE_LITTLE_ENDIAN

- Libnodave 0.8.5.1 heruntergeladen -> testISO_TCP.c angepasst -> make -> make install

- Änderungen an testISO_TCP:
  dc =daveNewConnection(di,2,1,0);  // insert your rack and slot here

- Programmaufruf: ./testISO_TYP -d 192.168.0.1

- Programmausgabe:
  openSocket: enter OpenSocketopenSocket: OpenSocket: socket is 3
  openSocket: Connected to host: 192.168.0.1
  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,0x01,0x20,0xC0,0x01,0x09,
  IF1 daveConnectPLC() step 1. got packet: :                             
  IF1 error in daveConnectPLC() step 1. retrying...res 0 readISOpacket: short packet:                             
  IF1 daveConnectPLC() step 1. got packet: :                             
  IF1 error in daveConnectPLC() step 1. retrying...res 0 readISOpacket: short packet:                             
  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

- Portscan an der Logo:
root@xyz:~$ nmap  192.168.0.1 -p1-65535

Starting Nmap 6.40 ( http://nmap.org ) at 2014-06-26 21:28 CEST
Nmap scan report for 192.168.0.1
Host is up (0.0081s latency).
Not shown: 65533 closed ports
PORT      STATE SERVICE
102/tcp   open  iso-tsap
10001/tcp open  scp-config

Nmap done: 1 IP address (1 host up) scanned in 19.39 seconds



Habt ihr eine Idee????


Danke,
Ben


----------



## Zottel (27 Juni 2014)

Ich hänge hier eine testISO_TCP dran die ich auf einem Raspi kompiliert habe. Probier mal Ist von 0.8.5. Du brauchst sie nicht neu zu kompilieren; du kannst Slot- und Rack auf der Kommandozeile angeben!


----------



## egal (27 Juni 2014)

Hi,



crazyben schrieb:


> Habt ihr eine Idee????


Bei der Serververbindung auf der LOGO die Client-TSAP auf 01.00 (fix in libnodave) eingestellt ?

mit 
	
	



```
res=daveReadBytes(dc,daveDB,1,923,64,NULL);
```
sind alle OnBoard E/A (die ersten 20 Byte) der BA07 gescannt, so zum Test ohne VM.


----------



## crazyben (27 Juni 2014)

Hallo Zottel,

ich habe gerade das von dir zur Verfügung gestellte Testprogramm auf den Raspberry kopiert und wie mit folgendem Befehl gestartet:
./testISO_TCP -d 192.168.0.1 --slot=0

Ausgabe:
-----------

openSocket: enter OpenSocketopenSocket: OpenSocket: socket is 3
openSocket: Connected to host: 192.168.0.1
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,0x01,0x02,0xC0,0x01,0x09,
IF1 daveConnectPLC() step 1. got packet: :                             
IF1 error in daveConnectPLC() step 1. retrying...res 0 readISOpacket: short packet:                             
IF1 daveConnectPLC() step 1. got packet: :                             
IF1 error in daveConnectPLC() step 1. retrying...res 0 readISOpacket: short packet:                             
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.


Anbei noch meine Einstellungen im Programm der Logo:
-------------------------------------------------------------------






Wie gesagt, mit einer alten Version der Libnodave kann ich zugreifen..
Kann ich evtl den Log-Level erhöhen damit wir etwas verwertbares an Debug-Messages bekommen?


----------



## egal (28 Juni 2014)

Hi,

aah, steht ja alles da:

```
.. 0xC  2,
10:0x02,0x01,0x02 ..
```
Destination TSAP = 01:02, also slot=2

hmm, gab wohl entsprechende Änderung von 0.8.4.6 nach 0.8.5 bezgl. der Gerätekennung

Ergängzung in testISO_TCP.c:

```
dc =daveNewConnection(di,2,0,useSlot);  // insert your rack and slot here
    dc->communicationType = 2; // OP
```

so sollte danach tun:

```
./testISO_TCP -d --slot=0 192.168.0.1
```


----------



## crazyben (28 Juni 2014)

Hi egal,

ich habe die Zeile wie vorgeschlagen eingefügt.


```
./testISO_TCP -d --slot=0 192.168.0.1
```

Augabe:

```
openSocket: enter OpenSocketopenSocket: OpenSocket: socket is 3
openSocket: Connected to host: 10.0.0.2 
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: 22 bytes read, 22 needed
readISOpacket: packet:                             
                            0:0x03,0x00,0x00,0x16,0x11,0xD0,0x00,0x01,0x5D,0xB4,0x00,0xC0,0x01,0x09,0xC1,0x02,
                            10:0x01,0x00,0xC2,0x02,0x02,0x00,
IF1 daveConnectPLC() step 1. got packet: :                             
                            0:0x03,0x00,0x00,0x16,0x11,0xD0,0x00,0x01,0x5D,0xB4,0x00,0xC0,0x01,0x09,0xC1,0x02,
                            10:0x01,0x00,0xC2,0x02,0x02,0x00,
TPDU len 9 = 512
PDU header:                             
                            0:0x32,0x01,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,
plen: 8 dlen: 0
Parameter:                             
                            0:0xF0,0x00,0x00,0x01,0x00,0x01,0x07,0x80,
_daveExchange PDU number: 65535
IF1 enter _daveExchangeTCP
send packet: :                             
                            0:0x03,0x00,0x00,0x19,0x02,0xF0,0x80,0x32,0x01,0x00,0x00,0xFF,0xFF,0x00,0x08,0x00,
                            10:0x00,0xF0,0x00,0x00,0x01,0x00,0x01,0x07,0x80,
readISOpacket: 27 bytes read, 27 needed
readISOpacket: packet:                             
                            0:0x03,0x00,0x00,0x1B,0x02,0xF0,0x80,0x32,0x03,0x00,0x00,0xFF,0xFF,0x00,0x08,0x00,
                            10:0x00,0x81,0x04,0xF0,0x00,0x00,0x01,0x00,0x01,0x00,0xF0,
IF1 _daveExchangeTCP res from read 27
result of exchange: 0
PDU header:                             
                            0:0x32,0x03,0x00,0x00,0xFF,0xFF,0x00,0x08,0x00,0x00,0x81,0x04,
plen: 8 dlen: 0
Parameter:                             
                            0:0xF0,0x00,0x00,0x01,0x00,0x01,0x00,0xF0,
error: context is not supported. Step7 says:Function not implemented or error in telgram.
IF1 error in daveConnectPLC() step 1. retrying...
PDU header:                             
                            0:0x32,0x01,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,
plen: 8 dlen: 0
Parameter:                             
                            0:0xF0,0x00,0x00,0x01,0x00,0x01,0x07,0x80,
_daveExchange PDU number: 65536
IF1 enter _daveExchangeTCP
send packet: :                             
                            0:0x03,0x00,0x00,0x19,0x02,0xF0,0x80,0x32,0x01,0x00,0x00,0x00,0x00,0x00,0x08,0x00,
                            10:0x00,0xF0,0x00,0x00,0x01,0x00,0x01,0x07,0x80,
readISOpacket: 27 bytes read, 27 needed
readISOpacket: packet:                             
                            0:0x03,0x00,0x00,0x1B,0x02,0xF0,0x80,0x32,0x03,0x00,0x00,0x00,0x00,0x00,0x08,0x00,
                            10:0x00,0x81,0x04,0xF0,0x00,0x00,0x01,0x00,0x01,0x00,0xF0,
IF1 _daveExchangeTCP res from read 27
result of exchange: 0
PDU header:                             
                            0:0x32,0x03,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x81,0x04,
plen: 8 dlen: 0
Parameter:                             
                            0:0xF0,0x00,0x00,0x01,0x00,0x01,0x00,0xF0,
error: context is not supported. Step7 says:Function not implemented or error in telgram.
IF1 error in daveConnectPLC() step 1. retrying...
PDU header:                             
                            0:0x32,0x01,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,
plen: 8 dlen: 0
Parameter:                             
                            0:0xF0,0x00,0x00,0x01,0x00,0x01,0x07,0x80,
_daveExchange PDU number: 65537
IF1 enter _daveExchangeTCP
send packet: :                             
                            0:0x03,0x00,0x00,0x19,0x02,0xF0,0x80,0x32,0x01,0x00,0x00,0x00,0x01,0x00,0x08,0x00,
                            10:0x00,0xF0,0x00,0x00,0x01,0x00,0x01,0x07,0x80,
readISOpacket: 27 bytes read, 27 needed
readISOpacket: packet:                             
                            0:0x03,0x00,0x00,0x1B,0x02,0xF0,0x80,0x32,0x03,0x00,0x00,0x00,0x01,0x00,0x08,0x00,
                            10:0x00,0x81,0x04,0xF0,0x00,0x00,0x01,0x00,0x01,0x00,0xF0,
IF1 _daveExchangeTCP res from read 27
result of exchange: 0
PDU header:                             
                            0:0x32,0x03,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x00,0x81,0x04,
plen: 8 dlen: 0
Parameter:                             
                            0:0xF0,0x00,0x00,0x01,0x00,0x01,0x00,0xF0,
error: context is not supported. Step7 says:Function not implemented or error in telgram.
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.
```

Aufruf:

```
./testISO_TCP --slot=0 192.168.0.1
```


Ergebnis:

```
IF1 error in daveConnectPLC() step 1. retrying...
IF1 error in daveConnectPLC() step 1. retrying...
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.
```


----------



## egal (28 Juni 2014)

Hi,


```
TPDU len 9 = 512
```
das ist falsch, die LOGO hat eine max. PDU-Länge von 240 Byte;
irgendwie ist die V0.8.5 bezgl. Logo nicht so optimal ;-)
(mal sehen, was die LOGO! 8 bringt)

Also, die V0.8.4.6 nehmen 
oder wieder basteln:

```
dc =daveNewConnection(di,2,0,useSlot);  // insert your rack and slot here
    dc->communicationType = 2; // OP
    dc->maxPDUlength = 240; // hack for LOGO
```

Besser wäre natürlich, den Fehler zu suchen ;-)


```
./testISO_TCP --slot=0 10.11.12.235
Connected.
Trying to read 64 bytes (16 dwords) from data block 1.
DB1:DW0: 311
DB1:DW1: 236
...
DB1:DW32: 0
Trying to read 16 bytes from FW0.
FD0: 16777216
FD4: 35848192
FD8: 0
FD12: 0.000000
Finished.
```


----------



## Zottel (28 Juni 2014)

egal schrieb:


> Hi,
> 
> 
> ```
> ...


TPDU bezieht sich auf ISO-Pakete, PDU auf Pakete der S7-Kommunikation.

Ich habe keine LOGO. Was soll der Rest von deinem Beitrag? Hast du erfolgreich kommuniziert, nachdem du in der Version 0.8.5

```
dc =daveNewConnection(di,2,0,useSlot);  // insert your rack and slot here
    dc->communicationType = 2; // OP
    dc->maxPDUlength = 240; // hack for LOGO
```

diese Änderungen vorgenommen hast?
Wenn ja: Braucht es beide oder hast du mal jede einzeln probiert?


----------



## egal (28 Juni 2014)

Hi,



Zottel schrieb:


> diese Änderungen vorgenommen hast?
> Wenn ja: Braucht es beide oder hast du mal jede einzeln probiert?


Ja, habe ich;
es braucht beide Änderungen:

- CommunicationType ist neu lt. LibNoDave ChangeLog und die Logo besteht wohl auf Typ 2=OP oder alternativ 20 für Logo Peer
- an der PDU-Berechnung wurde lt. Log wohl auch geschraubt (PDU split .. multiple ISO/IBH packekts)


----------



## crazyben (28 Juni 2014)

Hallo Zottel,
Hallo egal,

also, ich habe hier nochmal einige Debug-Informationen für euch.
Die von egal vorgeschlagenen Änderungen wurden von mir durchgeführt:

```
dc =daveNewConnection(di,2,0,useSlot);  // insert your rack and slot here     
dc->communicationType = 2; // OP 
    dc->maxPDUlength = 240; // hack for LOGO
```

Der Programmaufruf:

```
./testISO_TCP -d --slot=0 192.168.0.1
```

Die Programmausgabe:

```
openSocket: enter OpenSocketopenSocket: OpenSocket: socket is 3
openSocket: Connected to host: 192.168.0.1
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: 22 bytes read, 22 needed
readISOpacket: packet:                             
                            0:0x03,0x00,0x00,0x16,0x11,0xD0,0x00,0x01,0x5D,0xB4,0x00,0xC0,0x01,0x09,0xC1,0x02,
                            10:0x01,0x00,0xC2,0x02,0x02,0x00,
IF1 daveConnectPLC() step 1. got packet: :                             
                            0:0x03,0x00,0x00,0x16,0x11,0xD0,0x00,0x01,0x5D,0xB4,0x00,0xC0,0x01,0x09,0xC1,0x02,
                            10:0x01,0x00,0xC2,0x02,0x02,0x00,
TPDU len 9 = 512
PDU header:                             
                            0:0x32,0x01,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,
plen: 8 dlen: 0
Parameter:                             
                            0:0xF0,0x00,0x00,0x01,0x00,0x01,0x00,0xF0,
_daveExchange PDU number: 65535
IF1 enter _daveExchangeTCP
send packet: :                             
                            0:0x03,0x00,0x00,0x19,0x02,0xF0,0x80,0x32,0x01,0x00,0x00,0xFF,0xFF,0x00,0x08,0x00,
                            10:0x00,0xF0,0x00,0x00,0x01,0x00,0x01,0x00,0xF0,
readISOpacket: 27 bytes read, 27 needed
readISOpacket: packet:                             
                            0:0x03,0x00,0x00,0x1B,0x02,0xF0,0x80,0x32,0x03,0x00,0x00,0xFF,0xFF,0x00,0x08,0x00,
                            10:0x00,0x00,0x00,0xF0,0x00,0x00,0x01,0x00,0x01,0x00,0xF0,
IF1 _daveExchangeTCP res from read 27
result of exchange: 0
PDU header:                             
                            0:0x32,0x03,0x00,0x00,0xFF,0xFF,0x00,0x08,0x00,0x00,0x00,0x00,
plen: 8 dlen: 0
Parameter:                             
                            0:0xF0,0x00,0x00,0x01,0x00,0x01,0x00,0xF0,
error: ok

*** Partner offered PDU length: 240 used limit 240

Connected.
Trying to read 64 bytes (16 dwords) from data block 1.
PDU header:                             
                            0:0x32,0x01,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,
plen: 14 dlen: 0
Parameter:                             
                            0:0x04,0x01,0x12,0x0A,0x10,0x02,0x00,0x40,0x00,0x01,0x84,0x00,0x00,0x00,
_daveExchange PDU number: 65536
IF1 enter _daveExchangeTCP
send packet: :                             
                            0:0x03,0x00,0x00,0x1F,0x02,0xF0,0x80,0x32,0x01,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,
                            10:0x00,0x04,0x01,0x12,0x0A,0x10,0x02,0x00,0x40,0x00,0x01,0x84,0x00,0x00,0x00,
readISOpacket: 89 bytes read, 89 needed
readISOpacket: packet:                             
                            0:0x03,0x00,0x00,0x59,0x02,0xF0,0x80,0x32,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,
                            10:0x44,0x00,0x00,0x04,0x01,0xFF,0x04,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                            20:0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                            30:0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                            40:0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                            50:0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
IF1 _daveExchangeTCP res from read 89
result of exchange: 0
PDU header:                             
                            0:0x32,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x44,0x00,0x00,
plen: 2 dlen: 68
Parameter:                             
                            0:0x04,0x01,
Data     :                             
                            0:0xFF,0x04,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                            10:0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                            20:0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                            30:0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                            40:0x00,0x00,0x00,0x00,
Data hdr :                             
                            0:0xFF,0x04,0x02,0x00,
Data     :                             
                            0:0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                            10:0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                            20:0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                            30:0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
error: ok
_daveSetupReceivedPDU() returned: 0=ok
_daveTestReadResult() returned: 0=ok
DB1:DW0: 0
DB1:DW1: 0
...
DB1:DW32: 0
Trying to read 16 bytes from FW0.
PDU header:                             
                            0:0x32,0x01,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,
plen: 14 dlen: 0
Parameter:                             
                            0:0x04,0x01,0x12,0x0A,0x10,0x02,0x00,0x10,0x00,0x00,0x83,0x00,0x00,0x00,
_daveExchange PDU number: 65537
IF1 enter _daveExchangeTCP
send packet: :                             
                            0:0x03,0x00,0x00,0x1F,0x02,0xF0,0x80,0x32,0x01,0x00,0x00,0x00,0x01,0x00,0x0E,0x00,
                            10:0x00,0x04,0x01,0x12,0x0A,0x10,0x02,0x00,0x10,0x00,0x00,0x83,0x00,0x00,0x00,
readISOpacket: 41 bytes read, 41 needed
readISOpacket: packet:                             
                            0:0x03,0x00,0x00,0x29,0x02,0xF0,0x80,0x32,0x03,0x00,0x00,0x00,0x01,0x00,0x02,0x00,
                            10:0x14,0x00,0x00,0x04,0x01,0xFF,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                            20:0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
IF1 _daveExchangeTCP res from read 41
result of exchange: 0
PDU header:                             
                            0:0x32,0x03,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x14,0x00,0x00,
plen: 2 dlen: 20
Parameter:                             
                            0:0x04,0x01,
Data     :                             
                            0:0xFF,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                            10:0x00,0x00,0x00,0x00,
Data hdr :                             
                            0:0xFF,0x04,0x00,0x80,
Data     :                             
                            0:0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
error: ok
_daveSetupReceivedPDU() returned: 0=ok
_daveTestReadResult() returned: 0=ok
FD0: 0
FD4: 0
FD8: 0
FD12: 0.000000
Finished.
```

Nochmaliger Aufruf:

```
./testISO_TCP --slot=0 192.168.0.1
```

Ergebnis:


```
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: 0
FD4: 0
FD8: 0
FD12: 0.000000
Finished.
```

Zottel, ist das evtl noch ein Fehler in der Libnodave?


Danke bis dahin,
Ben


----------



## Zottel (28 Juni 2014)

crazyben schrieb:


> dc =daveNewConnection(di,2,0,useSlot);  // insert your rack and slot here
> dc->communicationType = 2; // OP
> dc->maxPDUlength = 240; // hack for LOGO


Sind das jetzt 2 oder 3 Änderungen?


crazyben schrieb:


> Zottel, ist das evtl noch ein Fehler in der Libnodave?


Was ist ein Fehler? Dass du die Änderungen brauchst? Oder gibt es etwa noch einen Unterschied zwischen 1. und 2. Aufruf?


----------



## crazyben (28 Juni 2014)

Hallo Zottel,

für mich sind das 2 Grundlegende Änderungen beim Programmablauf.
Die eigentliche Änderung besteht in meinen Augen aus diesen beiden Zeilen:

```
dc->communicationType = 2; // OP 
    dc->maxPDUlength = 240; // hack for LOGO
```
Da ich  aber nicht beurteilen kann ob das sich nun generell bei der Mehrzahl der  speicherprogrammierbaren Steuerungen zutrifft ist die Frage an dich ob  das nun ein Fehler in der Lib ist oder nicht. 
Das ich die Änderungen brauche ist für mich ein funktionierender Workaround.

Wie  wäre es denn wenn man in die Lib ein Precompiler-Flag(#ifdef  SIEMENS_LOGO_0BA7) abfägt und beim Aufruf von  daveNewConnection(..,..,..,..) die entsprechenden Einstellungen für die  PDU-Länge,(..) hinterlegt? Das ließe sich entsprechend erweitern wenn z.B.  die 0BA8 oder andere Modelle auf den Markt kommen. Ist einfach mal eine Idee. Vorallem  verhindert das uu. Probleme beim Modelwechsel (Code müsste dann  wahrscheinlich nicht angepasst werden sondern nur mit anderem  Precompiler-Flag kompiliert werden).

Vielleicht ist das auch zuviel des Guten.

Ben


----------



## PN/DP (28 Juni 2014)

crazyben schrieb:


> Wie  wäre es denn wenn man in die Lib ein Precompiler-Flag(#ifdef  SIEMENS_LOGO_0BA7) abfägt und beim Aufruf von  daveNewConnection(..,..,..,..) die entsprechenden Einstellungen für die  PDU-Länge,(..) hinterlegt?


Dann bräuchte man im Extremfall für jede Ziel-CPU eine andere Libnodave.dll ...

Harald


----------



## crazyben (28 Juni 2014)

PN/DP schrieb:


> Dann bräuchte man im Extremfall für jede Ziel-CPU eine andere Libnodave.dll ...
> 
> Harald



Klar - warum auch nicht?!
Ich verwende in meinen Programmen die DLL sowieso nicht und finde die Header und C-Dateien die benötigt werden direkt in mein Projekt ein. Und ja, das funktioniert.


----------



## Jochen Kühner (29 Juni 2014)

crazyben schrieb:


> Hallo Zottel,
> 
> für mich sind das 2 Grundlegende Änderungen beim Programmablauf.
> Die eigentliche Änderung besteht in meinen Augen aus diesen beiden Zeilen:
> ...



das wäre doch einfach nur murksich, anstatt den ursprünglichen fehler zu suchen....

poste doch mal ein wireshark log, dann kann mal schaun, wo die Auswertung in libnodave nicht klappt!


----------



## Zottel (29 Juni 2014)

crazyben schrieb:


> Hallo Zottel,
> 
> für mich sind das 2 Grundlegende Änderungen beim Programmablauf.
> Die eigentliche Änderung besteht in meinen Augen aus diesen beiden Zeilen:
> ...


Ich habe gefragt, ob es 2 oder 3 Änderungen sind, weil dein voriges Posting DREI Zeilen Code enthielt. (Ja, ich hätte auch in den Quelltext gucken können...)


crazyben schrieb:


> Das ich die Änderungen brauche ist für mich ein funktionierender Workaround.


Und es wundert mich. Möglicherweise kann die LOGO die PDU-Länge nicht aushandeln, wie es die anderen Steuerungen machen? 
Dann verstehe ich, warum

```
dc->maxPDUlength = 240; // hack for LOGO
```
nötig sein soll. Libnodave macht es erst seit 0.8.5.0.
Aber bei

```
dc->communicationType = 2; // OP
```
glaube ich, dass da etwas nicht richtig sein kann: Alle Versionen von  Libnodave vor 0.8.5 setzen immer dort standardmäßig eine 1 ("PG") ein  und Leute haben damit mit LOGOs kommuniziert !!!???

Dann beantworte bitte noch mal klip und klar, dass die beiden Programmaufrufe KEIN verschiedenes Ergebnis liefern. Ich sitz da nämlich vor und denke: "Warum postet er nun 2 Ausgaben?. Ich sehe keinen Unterschied!" (abgesehen von der Debug-Ausgabe, die ich zum Vergleich im Geiste ausblenden muß.


crazyben schrieb:


> Wie  wäre es denn wenn man in die Lib ein Precompiler-Flag(#ifdef  SIEMENS_LOGO_0BA7) abfägt und beim Aufruf von  daveNewConnection(..,..,..,..) die entsprechenden Einstellungen für die  PDU-Länge,(..) hinterlegt?


Ziemlicher Mist. 1.Die beiden Ergänzungen

```
dc->maxPDUlength = 240; // hack for LOGO
    dc->communicationType = 2; // OP
```
können im Anwenderprogramm nach Aufruf von daveNewConnection() und vor daveConnectPLC() vorgenommen werden.
2.Für die Anbindung an solche Programmiersprachen, die nicht direkt über Zeiger auf Felder eines structs zugreifen können, wären Methoden wie setMaxPDUlength erforderlich.
3. Die Optionen von testISO_TCP wären um Optionen für maxPDUlength und Kommunikationsart zu ergänzen. 
4. Eventuell wäre ein Programm testLOGO_TCP sinnvoll, weil die Leute sich mit Kommandozeilenoptionen so schwer tun...


----------



## egal (29 Juni 2014)

Hallo Zottel,



Zottel schrieb:


> Aber bei
> Code:
> dc->communicationType = 2; // OP
> glaube ich, dass da etwas nicht richtig sein kann: Alle Versionen  von  Libnodave vor 0.8.5 setzen immer dort standardmäßig eine 1 ("PG")  ein  und Leute haben damit mit LOGOs kommuniziert !!!???


war ja vorher 

```
-        dc->msgOut[17]=dc->rack+1;
-        dc->msgOut[18]=dc->slot;
+        dc->msgOut[17]=dc->communicationType;  // (1=PG Communication,2=OP Communication,3=Step7Basic Communication)
+        dc->msgOut[18]=dc->slot | dc->rack<<5; // hope I got it right this time...
```
so das es mit der Übergabe Racknummer 1 mit der LOGO (1+1 = OP) funkte.



> Und es wundert mich. Möglicherweise kann die LOGO die PDU-Länge nicht aushandeln, wie es die anderen Steuerungen machen?


so sieht es wohl aus:
die vorherige (V <=0.8.4.6) fixe Initiallänge 960 (0x 03 C0) klappt wohl noch, die neue von 1920 Byte (0x 07 80) führt zu dem Error (0x 81 04).

edit: Typo


----------



## Thomas_v2.1 (29 Juni 2014)

Passen die verschiedenen PDU-Großen des Protokollstapels denn überhaupt zusammen?
Wenn auf ISO-Ebene eine TPDU von 9 Oktetts = 512 Bytes ausgehandelt wird, kann ich darin kein S7-Protokoll-Paket einpacken welches größer ist. 

Dann wäre das Verhalten der Logo sogar richtig. Logo stellt fest: da will mir jemand 1920 Bytes S7-Pakete schicken, hat vorher aber nur eine 512 große TDPU ausgehandelt -> passt nicht.

Wenn ich ein S7-Paket mit 960 Bytes verschicken will, muss vorher auch eine entsprechend große TPDU-Größe ausgehandelt werden, z.B. 1024 oder 2048.


----------



## crazyben (29 Juni 2014)

Das die vorgeschlagene Änderung nur ein Workaround fuer mich ist, will ich nochmal klarstellen.

Ich helfe euch gerne bei der Ursachensuche.
Aber ich brauche konkrete Anforderungen von euch.
Falls Zottel oder ein anderer Entwickler der Libnodave lust auf eine Remote-Sitzung hat, waere ich auch dazu bereit.

Edit:
Testprogramme mit speziellen modifikationen koennte ich auch laufen lassen. Aber dann bitze nur als Source. Kompilieren moechte ich selbst.


----------



## egal (29 Juni 2014)

Hi,

diese 960Byte scheint ein MaxWert für die LOGO zu sein, alle Werte kleiner funken.

Wie wäre z.B. es mit einer Halbierung der PDU-Längenvalidierung bei Fehlerversuchen:

```
--- nodave.c.org    2013-10-19 18:46:26.000000000 +0200
+++ nodave.c    2014-06-29 12:01:43.869214698 +0200
@@ -3916,6 +3916,7 @@
     if (res==0) {
         return res;
     } else {
+            dc->maxPDUlength /= 2; // retry with half PDUlength
         if (daveDebug & daveDebugPrintErrors){
         LOG2("%s error in daveConnectPLC() step 1. retrying...\n", dc->iface->name);    
         }
```

Sieht dann mit der LOGO so aus:

```
openSocket: enter OpenSocketopenSocket: OpenSocket: socket is 3
openSocket: Connected to host: 10.11.12.235 
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: 22 bytes read, 22 needed
readISOpacket: packet:                             
                            0:0x03,0x00,0x00,0x16,0x11,0xD0,0x00,0x01,0x8F,0x67,0x00,0xC0,0x01,0x09,0xC1,0x02,
                            10:0x01,0x00,0xC2,0x02,0x02,0x00,
IF1 daveConnectPLC() step 1. got packet: :                             
                            0:0x03,0x00,0x00,0x16,0x11,0xD0,0x00,0x01,0x8F,0x67,0x00,0xC0,0x01,0x09,0xC1,0x02,
                            10:0x01,0x00,0xC2,0x02,0x02,0x00,
TPDU len 9 = 512
PDU header:                             
                            0:0x32,0x01,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,
plen: 8 dlen: 0
Parameter:                             
                            0:0xF0,0x00,0x00,0x01,0x00,0x01,0x07,0x80,
_daveExchange PDU number: 65535
IF1 enter _daveExchangeTCP
send packet: :                             
                            0:0x03,0x00,0x00,0x19,0x02,0xF0,0x80,0x32,0x01,0x00,0x00,0xFF,0xFF,0x00,0x08,0x00,
                            10:0x00,0xF0,0x00,0x00,0x01,0x00,0x01,0x07,0x80,
readISOpacket: 27 bytes read, 27 needed
readISOpacket: packet:                             
                            0:0x03,0x00,0x00,0x1B,0x02,0xF0,0x80,0x32,0x03,0x00,0x00,0xFF,0xFF,0x00,0x08,0x00,
                            10:0x00,0x81,0x04,0xF0,0x00,0x00,0x01,0x00,0x01,0x00,0xF0,
IF1 _daveExchangeTCP res from read 27
result of exchange: 0
PDU header:                             
                            0:0x32,0x03,0x00,0x00,0xFF,0xFF,0x00,0x08,0x00,0x00,0x81,0x04,
plen: 8 dlen: 0
Parameter:                             
                            0:0xF0,0x00,0x00,0x01,0x00,0x01,0x00,0xF0,
error: context is not supported. Step7 says:Function not implemented or error in telgram.
IF1 error in daveConnectPLC() step 1. retrying...
PDU header:                             
                            0:0x32,0x01,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,
plen: 8 dlen: 0
Parameter:                             
                            0:0xF0,0x00,0x00,0x01,0x00,0x01,0x03,0xC0,
_daveExchange PDU number: 65536
IF1 enter _daveExchangeTCP
send packet: :                             
                            0:0x03,0x00,0x00,0x19,0x02,0xF0,0x80,0x32,0x01,0x00,0x00,0x00,0x00,0x00,0x08,0x00,
                            10:0x00,0xF0,0x00,0x00,0x01,0x00,0x01,0x03,0xC0,
readISOpacket: 27 bytes read, 27 needed
readISOpacket: packet:                             
                            0:0x03,0x00,0x00,0x1B,0x02,0xF0,0x80,0x32,0x03,0x00,0x00,0x00,0x00,0x00,0x08,0x00,
                            10:0x00,0x00,0x00,0xF0,0x00,0x00,0x01,0x00,0x01,0x00,0xF0,
IF1 _daveExchangeTCP res from read 27
result of exchange: 0
PDU header:                             
                            0:0x32,0x03,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,
plen: 8 dlen: 0
Parameter:                             
                            0:0xF0,0x00,0x00,0x01,0x00,0x01,0x00,0xF0,
error: ok

*** Partner offered PDU length: 240 used limit 240

Connected.
```


----------



## Zottel (29 Juni 2014)

Thomas_v2.1 schrieb:


> Passen die verschiedenen PDU-Großen des Protokollstapels denn überhaupt zusammen?
> Wenn auf ISO-Ebene eine TPDU von 9 Oktetts = 512 Bytes ausgehandelt wird, kann ich darin kein S7-Protokoll-Paket einpacken welches größer ist.


Nein, die S7-PDU wird dann auf mehrere ISO-Pakete aufgeteilt, die nachher wieder zusammengesetzt werden müssen. Dies passiert auch bei MPI- oder Profibus-Kommunikation, wenn die S7-PDU >240 Byte ist. Dieses Zerlegen und Zusammensetzen ist neu ab Libnodave 0.8.5. Eine PDU mit 1920 Byte habe ich noch nicht gesehn. Maximum war 960. Aber die CPUs, die ich getestet habe, akzeptierten es...


----------



## Thomas_v2.1 (29 Juni 2014)

Zottel schrieb:


> Nein, die S7-PDU wird dann auf mehrere ISO-Pakete aufgeteilt, die nachher wieder zusammengesetzt werden müssen. Dies passiert auch bei MPI- oder Profibus-Kommunikation, wenn die S7-PDU >240 Byte ist. Dieses Zerlegen und Zusammensetzen ist neu ab Libnodave 0.8.5. Eine PDU mit 1920 Byte habe ich noch nicht gesehn. Maximum war 960. Aber die CPUs, die ich getestet habe, akzeptierten es...



Stimmt, hatte ich ganz vergessen. Es gibt dafür extra dieses Flag-Bit im Iso-Kopf.
In den meisten Aufzeichnungen die ich habe bei denen ein Siemens-Produkt Client ist, wird eine TPDU von 1024 Bytes und eine PDU von 480 Bytes angefragt.

Ist meiner Meinung nach sinnvoller wenn TPDU >= PDU. Ist TPDU < PDU wird es über die Fragmentierung zwar funktionieren, aber bringt dann doch keinen Vorteil mehr. Oder hat das einen anderen Grund dass bei der neuen libnodave TPDU=512 und PDU=1920 ist?


----------



## Zottel (29 Juni 2014)

Thomas_v2.1 schrieb:


> ..Ist meiner Meinung nach sinnvoller wenn TPDU >= PDU. Ist TPDU < PDU wird es über die Fragmentierung zwar funktionieren, aber bringt dann doch keinen Vorteil mehr. Oder hat das einen anderen Grund dass bei der neuen libnodave TPDU=512 und PDU=1920 ist?


Bei TPDU=512 bin ich unsicher. Es ist möglich, dass es einfach der Wert ist, der am Ende mehrerer Versuche da stand...das hätte ich mir wohl aufschreiben sollen. Bei der PDU ist es so, dass die Länge bei der Verhandlung in allen Versuchen und Gerätekombinationen immer nur reduziert oder bestätigt wird, man also hoch anfangen muß. Der Wert von 1920 kam zustande, weil:
- 960 habe ich gesehen
- mit der "traditionellen" Pufferlänge daveMaxRawLen=2048 geht noch das Doppelte
- noch größere ansonsten nutzlose Puffer wollte ich nicht anlegen (vor allem wegen embedded-Systemen). Wenn wirklich PDUs von 2*1920 vorkommen würde ich die Puffergröße konfigurierbar machen und den Speicher erst nach der "Verhandlung" allokieren wollen.

Den Nutzen von PDU>TPDU kann ich nicht nachweisen; ich vermute aber dass es ihn dann geben kann, wenn ein Gerät oder ein Teilprozeß innerhalb der Firmware die große PDU empfängt und dann in TPDUs zerlegt. Beispiel: CP443 kriegt die ganze PDU über den Rückwandbus und zerlegt sie selbstständig in TPDUs. Oder ein Prozeß(Thread oder main()) der Firmware beantwortet S7-Anfragen und legt die Antwort-PDU in einem gemeinsam genutzten Speicherbereich ab. Ein anderer Prozeß (Thread oder z.B. Timer-IRQ-Routine) stellt bei Bedarf daraus die nächste TPDU zur Verfügung. 
Oder ein Prozeß (Thread oder main()) der Firmware beantwortet S7-Anfragen  und legt alle Teil-TPDUs  im  gemeinsam genutzten Speicherbereich ab. Dort holt sich der  TCP-IP-Stack die Pakete nacheinander.
Diese Vorstellungen von der internen Arbeitsweise einer S7 sind nur Spekulation. 
Das mit 0.8.5 eingeführte Routing erlaubt noch eine Menge mehr Szenarien, in denen es meiner Vermutung nach so fuktionieren sollte, dass die PDU-Länge mit dem Zielgerät ausgehandelt wird, aber zwischen routenden Geräten andere Paketlängen verwendet werden.


----------



## pc1246 (8 Dezember 2014)

Hallo zusammen
Ich habe ein kleines Verstaendnisproblem! Wie lese ich aus einer S7-300 ein- bzw. Ausgaenge, oder gar Merker aus? Datenbausteininhalte funktioniert, aber irgendwie erschliesst sich mir die Syntax fuer den Rest nicht! Oder muss ich dann einfach nur "0" angeben? Wenn dem so ist, wie weiss ich dann ob ich Ein- oder Ausgaenge lese? Sorry fuer meine Blindheit!
Gruss Christoph


----------



## 100Morpheus (25 März 2015)

Hallo,
ich und mein Freund habe hier bei mir die Libnodave mal so  angepasst das ich auf meine PI die Temperaturwerte aus meiner S7 300  auslesen kann und an das Prog cacti übergeben funktioniert sehr gut.
Hier jetzt nur mit einem Wert dargestellt.

```
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include "nodave.h"
#include "openSocket.h"

#ifdef LINUX
#include <unistd.h>
#include <sys/time.h>
#include <fcntl.h>
#define UNIX_STYLE
#endif

#ifdef BCCWIN
#include <time.h>
    void usage(void);
    void wait(void);
#define WIN_STYLE
#endif

#include <errno.h>

int main(int argc, char **argv) {
    int res;
    daveInterface * di;
    daveConnection * dc;
    _daveOSserialType fds;

    daveSetDebug(daveDebugPrintErrors);

        char *PLC_IP="192.168.0.200";

    fds.rfd=openSocket(102, PLC_IP);
    fds.wfd=fds.rfd;

    if (fds.rfd>0)
        {
                di =daveNewInterface(fds,"IF1",0, daveProtoISOTCP, daveSpeed187k);
                daveSetTimeout(di,5000000);
                dc =daveNewConnection(di,2,0,2);  // insert your rack and slot here
                if (0==daveConnectPLC(dc))
                {

                        res=daveReadBytes(dc,daveDB,400,2,4,NULL);
                        if(0==res)
                        {
                                float TEST=daveGetFloat(dc);

                                printf("TEST %f\n",TEST);
                        }
                        else
                                printf("failed! (%d)\n",res);

                        closeSocket(fds.rfd);

                        return 0;
                }
                else
                {
                        printf("Couldn't connect to PLC with IP \"%s\".\n",PLC_IP);
                        closeSocket(fds.rfd);
                        return -2;
                }
    }
        else
        {
                 printf("Couldn't open TCP port. \nPlease make sure a CP is connected  and the IP \"%s\" address is ok. \n",PLC_IP);
        return -1;
    }
}
```

Jetzt wollte ich das ganze aus einer Logo 8 auslesen.
Habe  den code mal so abgeändert aber bin mir jetzt auch nicht sicher wie ich  in meiner Logo Temperaturwerte auslesen kann habe zwei Analogverstärker  in de Variablenspeicher.
Habe auch mal einen Analogen  Netzwerkausgang gesezt. Oder eine Serververbindung aufgemacht auf der  Logo bekomme aber immer nur 0 angezeigt. Kann mir jemand hier mal ein  Beispiel geben.
Benutze auch die lib 0.8.5 mit den zwei änderungen wie oben beschrieben.


```
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include "nodave.h"
#include "openSocket.h"

#ifdef LINUX
#include <unistd.h>
#include <sys/time.h>
#include <fcntl.h>
#define UNIX_STYLE
#endif

#ifdef BCCWIN
#include <time.h>
    void usage(void);
    void wait(void);
#define WIN_STYLE
#endif

#include <errno.h>

int main(int argc, char **argv) {
    int res;
    daveInterface * di;
    daveConnection * dc;
    _daveOSserialType fds;

    daveSetDebug(daveDebugPrintErrors);

        char *PLC_IP="192.168.1.201";

    fds.rfd=openSocket(102, PLC_IP);
    fds.wfd=fds.rfd;

    if (fds.rfd>0)
        {
                di =daveNewInterface(fds,"IF1",0, daveProtoISOTCP, daveSpeed187k);
                daveSetTimeout(di,5000000);
                dc =daveNewConnection(di,2,0,0);  // insert your rack and slot here
                dc->communicationType = 2; // OP
                dc->maxPDUlength = 240;
                if (0==daveConnectPLC(dc))
                {

                        res=daveReadBytes(dc,daveDB,1,350,2,NULL);
                        if(0==res)
                        {
                                float TEST=daveGetFloat(dc);

                                printf("TEST %f\n",TEST);
                        }
                        else
                                printf("failed! (%d)\n",res);

                        closeSocket(fds.rfd);

                        return 0;
                }
                else
                {
                        printf("Couldn't connect to PLC with IP \"%s\".\n",PLC_IP);
                        closeSocket(fds.rfd);
                        return -2;
                }
    }
        else
        {
                 printf("Couldn't open TCP port. \nPlease make sure a CP is connected  and the IP \"%s\" address is ok. \n",PLC_IP);
        return -1;
    }
}
```

Danke schonmal für eure Hilfe!
Gruß Frank


----------



## PN/DP (25 März 2015)

Siehe mal Libnodave Siemens Logo 8 die Adress-Mappingliste und die LOGO8-Besonderheiten.

Harald


----------



## Cami (17 August 2015)

Hallo ich benötige mal eure hilfe.
Ich habe auf einem Raspberry Pi 2 Model B Libnodave Installiert mit

```
git clone git://github.com/netdata/libnodave.git
cd libnodave
make
sudo make install
```

anschließend habe ich in Makefile geändert und "sudo make install"

Ergebniss

```
pi@raspberrypi ~/libnodave $ sudo make install
cc -m64 -Wall -Winline -DLINUX -DDAVE_LITTLE_ENDIAN -fPIC -DARM_FIX  -m64 -Wall -Winline -DLINUX -DDAVE_LITTLE_ENDIAN -fPIC  -c -o nodave.o nodave.c
cc1: error: unrecognized command line option â-m64â
cc1: error: unrecognized command line option â-m64â
<builtin>: recipe for target 'nodave.o' failed
make: *** [nodave.o] Error 1
```

Wenn ich jetzt folgende Eingebe erhalte ich diesen Fehler.

```
pi@raspberrypi ~/libnodave $ ./testISO_TCP 192.168.178.23
-bash: ./testISO_TCP: cannot execute binary file
```

Was mache ich falsch ?


----------



## Cami (17 August 2015)

doppelter Beitrag


----------



## Cami (18 August 2015)

Habe die test verbindung hin bekommen.

wie kann ich jetzt einen bit lesen oder schreiben ?
Wenn jemand ein Beispielt hat wie ich z.b einen GIPO Pin zur SPS schreiben kann wäre das super

Ich habe eine S7 315 PN


----------



## PKN (6 Februar 2016)

Hallo,

habe bei mir das Gleiche Problem, könntest du mir vielleicht deine Lösung geben?

Patrick


----------



## B-Tronic (8 Januar 2017)

Falls hier jemand eine Lösung sucht:

Einfach beim Makefile die -m64 Einträge entfernen, dann kann man kompilieren...


----------

