# C#/LibNoDave: VS express 2013 - Anwendung



## Dirk_Sch (15 Juli 2014)

Hallo zusammen,

was mit "Visual Studio express 2010" gelingt, funktioniert mit "Visual Studio express 2013" nicht mehr. Aber der Reihen nach:

Seit ein paar Tagen versuche ich ein kleines C#-LibNoDave-Testprojekt zu schreiben bzw. anzupassen, um eine Kommunikation mit einer S7 1200 aufzubauen. Als Vorlage verwende ich  libnodave.sourceforge.net/ "libnodave-0.8.5.1" (simpleISO_TCP.cs; libnodave.dll; libnodave.net.dll). Als Entwicklungsumgebung dient mir dazu das (aktuelle) Visual Studio express 2013. Mit dem erstellten Testprogramm bekomme ich leider keine Verbindung hergestellt. Die Codezeile:

"fds.rfd = libnodave.openSocket(102, "192.168.1.210");" liefert immer eine 0 und damit keine Kommunikation.

Erstelle ich aber das gleiche Projekt mit "Visual Studio express 2010" (ist bei mir auf einem anderen Rechner (Notebook) installiert), funktioniert die Kommunikation.

Könnt Ihr mir hier weiter helfen. Was muss ich evtl. im "VS express 2013" einstellen, damit ein funktionierendes Programm kompiliert werden kann. Ich muss dazu bemerken, dass ich leider (noch) nicht viel Erfahrung mit der C#-Programmierung und Visual Studio habe.

Gruß Dirk


----------



## vierlagig (16 Juli 2014)

Dirk_Sch schrieb:


> Was muss ich evtl. im "VS express 2013" einstellen, damit ein funktionierendes Programm kompiliert werden kann.



da würde ich jetzt nicht unbedingt das Problem vermuten.

eher hier: 





Dirk_Sch schrieb:


> (ist bei mir auf einem anderen Rechner (Notebook) installiert)



gleiche mal die Netzwerkeinstellungen des 2013-Host mit dem 2010-Host ab.


----------



## Dirk_Sch (16 Juli 2014)

vierlagig schrieb:


> da würde ich jetzt nicht unbedingt das Problem vermuten.
> 
> eher hier:
> 
> gleiche mal die Netzwerkeinstellungen des 2013-Host mit dem 2010-Host ab.



Werde ich mir anschauen. Ich vermute, dass Du die "Eigenschaften von LAN-Verbindungen" unter Win7 meinst.?

Trotzdem noch eine Bemerkung:
Wenn  ich das Testprojekt, welches ich mit "VS expr. 2010" erstellt habe, auf  den Rechner mit dem ""VS expr. 2013" kopiere und dann mit selbiger  Umgebung im Debug-Modus starte, habe ich Zugriff auf die SPS (?). Daher  denke ich nicht, dass es an den Netzwerkeinstellungen auf dem 2013-Host  liegt.


----------



## vierlagig (16 Juli 2014)

Dirk_Sch schrieb:


> Wenn  ich das Testprojekt, welches ich mit "VS expr. 2010" erstellt habe, auf  den Rechner mit dem ""VS expr. 2013" kopiere und dann mit selbiger  Umgebung im Debug-Modus starte, habe ich Zugriff auf die SPS (?). Daher  denke ich nicht, dass es an den Netzwerkeinstellungen auf dem 2013-Host  liegt.



und andersherum? die in VS2013 erstellte Anwendung auf dem 2010-Host?
benutzt du die selbe Framework-Version in 2013 wie in 2010?


----------



## Dirk_Sch (16 Juli 2014)

vierlagig schrieb:


> und andersherum? die in VS2013 erstellte Anwendung auf dem 2010-Host?
> benutzt du die selbe Framework-Version in 2013 wie in 2010?



Habe ich noch nicht ausprobiert, werde ich aber gleich mal tun.

Unter 2010 wird das ".NET Framework 4 Client Profile" und unter 2013 das ".NET Framework 4.5" benutzt. Allerdings habe ich auch das schon probiert: Unter 2013 habe ich das ".NET Framework 4 Client Profile" eingestellt. Leider ohne Erfolg.


----------



## vierlagig (16 Juli 2014)

eine praktische Frage: warum dann nicht mit dem 2010er Projekt in 2013 weiterarbeiten, wenn es doch funktioniert? 
oft findet sich die Lösung im Laufe der Zeit von ganz allein...


----------



## StefanK (16 Juli 2014)

Hast du alle DLL's dabei?

Einen Verweis auf libnodave.net.dll musst du ja haben.
Ein Verweis auf libnodave.dll funktioniert ja nicht, die musst du zu deinem Projekt hinzufügen und einstellen, das sie ins Ausgabeverzeichnis kopiert wird. Oder du kopierst sie manuell rein (nicht so schön)...


----------



## Dirk_Sch (16 Juli 2014)

StefanK schrieb:


> Hast du alle DLL's dabei?
> 
> Einen Verweis auf libnodave.net.dll musst du ja haben.
> Ein Verweis auf libnodave.dll funktioniert ja nicht, die musst du zu deinem Projekt hinzufügen und einstellen, das sie ins Ausgabeverzeichnis kopiert wird. Oder du kopierst sie manuell rein (nicht so schön)...



Ich denke ja. Die Dateien libnodave.net.dll und  libnodave.dll habe ich in das Verzeichnis "Debug" kopiert. Im VS-Projekt  mache ich dann noch einen Verweis auf die libnodave.net.dll.


----------



## Dirk_Sch (16 Juli 2014)

vierlagig schrieb:


> und andersherum? die in VS2013 erstellte Anwendung auf dem 2010-Host?
> benutzt du die selbe Framework-Version in 2013 wie in 2010?



So, habe jetzt mal versucht, die in VS2013 erstellte Anwendung auf  dem 2010-Host zum Laufen zu bringen. Leider ohne Erfolg: Als Erstes  wurde von VS2010 bemängelt, dass das Framework 4.5 nicht gefunden wird.  Nachdem ich das Zielframework auf ".NET Framework 4 Client Profile"  eingestellt hatte, konnte ich die Anwendung kompilieren. Beim Starten im  Debugmodus wird bei der Zeile "fds.rfd = libnodave.openSocket(102,  "192.168.1.210");" ein Ausnahmefehler angezeigt: "BadImageFormatExeption  wurde nicht behandelt. Es wurde versucht, eine Datei mit einem falschen  Format zu laden. (Ausnahme von HRESULT: 0:8007000B) ... "

Also in diese Richtung funktioniert es auch nicht.


----------



## StefanK (16 Juli 2014)

Nutzt du auf beiden Rechnern das Debug-Profil, oder hast du zufällig auf dem VS2013-Pc "release" eingestellt...

...oder...

Wie ist die Ziel-CPU eingestellt? Any CPU, x86, x64...
Nimm auf jeden Fall x86, der Fehler (BadImageFormatExeption wurde nicht behandelt. Es wurde versucht, eine Datei mit einem falschen Format zu laden..) ist mir nicht ganz unbekannt, aber schon lange her...


----------



## Jochen Kühner (16 Juli 2014)

Dirk_Sch schrieb:


> So, habe jetzt mal versucht, die in VS2013 erstellte Anwendung auf  dem 2010-Host zum Laufen zu bringen. Leider ohne Erfolg: Als Erstes  wurde von VS2010 bemängelt, dass das Framework 4.5 nicht gefunden wird.  Nachdem ich das Zielframework auf ".NET Framework 4 Client Profile"  eingestellt hatte, konnte ich die Anwendung kompilieren. Beim Starten im  Debugmodus wird bei der Zeile "fds.rfd = libnodave.openSocket(102,  "192.168.1.210");" ein Ausnahmefehler angezeigt: "BadImageFormatExeption  wurde nicht behandelt. Es wurde versucht, eine Datei mit einem falschen  Format zu laden. (Ausnahme von HRESULT: 0:8007000B) ... "
> 
> Also in diese Richtung funktioniert es auch nicht.



ist dein Rechner mit VS2010 wohl 32 Bit!
Entweder die Anwendung unter 2013 als x86 compilieren, oder eine 64Bit libnodave verwenden! 

oder meine ToolBox (https://github.com/jogibear9988/DotNetSiemensPLCToolBoxLibrary), die verwendet automatisch 32/64 Bit libnodave, je nach bedarf!


----------



## Dirk_Sch (17 Juli 2014)

StefanK schrieb:


> Nutzt du auf beiden Rechnern das Debug-Profil,  oder hast du zufällig auf dem VS2013-Pc "release" eingestellt...
> 
> ...oder...
> 
> ...



Auch auf dem VS2013-PC habe ich das "Debug-Profil" (unter  Projekt/Projektxxx-Eigenschaften/Erstellen/Konfiguration: Aktiv(Debug))  eingestellt. 

Für die Ziel-CPU habe ich alle drei Varianten  probiert: "Any CPU", "x86" und "x64" (eingestellt unter:  Projekt/Projextxxx-Eigenschaften/Erstellen/Zielplatform: ... und unter:  Erstellen/Konfigurations-Manager/Plattform und "Aktive  Projektmappenplattform:"). Je nach Einstellung musste ich die  libnodave.dll in das entsprechende Debug-Verzeichnis kopieren (z.B.  .../bin/Debug oder .../bin/x86/Debug ...) damit sie vom Compiler  gefunden wird. 
Mit allen drei Einstellungsvarianten hatte ich keinen  Erfolg, aber unterschiedliche Reaktionen: mit "Any CPU" und "x86"   lieferte mir die Codezeile: "fds.rfd = libnodave.openSocket(102,  "192.168.1.210")" eine 0 und das Programm konnte "ordentlich" (zwar ohne  Kommunikation zur SPS) beendet werden. Mit der Einstellung "x64" wurde  an dieser Stelle ein Ausnahmefehler provoziert: "Ein Ausnahmefehler des  Typs "System.BadImageFormatException" ist in TestLND.exe aufgetreten.  Zusätzliche Informationen: Es wurde versucht, eine Datei mit einem  falschen Format zu laden. (Ausnahme von HRESULT: 0x8007000B)".


----------



## Dirk_Sch (17 Juli 2014)

Jochen Kühner schrieb:


> ist dein Rechner mit VS2010 wohl 32 Bit!
> Entweder die Anwendung unter 2013 als x86 compilieren, oder eine 64Bit libnodave verwenden!
> 
> oder meine ToolBox (https://github.com/jogibear9988/DotNetSiemensPLCToolBoxLibrary), die verwendet automatisch 32/64 Bit libnodave, je nach bedarf!



Danke für den Tipp. Werde ich mir auf jeden Fall anschauen.

Aber noch mal zu LibNoDave: Wo finde ich eine 64Bit-Variante von libnodave (z.B. unter http://libnodave.sourceforge.net ?). Außerdem bleibt die Frage, warum ich unter VS2013 mit den Einstellungen für x86 keine Anwendung kompiliert bekomme, mit der ich eine Kommunikation zur SPS aufbauen kann?


----------



## Jochen Kühner (17 Juli 2014)

Ne 64Bit Version findest in meiner Toolbox, die ist jedoch modifiziert, da solltest du dann gleich die Toolbox zum Verbinden verwenden!


----------



## StefanK (17 Juli 2014)

Dirk_Sch schrieb:


> ...Außerdem bleibt die Frage, warum ich unter VS2013 mit den Einstellungen für x86 keine Anwendung kompiliert bekomme, mit der ich eine Kommunikation zur SPS aufbauen kann?



Wenn ich das richtig verstehe, kannst du dein Projekt unter den oben genanten Einstellungen nicht kompilieren. Welche Fehlermeldung bekommst du?


Der Fehler beim starten als 64Bit Anwendung (Datei mit einem falschen Format zu laden. (Ausnahme von HRESULT: 0x8007000B)) ist klar (mittlerweile); die "original" libnodave.dll funktioniert nicht in 64Bit Anwendungen

Ich habe gerade keine SPS zur Hand, aber kann mein letztes Projekt ohne Probleme mit Visual Studio 2013 kompilieren. Und das auf einem 32Bit, sowie 64Bit Windows 8. Das Zielframework ist hier 4.0.


----------



## Dirk_Sch (17 Juli 2014)

StefanK schrieb:


> Wenn ich das richtig verstehe, kannst du dein  Projekt unter den oben genanten Einstellungen nicht kompilieren. Welche  Fehlermeldung bekommst du?
> 
> 
> Der Fehler beim starten als 64Bit Anwendung (Datei  mit einem falschen Format zu laden. (Ausnahme von HRESULT: 0x8007000B))  ist klar (mittlerweile); die "original" libnodave.dll funktioniert  nicht in 64Bit Anwendungen
> ...



Sorry, hier habe ich mich wahrscheinlich undeutlich ausgedrückt: Ich  kann unter VS2013 alle drei Varianten ohne Fehler kompilieren. Nach dem  Start (im Debug-Modus) erhalte ich mit der x64-Variante den  Ausnahmefehler und in den beiden anderen Varianten bekomme ich "nur"  keine Kommunikation zur SPS zustande (Codezeile: "fds.rfd =  libnodave.openSocket(102,  "192.168.1.210")" gibt nur eine "0" zurück).

Was für ein Visual Studio benutzt Du? Ich verwende das  Visual C#2013 in "Visual Studio Express 2013 für Windows Desktop"  (Version 12.0.21005.1 REL) und .NET Framework Version 4.5.50938. Als  Zielframework hatte ich sowohl ".NET Framework 4.5" als auch ".NET  Framework 4 Client Profile" eingestellt. Jeweils ohne Erfolg.


----------



## Jochen Kühner (17 Juli 2014)

lad dir mal hier : http://jochensserver.no-ip.org/wordpress/?page_id=58 die jfk vartab und sag ob du dich damit verbinden kannst.


----------



## Dirk_Sch (17 Juli 2014)

Jochen Kühner schrieb:


> lad dir mal hier : http://jochensserver.no-ip.org/wordpress/?page_id=58 die jfk vartab und sag ob du dich damit verbinden kannst.



Hallo Jochen,

die JFK-VarTab habe ich mir runtergeladen und auch ausprobiert: ja, ich kann mich mit meiner SPS verbinden (über Config Connections/ISO over TCP ... ; Verbindung testen: Connected! (MLFB:6ES7 214-1AG40-0XB0))

Gruß Dirk


----------



## Jochen Kühner (18 Juli 2014)

Ok, dann gehts auf jeden fall von dem rechner mit libnodave (wobei mein programm ja eine modifizierte version nutzt). Aber warum dein call dann nicht funz... kein plan im moment. Kann dir nur sagen, dann versuchs halt über meine Bibliothek, damit scheints ja zu klappen (sonst würde jfk vartab ja auch nicht funktionieren)


----------



## GAU (20 Juli 2014)

Hallo,


auch ich bekam mein libnodave Programm (Visual Studio Express -VBasic) unter 64Bit W7 nicht zum laufen. Nach langer suche habe ich herausgefunden, dass man bei den Express-Versionen die Zielplattform (x32 oder x64) nicht angeben kann.
Die "mitgelieferte" DLL ist für x32. Wenn man bei der Vollversion als Zielplattform x32 angibt funktioniert alles auch unter 64Bit.


----------



## Jochen Kühner (20 Juli 2014)

GAU schrieb:


> Hallo,
> 
> 
> auch ich bekam mein libnodave Programm (Visual Studio Express -VBasic) unter 64Bit W7 nicht zum laufen. Nach langer suche habe ich herausgefunden, dass man bei den Express-Versionen die Zielplattform (x32 oder x64) nicht angeben kann.
> Die "mitgelieferte" DLL ist für x32. Wenn man bei der Vollversion als Zielplattform x32 angibt funktioniert alles auch unter 64Bit.



Dann kann Ich nur empfehlen nimm meine Bibliothek, die unterstütz auch 64 Bit. Du könntest auch meine compilierte 64 Bit libnodave verwenden, aber da Ich ein paar Modifkiationen drin hab, stimmen die Funktionsaufrufe nicht alle mit der originalen überein!


----------



## GAU (20 Juli 2014)

Muss ich bei Gelegenheit mal testen. VarTab hört sich für mich sehr interessant an. 
Ich bin nur "Gelegenheits-Hochsprachenprogrammierer". Auf die Schnelle bin ich auf Snap7 ausgewichen. Mit Lazarus (FreePascal) bin ich dann relativ schnell zum Ziel gekommen. Ich will/muss mit kostenloser Software arbeiten.


----------



## Jochen Kühner (20 Juli 2014)

GAU schrieb:


> Muss ich bei Gelegenheit mal testen. VarTab hört sich für mich sehr interessant an.
> Ich bin nur "Gelegenheits-Hochsprachenprogrammierer". Auf die Schnelle bin ich auf Snap7 ausgewichen. Mit Lazarus (FreePascal) bin ich dann relativ schnell zum Ziel gekommen. Ich will/muss mit kostenloser Software arbeiten.



Die Bibliothek von mir ist ja auch kostenlos! Wenns mit Snap7 läuft ist ja gut! Wenn du halt features wie Step7 Projektzugriff, Leseoptimierung,... brauchst bietet sich meine Bib halt an


----------



## Dirk_Sch (21 Juli 2014)

GAU schrieb:


> Hallo,
> 
> 
> auch ich bekam mein libnodave Programm (Visual Studio Express -VBasic) unter 64Bit W7 nicht zum laufen. Nach langer suche habe ich herausgefunden, dass man bei den Express-Versionen die Zielplattform (x32 oder x64) nicht angeben kann.
> Die "mitgelieferte" DLL ist für x32. Wenn man bei der Vollversion als Zielplattform x32 angibt funktioniert alles auch unter 64Bit.



Das wundert mich ein wenig. Ja, unter der VS express 2010 kann man die Zielplattform nicht ändern. Dort ist sie aber (soweit ich das mitbekommen habe) immer auf x32 eingestellt und damit funktioniert die libnodave.dll auch. Unter VS express 2013 (2012 habe ich nicht ausprobiert) kann man aber die Zielplattformen auswählen (Any CPU, x86 (also x32) und x64).Wenn ich jedoch extra "x86" unter VS2013 einstelle, funktioniert trotzdem mit meinem libnodave-Testprogramm die Kommunikation zu meiner SPS nicht. Woran könnte das noch liegen?


----------



## Jochen Kühner (23 Juli 2014)

Dirk_Sch schrieb:


> Das wundert mich ein wenig. Ja, unter der VS express 2010 kann man die Zielplattform nicht ändern. Dort ist sie aber (soweit ich das mitbekommen habe) immer auf x32 eingestellt und damit funktioniert die libnodave.dll auch. Unter VS express 2013 (2012 habe ich nicht ausprobiert) kann man aber die Zielplattformen auswählen (Any CPU, x86 (also x32) und x64).Wenn ich jedoch extra "x86" unter VS2013 einstelle, funktioniert trotzdem mit meinem libnodave-Testprogramm die Kommunikation zu meiner SPS nicht. Woran könnte das noch liegen?



Schau mal mit dem corflags tool nach ob vs2013 wirklich das 32 bit flag setzt: http://msdn.microsoft.com/en-us/library/ms164699(v=vs.80).aspx
wenn nicht kannst du es damit setzen!


----------



## Dirk_Sch (24 Juli 2014)

Hallo,

ich habe meinen Fehler entdeckt. Es liegt nicht an VS2013. Sobald man in VS2013 als Zielplattform eine x32bit-CPU einstellt, müsste es funktionieren. Man sollte jedoch das Projekt bzw. die ausführbare Datei auf eine Festplatte speichern, die keinen Einschränkungen unterliegt. Das war aber bei mir nicht der Fall. Ich habe meine ganzen VS2013-Projekte auf einem Netzlaufwerk gespeichert und dann natürlich auch von dort aus den Debugmodus gestartet. Das funktionierte soweit auch alles, außer dass man mit den Programmen, die auf dem Netzlaufwerk laufen, keine TCP-Verbindung aufbauen kann (wird mit Einstellungen auf dem Netzwerk bzw. Server realisiert, die ich nicht kenne). 
Darauf bin ich erst gekommen, als ich die interessante Empfehlung (corflags tool) von Jochen ausprobieren wollte. Für geeignete Screenshots hatte ich die Projekte auf mein Laufwerk C kopiert und dann auch noch mal ausprobiert - und siehe da, es funktionierte. Die VS2010-Projekte hatte ich immer auf einem separaten Notebook (auf der lokalen Festplatte) laufen lassen. Deshalb hat es dort auch immer funktioniert.

Sorry, dass ich euch damit konfrontiert und evtl. verwirrt habe. Ich jedenfalls habe einiges dazu gelernt. Nochmals danke an alle, die mir trotzdem hilfreiche Tipps gegeben haben.

Gruß Dirk


----------

