# Anleitung libnodave verbindung zum S7 SPS



## stblme01 (17 Januar 2008)

Hallo User des SPS-Forums

ich brauche eine Hilfe für den ersten Schritt mit der Bibliothek libnodave. 
Mit der SPS S7 soll mit einem Netlink Adapter über Ethernet mit dem PC kommuniziert  werden. Die SPS so wie der PC ist einem Netzwerk zusammen geschalten doch nicht verbunden, das ist ja die aufgabe der Bibliothek.

Meine situation sie so aus das ich diese Bibliothek libnodave 0.8.4 runter geladen und entpackt habe. Ich bevorzuge C sharp als programmiersprache und habe in dieser auch Grundkenntnisse. 

Für die ersten Ziele sehe ich ganz einfach die Verbindung zur SPS vor.
...Dot.NET\CS\simpleISO_TCP.exe gestartet ... kommt bei mir diese Fehlermeldung... 


Die Anwendung hat einen Ausnahmefehlerverursacht, der nicht verarbeitet werden konnte.

Prozess-ID=0xa6c(2668), Thread-ID=0x94c(2380)

Habe etwas nicht berücksichtig oder wie sehen die ersten schritte aus...

Für eine kleine Informationen flut oder eine Anleitung der ersten schritte würde ich nicht sehr freuen. 

Vielen Dank


----------



## MW (17 Januar 2008)

stblme01 schrieb:


> Für eine kleine Informationen flut oder eine Anleitung der ersten schritte würde ich nicht sehr freuen.


 
nicht sehr freuen HÄÄÄÄ ?????
Willst du hilfe oder nicht   



stblme01 schrieb:


> ich brauche eine Hilfe für den ersten Schritt mit der Bibliothek libnodave.
> Mit der SPS S7 soll mit einem Netlink Adapter über Ethernet mit dem PC kommuniziert werden. Die SPS so wie der PC ist einem Netzwerk zusammen geschalten doch nicht verbunden, das ist ja die aufgabe der Bibliothek.
> 
> Für die ersten Ziele sehe ich ganz einfach die Verbindung zur SPS vor.
> ...Dot.NET\CS\simpleISO_TCP.exe gestartet ...


 
Probier mal die Testprogramme: "testibh.exe" oder "testnlpro.exe" aus dem Ordner "win". Damit sollte es funktionieren.


EDIT: Wer lesen kann is klar im vorteil, ich konnte es malwieder nicht richtig :-(


----------



## Ralle (17 Januar 2008)

1 Es ist besser, du öffnest in Windows eine Console
 (Start/Programme/Zubehör/Eingabeaufforderung), dann siehst du auch die Fehlermeldungen und Ausgaben.
2. Dann kopierst du die Datei "libnodave.net.dll" aus dem Verzeichnis .../Dot.Net in das Verzeichnis ...//Dot.Net/cs
3. Dem Aufruf mußt du die Adresse der SPS mitgeben, also:

simpleISO_TCP 192.168.1.2

Das funzt dann, es werden dir 4 Werte aus der SPS gelesen.

PS: Allerdings hab ich eine Verbindung zu einer VIPA mit eingebauter CP!


----------



## Ralle (17 Januar 2008)

MW schrieb:


> nicht sehr freuen HÄÄÄÄ ?????
> Willst du hilfe oder nicht
> 
> 
> ...



Der Quellcode ist ja dabei, also kann er das richtige Protokoll wählen, falls es das für den IBH gibt:

daveProtoMPI,                             //MPI-Protocol
                     daveProtoMPI2,                            //MPI-Protocol (Andrew's version without STX)
                     daveProtoMPI3,                            //MPI-Protocol (Step 7 Version version)
                     daveProtoMPI4,                            //MPI-Protocol (Andrew's version with STX)
                     daveProtoPPI,                             //PPI-Protocol
                     daveProtoISOTCP,                          //ISO over TCP
                     daveProtoISOTCP243,                       //ISO over TCP (for CP243)
                     daveProtoIBH,                             //IBH-Link TCP/MPI-Adapter
                     daveProtoIBH_PPI,                         //IBH-Link TCP/MPI-Adapter with PPI-Protocol
                     daveProtoS7Online,                        //use S7Onlinx.dll for transport via Siemens CP
                     daveProtoAS511,                           //S5 via programmer-port
                     daveProtoNLPro                            //Deltalogic NetLink-PRO TCP/MPI-Adapter

und dann neu compilieren.


----------



## stblme01 (17 Januar 2008)

*Schreib fehler*

Sorry das wörtchen " *nicht* " sollte ein " *mich* " werden... 

Gute Idee die zwei anderen Programme auszuprobieren.
Aber diese schließen gleich wieder wenn ich sie ausführe...
Kann ich das Problem lösen wenn ich in Windows etwas ändere?

Gibts es Codemuster mit denen die Verbindung herstellbar ist?


----------



## Ralle (17 Januar 2008)

stblme01 schrieb:


> Aber diese schließen gleich wieder wenn ich sie ausführe...
> Kann ich das Problem lösen wenn ich in Windows etwas ändere?



Siehe meinen Post weiter oben.


----------



## stblme01 (22 Januar 2008)

*...win\testISO_TCP.exe in C#*

Hallo Jungs,

ich habe den ersten schritt Geschaft...
und zwar kann ich mit der Datei ...win\testISO_TCP.exe arbeiten und auf meine SPS zugreifen.

Danke erstmal.

So jetzt die nächste herausforderung und zwar brauche ich jetzt den Code der Datei in C#. In C ist er ja vorhanden und unter ... C sharp\... sehe ich diese Datei testISO_TCP.cs.
Aber sie läuft nicht wie die ...win\testISO_TCP.exe.

Habt ihr eine Idee oder noch eine Tip, wo ich einen C# code herkriege der so ähnlich ist wie datei ...win\testISO_TCP.exe?


----------



## Zottel (22 Januar 2008)

Im Verzeichnis C-sharp findest du die Datei testISO_TCP.cs. Darin wird Libnodave direkt eingebunden. Das komplizierteste daran ist die Übergabe der Parameter aus C# an libnodave.dll. Eine übersetzte Version dieser Datei ist nicht dabei. Das müßtest du selbst machen. Wegen der Verwendung von Pointern muß man den Compiler auch noch anweisen,diese "unsichere" Programmierung zu akzeptieren.
Nachher habe ich die Parameterübergabe in eine eigene DLL, nämlich libnodave.net.dll "ausgelagert". Auf diese Weise rufen C#-Programme C# Methoden auf. Die Beispiele im Verzeichnis Dot.NET nutzen diese Zusatz-DLL. Im Unterverzeichnis CS findest du simpleISO_TCP.cs und auch das daraus kompilierte simpleISO_TCP.exe. Es braucht beide DLLs, libnodave.dll UND libnodave.net.dll, zum Laufen. Diese Dateien müssen also zur Laufzeit gefunden werden können.
Das "simple" in simpleISO_TCP bezieht sich darauf, daß in diesem Programm nur eine kleine Zahl von Funktionen, nämlich Verbindung herstellen und Werte lesen, implementiert ist. Im Gegensatz dazu können in testISO_TCP.c durch Kommandozeilen-Optionen nahezu alle Funktionen der libnodave.dll ausprobiert werden (z.B. -w) für Schreiben. Wie diese Funktionen aufgerufen werden, sollte sich leicht aus den Quelltexten von testISO_TCP.c und libnodave.net.cs ableiten lassen.

Noch ein Wort zu Ralles Tipp (Protokoll wählen, neu compilieren): Da das Compilieren doch etlichen Usern schwer fällt, sind gesonderte Testprogramme für alle unterstützten Protokolle vorhanden. Es ist also nicht nötig.


----------



## stblme01 (23 Januar 2008)

*Zottel*

Hi Zolltel die Idee von dir hilft mir weiter. Aber ich kriege die Datei ...Dot.NET\simpleISO_TCP.exe nicht zum laufen. Es erschein immer der Fehler:
----------------------------------------------------------------------------
Die Anwendung hat einen Ausnahmefehlerverursacht, der nicht verarbeitet werden konnte.

Prozess-ID=0xa6c(266, Thread-ID=0x94c(2380)

Unbehandelte Ausnahme: System.IndexOutOfRangeException: Der Index war außerhalb des Arraybereichs.
at test.Main(String[] args)
---------------------------------------------------------------------------
Ich habe beide DLL´s ins Verzeihnis kopiert.
Ich übergebe der Datei beim Starten keine Parameter.
Ich verwende die Version Libnodave 0.8.4

Hast du noch ein Tipp für mich wie ich wenigstens die Datei zum laufen kriegen könnte. 

Danke schon mal.


----------



## Ralle (23 Januar 2008)

Aber die IP-Nummer mußt du doch wenigstens übergeben!


----------



## Zottel (23 Januar 2008)

stblme01 schrieb:


> ...
> Unbehandelte Ausnahme: System.IndexOutOfRangeException: Der Index war außerhalb des Arraybereichs.
> at test.Main(String[] args)
> ...


Sorry, ich weiß nicht ob ich das richtig sehe aber:
Der Quelltext ist dabei. Wenn du Main(String[] args) siehst, schaust du nach Main(String[] args). Sieht man dann, daß es sich um die dem Programm übergebenen Parameter handelt? Woher sonst bekäme Main Werte übergeben? 

Wenn nicht: Jemand, der schon mal öfter versucht hat, ein fremdes Programm zu verstehen, könnte nun suchen, wo args überall verwendet wird. Wenn es trotz Suche im Text zu mühsam ist, einfach auskommentieren ;Der Compiler zeigt's dir dann. 
Erkenntnis: 5 Zeilen weiter wird args[0] an openSocket übergeben. Also mal Definition von openSocket anschauen. Mußt du für eigene Programme sowieso kennen. doc/openSocket.html erklärt die Parameter. Wenn du dann nicht darauf kommst, wo args[] herkommt, mal eine feste IP einsetzen...


stblme01 schrieb:


> Ich übergebe der Datei beim Starten keine Parameter.


Warum eigentlich nicht? Bei diesem Fall...


stblme01 schrieb:


> ..win\testISO_TCP.exe arbeiten und auf meine SPS zugreifen.


...ging es doch auch nur mit Parameter.


----------



## stblme01 (24 Januar 2008)

*Hallo Leute*

Es sieht so aus dass meine Verbindung zur SPS per C# code steht.
Ich habe die Datei ...Dot.Net\CS\SimpleISO_tcp.cs nachvollzogen und den Connect zur SPS hinbekommen. 

Also ich kann meine SPS jetzt per Code in zustand STOP und RUN befördern.
Als nächstes wollte ich jetzt mal die Inputs auslesen. 

Aus den Beispielen im Code fande ich diese Zeilen:

int saveDebug = libno.daveGetDebug();

  Console.WriteLine("Trying to read a single bit from E0.2\n");
                res = dc.readBits(libno.daveInputs, 0, 2, 1, null);
                Console.WriteLine("function result:" + res + "=" +libno.daveStrerror(res));

Diese passen auf meinen Versuch ganz gut, ich will den Input E 0.2 auslesen um einfach zu sehen welches Potenzial dort anliegt. 

Doch ich kriege immer das selbe ergebniss, egal ob dort ein Singnal anliegt oder nicht.

Diese Ergebnis sieht wie folgt aus: 

function result:0=ok
______________________________________________________________
Die SPS ist korekt konfiguriert.

Meine frage wäre halt ob am Code etwas flasch ist oder ob ich insgesamt einen Gedanken fehler drin habe.


----------



## Zottel (24 Januar 2008)

Da hast etwas nicht richtig verstanden. 
Vergleiche folgenden Ausschnitt aus simpleISO_TCP.cs:

```
res=dc.readBytes(libnodave.daveFlags, 0, 0, 16, null);
		    if (res==0) {
    			a=dc.getS32();	
    			b=dc.getS32();
    			c=dc.getS32();
			d=dc.getFloat();
			Console.WriteLine("FD0: " + a);
			Console.WriteLine("FD4: " + b);
			Console.WriteLine("FD8: " + c);
			Console.WriteLine("FD12: " + d);
		    } else 
			Console.WriteLine("error "+res+" "+libnodave.daveStrerror(res));
```
readBits funktioniert genauso. Ich würde aber NIE readBits verwenden. Warum nicht? Steht auch irgendwo im README oder im FAQ.


----------



## stblme01 (24 Januar 2008)

*Zottel*

Hi Zottel 

Frage an dich, welche bytes werden von deiner Funktion gelesen?


  res=dc.readBytes(libnodave.daveFlags, 0, 0, 16, null);
            if (res==0) {
                a=dc.getS32();    
                b=dc.getS32();
                c=dc.getS32();
            d=dc.getFloat();
            Console.WriteLine("FD0: " + a);
            Console.WriteLine("FD4: " + b);
            Console.WriteLine("FD8: " + c);
            Console.WriteLine("FD12: " + d);
            } else 
            Console.WriteLine("error "+res+" "+libnodave.daveStrerror(res));

und wie müsste ich die Funktion umschreiben das ich meine Eingänge z.b von E 0.0 bis E1.7 lesen kann?


----------



## Zottel (24 Januar 2008)

Die gelesenen Bytes werden von dem Programm doch als FD0 bis FD12 ausgegeben. "FD" ist nur Englisch für "MD". Also welche Bytes gehören zu MD0 bis MD12? Wieviele sind es? Welche Parameter erwartet die Funktion readBytes() ? Siehe doc/daveReadBytes.html.

Du merkst wohl an der Art meiner Antwort, daß ich meine, du solltest ein bischen mehr lesen und ausprobieren. Natürlich könnte ich dir mit weniger Worten den modifizierten Programmcode hier hinschreiben.
Sieh mal meine Lage: Ich bekomme viele Anfragen wegen Libnodave. 
Es kostet auch Zeit, alle zu beantworten. Es ermüdet, wieder das Gleiche zu schreiben. Ich habe Libnodave "verschenkt", aber bin ich deswegen verpflichtet, Zeit und Mühe in die Unterstützung von Anwendern zu stecken?
Vielleicht sollte ich eine kostenpflichtige Hotline einrichten...


----------



## stblme01 (24 Januar 2008)

Danke für euere Hilfe.


----------



## Gindamo (29 Juli 2010)

Ich möchte mich da auch mal einklinken. Wo muss in einem C# Projekt die IP eingetragen werden? 

Gruß
Gindamo


----------



## Jochen Kühner (30 Juli 2010)

Gindamo schrieb:


> Ich möchte mich da auch mal einklinken. Wo muss in einem C# Projekt die IP eingetragen werden?
> 
> Gruß
> Gindamo



Wie ist denn das gemeint? bei dem Beispielprogramm Testiso, oder wo?


----------



## ronnie.b (30 Juli 2010)

Hallo zusammen,
was haltet ihr davon wenn man dieses Wiki
http://www.activevb.de/cgi-bin/apiwiki/Kategorie:Libnodave
mit den Usern hier aus dem Forum mal etwas ausarbeiten ?

Gruß
Ronnie


----------



## Jochen Kühner (30 Juli 2010)

ronnie.b schrieb:


> Hallo zusammen,
> was haltet ihr davon wenn man dieses Wiki
> http://www.activevb.de/cgi-bin/apiwiki/Kategorie:Libnodave
> mit den Usern hier aus dem Forum mal etwas ausarbeiten ?
> ...



Ich denke wenn dann sollte man die Api von libnodave.net.cs beschreiben, dem .NET Wrapper. Die VB6 Deklarationen der C Funktionen fänd Ich unnütz, da VB6 ja eh nicht mehr weiterentwickelt wird. Wenn man das macht, kann man ja gleich die C -Funktionen im Quellcode beschreiben...

Ich würde dann eher Vorschlagen, bei den Funktionen der libnodave.net.cs XML Kommentar mit /// einzufügen, so das die Funktionen beschrieben sind!


----------



## norghean (28 Oktober 2015)

Hallo zusammen,

kann libnodave auch schon symbolisch auf optimierte Datenbausteine der S7-1500er zugreifen?


FG
norghean


----------

