keine Verbindung S7-1200 mit Windows-Anwendung( libnodave+VS2008/2010 c#)

Zuviel Werbung?
-> Hier kostenlos registrieren
Mit readBytes() werden 16 bytes gelesen, beginnend mit MB0.
Es werden also MB0 bis MB15 gelesen.
Die von der SPS gelesenen Bytes werden in einen Puffer geschrieben. Der Puffer wird von daveConnection verwaltet. Nach der Ausführung von readBytes() wird ein interner Zeiger auf das erste gelesene Byte gerichtet.
Dem Testprogramm liegt die (fiktionale) Annahme zugrunde, daß MB0 bis MB15 wie folgt verwendet werden:
MD0 DINT
MD4 DINT
MD8 DINT
MD12 REAL

a = dc.getS32();
holt 4 Bytes aus dem internen Puffer, bringt sie in die richtige Reihenfolge und weist den Wert der Variablen a zu. Die 4 Bytes stammen aus MB0,MB1,MB2 und MB3. Als "Nebenwirkung" steht der besagte Zeiger jetzt auf dem Byte, das aus MB4 gelesen wurde.
b = dc.getS32();
holt 4 Bytes aus dem internen Puffer, bringt sie in die richtige Reihenfolge und weist den Wert der Variablen b zu. Die 4 Bytes stammen aus MB4,MB5,MB6 und MB7. Als "Nebenwirkung" steht der besagte Zeiger jetzt auf dem Byte, das aus MB8 gelesen wurde.

usw.

Nota bene:
Du kannst mehr Bytes aus dem Puffer holen als gelesen wurden oder auch als der Puffer lang ist. Dann erhälst du unsinnige Werte oder einen Absturz wegen Speicher-Schutzverletzung.
 
tja also mit dem anderen PC das gleiche ergebnis connectPLC() liefert -1. wenn die beiden Protokolle eigentlich gut aussehen warum kann ich mich dann nicht verbinden?
snif1.jpg das sagt mir Wireshark wenn ich mich connecten will. Zeile 82 ist der connectPLC() befehl an die SPS
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Weiß ich jetzt auch nicht... Ich bin auch kein Wireshark-Experte. Die 5 Zeilen sagen mir wenig.

Möglichkeit 1: Vergleichen, was Wireshark sagt, wenn du mit dem Testprogramm arbeitest.
Möglichkeit 2: In deinem Programm die Debug-Ausgabe von libnodave aktivieren und mit den Ausgaben des Testprogramms vergleichen.
 
Hi Zottel,

Die Zeit hab ich irgendwann zum testen mal geändert in der Hoffnung da würde sich was tun, hatte sie anfangs auf 1000000,
ok der 1.Befehl: 1st parameter --
fds8
fds.rfd 0
fds.wfd 0
Couldn´t establish connection to slot=1
( das selbe bei slot 0 oder 2)

der 2.Befehl:
1st parameter -d
turning debug onf
ds8
openSocketw.c: enter OpenSocket
openScoketw.c: 1
openSocketw.c: 2 6600
openSocketw.c: peer:192.168.0.1=16820416
openSocketw.c: 6
openSocketw.c: 7
openSocketw.c: socket is 120
openSocketw.c: setsockopt No error 0
openSocketw.c: 8
openSocketw.c: connected to host= 192.168.0.1
fds.rfd 120
fds.wfd 120
send pecket: :
0:0x03;0x00........
10:0x02,0x01,0x02,0xc0,0x01,0x09,
timeout in ReadISOPacket
IF1 daveConnectPLC() step1, got packet: :
IF1 error in daveConnectPLC() step 1. retrying...timeout in ReadISOPacket.
(und das ganze dann noch 2mal, endet mit retrying...)
In deinem Beitrag steht zweimal
send pecket: :
Wieso? Das kommt doch aus der dll.

In der Ausgabe der Testprogramme steht richtig:
send packet: :
0:0x03,0x00,0x00,0x16,0x11,0xE0,0x00,0x00,0x00,0x01,0x00,0xC1,0x02,0x01,0x00,0xC2,
10:0x02,0x01,0x00,0xC0,0x01,0x09,
readISOpacket: 22 bytes read, 22 needed
readISOpacket: packet:
0:0x03,0x00,0x00,0x16,0x11,0xD0,0x00,0x01,0x00,0x04,0x00,0xC0,0x01,0x09,0xC1,0x02,
10:0x01,0x00,0xC2,0x02,0x01,0x00,

Wo hast du also die DLL her?
 
hatte ich nur abgetippt und offensichtlich vertippt und war wie gesagt noch mit dem pascal-prog
 
wie aktiviere ich denn die debug-ausgabe??
indem du
daveSetDebug(daveDebugAll);
in deinen Code einfügst.
...an meinem Code ( s.Seite 1) ist ja im wesentlichen nix falsch oder?
Was ist der letzte Stand deines Codes?
Sonst ist das beste Beispiel simpleISO_TCP.cs, nur das du die Slot-Nummer ändern mußt.
Du solltest halt die Timeout-Zeit entweder gar nicht setzen oder auf irgendetwas in Sekunden-Größenordnung (Die Verbindung hat, wenn du sie erzeugst, schon einen Default-Wert von 1000000 (us, also 1 Sekunde) für das Timeout.
Ferner solltest du die Slot-Nummer auf 1 setzen.
 
also hier mal der Code, ist so ziemlich das selbe wie in der simpleISO_TCP.cs, bis auf die Consolen-Ausgabe.
Sorry für die vielleicht doof Frage ( ich mach das hier leider noch net so lang und libnodave kenn ich seit 2 wochen, aber eben nicht wirklich gut): aber an welcher Stelle füge ich denn den Befehl daveSetDebug(daveDebugAll) ein? Hab ihn mal etwas weiter unten reingepackt aber wieder auskommentiert weil da irgendwie nix passiert...
static libnodave.daveInterface di;
static libnodave.daveOSserialType fds;
static libnodave.daveConnection dc;

private void button2_Click(object sender, EventArgs e)
{
int a = 0, res, b = 0, c = 0;
float d = 0;

fds.rfd = libnodave.openSocket(102, "192.168.0.1");
fds.wfd = fds.rfd;

if (fds.rfd > 0)
{
di = new libnodave.daveInterface(fds, "IF1", 0, libnodave.daveProtoISOTCP, libnodave.daveSpeed187k);
di.setTimeout(1000000);
//res = dii.initAdapter();

dc = new libnodave.daveConnection(di, 0, 0, 1); <-- habs mit 0,1 und 2 probiert


if (0 == dc.connectPLC()) <---- hier wird ne -1 als Rückgabewert erzeugt
{

res = dc.readBytes(libnodave.daveFlags, 0, 1, 16, null);

if (res == 0)
{
a = dc.getS32();
b = dc.getS32();
c = dc.getS32();
d = dc.getFloat();

tb_a.Text = a.ToString();
tb_b.Text = b.ToString();
tb_c.Text = c.ToString();
tb_d.Text = d.ToString();



}
else
MessageBox.Show("error" + res + "" + libnodave.daveStrerror(res));

}
//libnodave.daveSetDebug(libnodave.daveDebugAll);
MessageBox.Show(dc.connectPLC().ToString());
dc.disconnectPLC();
libnodave.closeSocket(fds.rfd);

}
else
{
MessageBox.Show("kann nicht öffnen");

}

}

Kann es sein, dass sich das testISO_TCP Programm auf eine andere Weise mit der SPS verbindet die, im Gegensatz zu der hier, funktioniert?? Hattest ja glaube geschrieben, wenn das Testprogramm funktioniert muss es irgendwie an meinem Code liegen...
In der Lib gibts ja noch die Funktion daveConnectPLC(...), ich nehm mal an das es beabsichtigt ist das ich die nicht aufrufen kann? bekomme da die Meldung dass ich keinen Zugriff habe aufgrund der Sichheitsebene...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...aber an welcher Stelle füge ich denn den Befehl daveSetDebug(daveDebugAll) ein?
Wo du willst. Ab dort werden die folgenden Aufrufe von Funktionen von Libnodave was ausgeben. Also möglichst weit vorne, dann siehst du mehr.

Kann es sein, dass sich das testISO_TCP Programm auf eine andere Weise mit der SPS verbindet die, im Gegensatz zu der hier, funktioniert??
Nein.
In der Lib gibts ja noch die Funktion daveConnectPLC(...), ich nehm mal an das es beabsichtigt ist das ich die nicht aufrufen kann? bekomme da die Meldung dass ich keinen Zugriff habe aufgrund der Sichheitsebene...
daveConnectPLC(...) ist Teil von libnodave.dll. connectPLC ruft es auf, aber so dass das umgebende daveConnection-Object den Aufrufparameter verwaltet...

Dein Code sieht eigentlich gut aus. Keine Ahnung, was da passiert. Du kannst auch mal simpleISO_TCP.cs nehmen, slot von 2 auf 1 ändern und sehen ob es läuft. Es wird genauso über die Kommandozeile aufgerufen. Und beide dlls müssen auffindbar sein.
 
VS2010 kann egal bei welchen Prgramm die Test.vbproj nicht öffnen weil der Projekttyp nicht unterstützt wird.
VS2008 kann den Verweis nicht finden, obwohl ich die sogar schon mal neu hinzugefügt hab und auch mal in den debug ordner reingepackt hab.

Sorry das Ich mich jetzt erst wieder melde...

Aber hast du VS2010 express? Dann kannst du entweder nur C# oder nur VB.NET entwickeln, und meine Solution enthält Projekte für beide Sprachen. Schmeiss doch einfach die VB Projekte raus, dann solltest du auch compilieren können...
 
@zottel:eek:k hab ich gemacht. hatte zuerst ohne ip adresse eingegeben dann kam ne Fehlermeldung simpleISO_TCP.exe funktioniert nicht mehr..
mit der IP von meiner SPS kam dann nur: openSocketw.c: Connected to host: IP
Heißt dass das es funktioniert hat? Das Prog versucht ja auch aus nem Merker zu lesen wenn ich das richtig verstanden hab. Welcher ist das denn? MD0??Damit ich den mal setzen kann um da mal was drin zu haben. Aber müsste er nicht trotzdem wenigstens Null anzeigen?
 
@zottel:eek:k hab ich gemacht. hatte zuerst ohne ip adresse eingegeben dann kam ne Fehlermeldung simpleISO_TCP.exe funktioniert nicht mehr..
mit der IP von meiner SPS kam dann nur: openSocketw.c: Connected to host: IP
Heißt dass das es funktioniert hat? Das Prog versucht ja auch aus nem Merker zu lesen wenn ich das richtig verstanden hab. Welcher ist das denn? MD0??Damit ich den mal setzen kann um da mal was drin zu haben. Aber müsste er nicht trotzdem wenigstens Null anzeigen?
Was hast du gemacht? simpleISO_TCP.exe benutzt standardmäßig den slot 2 und "versteht" keine Parameter.
Du mußt es also neu kompilieren, nachdem du die Slot-Nummer auf 1 gesetzt hast.
Da du es eh neu kompilierst, kannst du auch gleich die debug-Ausgabe aktivieren.
Die bisherige Ausgabe "openSocketw.c: Connected to host: IP" bedeutet lediglich, daß eine Verbindung auf TCP/IP Ebene stattgefunden hat. Es bedeutet NICHT, das ConnectPLC() erfolgreich war.
 
Ich glaub ich muss dir erst mal meine Dank aussprechen dass do soviel Geduld bis jetzt hast. Ich trau mich schon kaum zu fragen ( langsam weiß ich aber wieviel ich eigentlich nicht weiß..) hab die cs datei mit VS geöffnet und bearbeitet, also slot=1 und die debug ausgabe mit rein. Normalerweise würde ich die jetzt debuggen, aber das geht nicht,ist grau hinterlegt. wie kompiliere ich die Datei sonst? (nicht haun ;) )
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe nur gelegentlich mit Visual Studio gearbeitet. Ich glaube, der Menüpunkt heißt "Erstellen".

Ansonsten geht es auch von der Kommandozeile, schaue dir die Datei libnodave-0.8.4.6\Dot.NET\MSnet.bat an.

>csc /r:./libnodave.net.dll simpleISO_TCP.cs

sollte es tun, sofern libnodave.net.dll im selben Verzeichnis liegt.

Kommandozeile (oder Eingabeaufforderung) ist hier aber eine, die du über die Einträge von Visual Studio im Menü Programme öffnest. Das Spezielle an dieser Eingabeaufforderung ist, das der Suchpfad zum C#-Compiler csc und vielleicht noch ein paar Dinge voreingestellt werden.

Der Vorteil der Kommandozeile liegt für mich darin, dass ich dann eben nicht wissen muß wie der Menüpunkt heißt und dass es auch mit einer älteren, neueren oder ausländischen Version von Visual Studio genauso geht. Ich muß auch gar nicht warten, bis dieses ganze Visual Studio lädt und bereit zum Arbeiten ist.
 
kommt ne Fehlermeldung: der Befehl "csc" ist entweder falsch geschrieben oder konnte nicht gefunden werden. Hab glaub schon ne Lösung ergoogelt aber schreib morgen ne wichtige Arbeit und werd das deshalb auf morgen verschieben müssen. Bis hierhin schonmal ein Riesendanke :)
 
So da bin ich wieder:smile:

Hab geschafft die simpleISO_TCP.cs zu kompilieren nachdem ich den slot geändert habe. Wenn ich aber die exe aufrufe, kommt entweder die Fehlermeldung: Der Index war ausserhalb der Arraybereichs. Wenn ich dann meine ip beim Aufruf mit eingebe kommt der Fehler: Es wurde versucht eine Datei mit einem falschen Format zu laden, bei libnodave.openSocket(Int32 port, String portname)

Der gleiche Fehler kommt wenn ich die IP direkt in den Code eintrage...
 
Zurück
Oben