Anleitung libnodave verbindung zum S7 SPS

stblme01

Level-1
Beiträge
9
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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 :ROFLMAO: :ROFLMAO:

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 :-(
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
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!
 
nicht sehr freuen HÄÄÄÄ ?????
Willst du hilfe oder nicht :ROFLMAO: :ROFLMAO:



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

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.
 
Schreib fehler

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

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?
 
...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?
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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:cool:, 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.
 
...
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...
Ich übergebe der Datei beim Starten keine Parameter.
Warum eigentlich nicht? Bei diesem Fall...
..win\testISO_TCP.exe arbeiten und auf meine SPS zugreifen.
...ging es doch auch nur mit Parameter.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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:ROFLMAO:.

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.
 
Da hast etwas nicht richtig verstanden.
Vergleiche folgenden Ausschnitt aus simpleISO_TCP.cs:
Code:
		    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.
 
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?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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...
 
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

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!
 
Zurück
Oben