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



## jbo (9 April 2013)

Hallo,

ich versuche zur Zeit im Rahmen eines Schulprojekts eine S7-1200 (1212C AC/DC/RLY) mittels eines Programms, geschrieben in c#, zu verbinden um Daten zu lesen bzw zu schreiben.
Dazu benutze ich VS c# mit libnodave. Es befinden sich beide dll im debug-Ordner, und die libnodave.net.dll ist als Verweis hinzugefügt.
Das Programm orientiert sich an einem Prog eines Users das laut seiner Aussage in der gleichen Kombination funktioniert.
Verbunden ist das ganze per Ethernet, soll also per ISO over TCP laufen.

Problem: der Befehl dc.connectPLC() liefert nur -1

Probiert habe ich: diverse Kombinationen Rack/Slot da teils unterschiedliche Aussagen welche denn lauffähig ist; VS 2008,VS2010( dabei jeweils auf 32bit umgestellt da System 64 bit), VMWare mit XP32bit und VS2010

mit TIA Portal kann ich alles wunderbar programmieren und auch online Veränderungen der Eingänge/Variablen im DB beobachten.

Spassershalber habe ich einmal Wireshark während des Verbindungsversuchs laufen lassen, dabei liefert schon der Befehl connectPLC() an die SPS ein malformed Packet oder Wireshark kann damit einfach nix anfangen. Nach erhalt es Pakets führt die SPS scheinbar einen RESTART aus( auch wenn ich optisch an der SPS nicht sehe) und das wars dann.
Ich habe schon dieses und auch jede Menge englischsprachige Foren durchsucht, es gab zwar einige mit dem gleichen Problem aber nix was mir zu einer Lösung verholfen hat.
Ich muss gestehen, dass sich meine Kenntnisse in c# als auch SPS nur auf  den Schulunterricht begrenzen(c# halbes Jahr; SPS 1,5 Jahre)
Müssen denn in der SPS bzw im Projekt bestimmte Sachen eingestellt werden um das ganze lauffähig zu machen( TCON? )
Die Toolbox habe ich mir auch runtergeladen muss aber ebenfalls gestehen das ich nur Bahnhof versteh wie die zu verwenden ist. Von den Beispielprogrammen ist auch keins lauffähig, da kommt direkt ne Fehlermeldung von Win7
Und es gibt noch 2 große Fragezeichen: einmal gibt es in der libnodave Funktionen die mir als protected angezeigt werden, z.b daveReadBytes(....), daveconnectPLC(),...
die auch einige User verwendet haben. Ich kann die aber gar nicht benutzen-> VS meldet Zugriff aufgrund der Sicherheitsebene nicht möglich
Was mach ich da falsch??
und zum anderen diese Befehle:
                            a = dc.getS32();
                            b = dc.getS32();
                            c = dc.getS32();
                            d = dc.getFloat();
(nach: res = dc.readBytes(libnodave.daveFlags, 0, 1, 16, null);
die ich überhaupt nicht verstehe. wieso der gleiche Befehl dreimal ?und dann float-weiss jetzt nicht ob der Lesebefehl dafür korrekt ist, hab viel rumgebastelt aber lief ja nix zum testen- was liest der denn da in die vier Variablen ein???? Vielleicht ein Beispiel damit ich das verstehe 


Vielen Dank schonmal im Vorraus ( ich weiss, is bissl was zum lesen)

Hoffe jemand kann mir helfen, bin sonst echt am A...


----------



## Jochen Kühner (10 April 2013)

Poste doch mal etwas Code wie du vorgehst.

Was meinst du mit die ToolBox hab Ich mir runtergeladen? meist du damit meine SiemensPlcToolbox? Wenn ja, die Beispiele darin sollten sich eigendlich alle compilieren lasen, und auch laufen. Du musst bei vielen aber noch die libnodave_jfkmod (oder die 64er je nach compilier option) in das bin verzeichnis kopieren. Falls sie nicht compilieren, was läuft denn schief?

TCON solltest du nicht brauchen, du kannst aber nur auf DB zugreifen welche absolut adressiert werden, nicht auf vollsymbolische!


----------



## jbo (10 April 2013)

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.

Die  Geschichte mit der absoluten Adressierung hab ich schon berücksichtigt.  Kann mich aber nicht mal mit der SPS verbinden um in den Genuss diesen  Fehlers zu kommen.

Hier mal ein Ausschnitt mit den wesentlichen Prog.text:
libnodave.daveOSserialType fdss;
         libnodave.daveInterface dii;
         libnodave.daveConnection dcc;

int a = 0, res, b = 0, c = 0;
                float d = 0;
                fdss.rfd = libnodave.openSocket(102, "192.168.0.1");
                fdss.wfd = fdss.rfd;
                if (fdss.rfd > 0)
                {
                    dii = new libnodave.daveInterface(fdss, "IF1",0, libnodave.daveProtoISOTCP , libnodave.daveSpeed187k);
                    dii.setTimeout(5000);
                    res = dii.initAdapter();

                    dcc = new libnodave.daveConnection(dii, 0,0,2);
                    dcc.connectPLC();

                    if (0 == dcc.connectPLC())
                    {
                        MessageBox.Show("läuft");
                        res = dcc.readBytes(libnodave.daveFlags, 0, 1, 16, null);


danach  kommt noch bissl mehr( auslesen, abfragen etc aber unwichtig), aber  mein Problem ist der Befehl connectPLC() der mir ne null liefern müsste  wenn es funktioniert und das macht er nicht....


----------



## lan12 (11 April 2013)

Hallo,
ich hatte - allerdings mit einer S7 200 - das Problem, dass ich keine Verbindung mit Libnodave aufbauen konnte wenn MicroWIN lief. Ich weiß S7 200 und S7 1200 sind zwei paar Stiefel, aber vielleicht ...


----------



## jbo (12 April 2013)

benutze ja nur TIA Portal, und habs auch meist gar nicht offen gehabt zum testen.

Sonst hat keiner eine Idee??


----------



## lan12 (12 April 2013)

Hier gibt es noch einen kostenlosen Treiber für die S7 1200 für nicht kommerzielle Anwendungen 
.NET / Java Kommunikationstreiber PLCCom S7


----------



## jbo (12 April 2013)

Cool danke. Werd ich mal testen


----------



## Mobi (12 April 2013)

Versuch mal mit Rack = 0 und Slot = 0.


----------



## Thomas_v2.1 (12 April 2013)

Mobi schrieb:


> Versuch mal mit Rack = 0 und Slot = 0.


Da gibt es garnichts zu versuchen, denn Siemens schreibt in seinen Handbüchern eindeutig Rack 0 und Slot 1.

Siehe im PDF bezüglich Konfiguration des OPC-Servers mit Step7 5.5:
Siemens Industry Online Support - Wie binden Sie eine PC-Station über OPC an eine S7-1200 an?

Dann funktioniert der Zugriff auf Merker oder Datenbausteine mit 300/400 kompatiblem Bausteinzugriff einer S7-1200 mit libnodave tadellos.


----------



## Mobi (12 April 2013)

Ist ja gut. Ich hab es nur so geschrieben, wie ich es nutze und auch funktioniert.


----------



## Thomas_v2.1 (12 April 2013)

Funktioniert bei meiner ja auch, ich würde mich aber nicht darauf verlassen dass es bei neueren Firmwareständen so bleibt. Vielleicht ist es ein Fehler gewesen ;-)


----------



## Mobi (12 April 2013)

Solange es läuft ist ja gut, da wird auch nix geändert. Bei einer neuen Anlage werde ich es dann vielleicht mal ändern.


----------



## Zottel (13 April 2013)

jbo schrieb:


> dii.setTimeout(5000);


setzt das timeout in MIKROSEKUNDEN. 5000=5ms. Das wird wohl VIEL zu wenig sein. Im Beispiel simpleISO_TCP.cs ist die Timeout-Zeit auf 1000000, also 1s gesetzt. Zumindest im Original-Code von Libnodave ist das so.
Hast du den allerersten Punkt in den FAQ.de.txt gelesen, verstanden und ausgführt? Geht es mit den vorkompilierten Testprogrammen? Ich meine damit >testISO_TCP.exe --slot=1 <IP deiner CPU>
Egal, ob es geht oder nicht, als nächstes:
testISO_TCP.exe -d --slot=1 <IP deiner CPU>
Die Ausgabe anschauen, posten, mit der des eigenen Programms vergleichen.


----------



## jbo (13 April 2013)

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...)


----------



## Zottel (13 April 2013)

Vielleicht interessiert es ja noch mehr Leute, wie man die Testprogramme nutzt. Hier eine Anleitung mit Bildern:

1. Du öffnest im Windows-Startmenü "Ausführen"
2. Du gibst "cmd" ein. An diesen Punkt kommst du in XP auch über Zubehör/Eingabeaufforderung.
3. Du hast jetzt ein Kosolenfenster wie dieses (Screenshot cmd.gif)


4. Darin zum Ort wechseln, wo du libnodave abgespeichert hast, darin zum Verzeichnis win (cmd2.gif)


5. Jetzt kannst du das Testprogramm testISO_TCP.exe mit der IP-Adresse deiner SPS aufrufen (cmd3.gif). Bei mir hat es mit dem default-mäßigen Slot 2 funktioniert.


6. Mit --slot=1 kannst du eine Slot-Nummer angeben: Hier funktioniert es dann aber nicht mehr...(cmd4.gif)


7. Wenn du wissen willst, was genau passiert, füge Option -d hinzu (cmd5.gif). Man sieht die Daten enes Paketes, das an die SPS gesendet wird, aber die SPS antwortet nie: "timeout in ReadISOpacket".


8. Wenn du die Ausgabe mit der Debug-Option in eine Datei leiten willst, hängst du ">degug.txt" an die Befehlszeile an (cmd6.gif). 
Du wirst keine Ausgabe mehr sehen. Statt dessen wurde die Datei debug.txt geschrieben, die ich hier auch anhänge.

Schade, ich darf nur 5 Dateien anhängen...


----------



## Zottel (13 April 2013)

Also gehts hier weiter...
8. Wenn du die Ausgabe mit der Debug-Option in eine Datei leiten willst,  hängst du ">degug.txt" an die Befehlszeile an (cmd6.gif). 

Du wirst keine Ausgabe mehr sehen. Statt dessen wurde die Datei debug.txt geschrieben, die ich hier auch anhänge.
	

		
			
		

		
	



Anhang anzeigen debug.txt


----------



## Zottel (13 April 2013)

jbo schrieb:


> ....
> couldn´t establish connection to slot=1


Es muß schon das Programm testISO_TCP.exe aus dem Unterverzeichnis libnodave-0.8.4.6/win sein.
Entweder hast du ein anderes benutzt oder gar keine IP-Adresse angegeben.
In dem Zitat wurde jedenfalls versucht "slot=1" als IP-Adresse zu benutzen...


----------



## jbo (14 April 2013)

in dem pascal-ordner war auch eine exe... 
aber jetzt hab ichs denk ich..
	

		
			
		

		
	

Anhang anzeigen debug0.txt
Anhang anzeigen debug.txt

hoff mal das funktioniert... also sollte sein einmal: debug.txt mit slot=1 und einmal debug0.txt mit slot=0

hatte jetzt auch gelesen das es probleme gibt wenn der port belegt ist, bei mir spielt da ein Siemens-Programm mit rum: s7oiehsx64.exe. Kann das möglich sein??


----------



## Zottel (14 April 2013)

jbo schrieb:


> in dem pascal-ordner war auch eine exe...


Ja, die ist halt mehr als Beispiel für Pascal-Programmierer gedacht. Sie hat nicht denselben Funktionsumfang.


jbo schrieb:


> aber jetzt hab ichs denk ich..


Beide sehen gut aus. Offenbar geht es mit beiden Slot-Nummern. Würde aber dem Argument von Thomas_v2.1 folgen und die Nummer nehmen, die Siemens für den OPC-Server vorschlägt.


jbo schrieb:


> ...: debug.exe mit slot=1 und einmal debug0.exe mit slot=0...


Generell sollte die Erweiterung .exe ausführberen Dateien vorbehalten sein?!?


jbo schrieb:


> hatte jetzt auch gelesen das es probleme gibt wenn der port belegt ist, bei mir spielt da ein Siemens-Programm mit rum: s7oiehsx64.exe. Kann das möglich sein??


Mmmh... An sich können mehrere Programme eine Verbindung zur SPS aufbauen, sowohl auf TCP als auch S7-Ebene. Ich weiß aber nicht, wo bei einer 1200 die Grenze ist.
Eine andere Sache ist, daß ich manchmal Schwierigkeiten hatte, daß eine S7-Softsps nach dem Start nicht kommunizierte, weil ein anderes Programm auf Port 102 hörte.


----------



## jbo (14 April 2013)

> Generell sollte die Erweiterung .exe ausführberen Dateien vorbehalten sein?!?


hatte mich verschrieben, is ja schon etwas fortgeschritten die zeit

ich teste jetzt mein Prog mal auf nen anderen pc wo definitiv kein Siemens läuft, der Port is auf jeden Fall frei das hab ich schon gescheckt.

btw vielleicht kannst du mir beim Verständnis von einem Codeteil helfen(hab ich so von nem anderen User übernommen):

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();
ich versteh nicht so ganz wieso ich den getS32() befehl 3 mal (+den getFloat() ) aufrufe und jeweils in ne andre Variable packe. in welcher form liegen denn die Daten die man über den ReadBytes befehl ausliest vor?


----------



## Zottel (14 April 2013)

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.


----------



## jbo (14 April 2013)

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?


	

		
			
		

		
	
 das sagt mir Wireshark wenn ich mich connecten will. Zeile 82 ist der connectPLC() befehl an die SPS


----------



## Zottel (14 April 2013)

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.


----------



## Zottel (14 April 2013)

jbo schrieb:


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


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?*


----------



## jbo (14 April 2013)

hatte ich nur abgetippt und offensichtlich vertippt und war wie gesagt noch mit dem pascal-prog


----------



## jbo (14 April 2013)

wie aktiviere ich denn die debug-ausgabe??  An meinem Code ( s.Seite 1) ist ja im wesentlichen nix falsch oder?


----------



## Zottel (14 April 2013)

jbo schrieb:


> wie aktiviere ich denn die debug-ausgabe??


indem du 
daveSetDebug(daveDebugAll);
in deinen Code einfügst.


jbo schrieb:


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


----------



## jbo (14 April 2013)

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


----------



## Zottel (14 April 2013)

jbo schrieb:


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



jbo schrieb:


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


jbo schrieb:


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


----------



## Jochen Kühner (14 April 2013)

jbo schrieb:


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


----------



## jbo (14 April 2013)

@zottelk 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?


----------



## jbo (14 April 2013)

daveSetDebug(daveDebugAll) hab ich mal eingefügt, aber da passiert nichts. was hab ich da vergessen?


----------



## Zottel (14 April 2013)

jbo schrieb:


> @zottelk 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.


----------



## jbo (14 April 2013)

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  )


----------



## Zottel (14 April 2013)

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.


----------



## jbo (14 April 2013)

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


----------



## jbo (17 April 2013)

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


----------



## Zottel (17 April 2013)

jbo schrieb:


> Es wurde versucht  eine Datei mit einem falschen Format zu laden, bei  libnodave.openSocket(Int32 port, String portname)


Wird dabei ein Dateiname angezeigt?
Vielleicht mußt du auch libnodave.net.dll neu kompilieren?


----------



## jbo (17 April 2013)

Anhang anzeigen debug_siso.txt
Anhang anzeigen debug_siso.txt


 Doch vielleicht ein kleiner Erfolg, hab das ganze mal auf nem PC mit XP 32bit laufen lasse, und siehe da es funktioniert.
Was der in dem Debug-File ausspuckt ist ja hoffentlich in Ordnung oder?


----------



## Zottel (17 April 2013)

Das sieht gut aus. Reden wir hier seit Tagen über 64-Bit?


----------



## jbo (17 April 2013)

Ja. Stand in meiner Problemschilderung glaube auch drin. Wenn das deutlicher gewesen wäre, hätte ich uns wohl einiges an Zeit gespart oder?


----------



## Jochen Kühner (17 April 2013)

im ersten Thread hast du geschrieben umgestellt auf 32 bit... von daher denkt man das du als 32bit compilierst!
64 bit läuft mit der libnodave im moment nicht, da sind irgendwelche includes falschrum, deshalb geht die socket kommunikation nicht. in meiner gemoddeten libnodave ist das gefixt. du kannst das aber auch in die orginale übernehmen, schau dir einfach auf meiner codplexseite das changelog zur nodave.c an!
ansonsten sollte es mit der 32bit version auch unter 64bit laufen(wenn deine exe auch 32bit ist)
sorry das ich alles klein schreibe, iphone!


----------

