# LibNodave 64 Bit.



## Jochen Kühner (28 Februar 2013)

So, falls jemand libnodave als 64 Bit Version braucht, in meiner ConnectionLibrary ist nun eine funktionierende Version mit drin (http://siemensplctoolboxlib.codeplex.com/)


----------



## Thomas_v2.1 (28 Februar 2013)

Und woran hats gelegen?


----------



## Jochen Kühner (28 Februar 2013)

windows.h wurde vor winsock2.h eingebunden!


----------



## Thomas_v2.1 (28 Februar 2013)

Oh, das war aber tricky. Was nutzt du denn für einen Compiler?

In der windows.h die ich im GCC unter Windows verwende wird wenn _WIN32_WINNT > 0x0400 ist die winsock2.h eingebunden.
Den Wert muss man natürlich vorher passend setzen, wird auch schnell mal vergessen.


----------



## Jochen Kühner (28 Februar 2013)

Den Compiler von VS2012. Immerhin läufts jetzt!


----------



## Torbino (4 Juli 2013)

Ich nehm mal an, dass die library nur für C/++ Anwendungen vorgesehen ist, richtig?
Gibt es auch eine entsprechende 64 Bit version für .NET anwendungen?
Bräuchte eine 64Bit Version für ein Projekt in Vb.net


----------



## Jochen Kühner (4 Juli 2013)

Torbino schrieb:


> Ich nehm mal an, dass die library nur für C/++ Anwendungen vorgesehen ist, richtig?
> Gibt es auch eine entsprechende 64 Bit version für .NET anwendungen?
> Bräuchte eine 64Bit Version für ein Projekt in Vb.net



Nö, es ist zwar eine C DLL aber Ich verwende Sie auch mit C#! In meiner Bibliothek ist auch ein VB.NET Beispiel dabei!


----------



## Torbino (4 Juli 2013)

Hmm,
beim erstellen eines Verweises im Projekt kommt allerdings die Fehlermeldung, dass die DLL keine gültige COM oder Assembley Komponente ist.
libnodave_jfkmod64.dll ist doch die korrekte?

Danke für die Antwort


----------



## Stucks (20 Februar 2014)

Stehe vor dem selben problem.
Mein 64Bit System bringt den Fehler BadImageException bei lidnodave.openSocket();
Kann die 64bit.dll von Herrn Kühner auch nicht einbinden. Schade


----------



## Jochen Kühner (20 Februar 2014)

Stucks schrieb:


> Stehe vor dem selben problem.
> Mein 64Bit System bringt den Fehler BadImageException bei lidnodave.openSocket();
> Kann die 64bit.dll von Herrn Kühner auch nicht einbinden. Schade



Wenn du dein Programm als 64/32 Bit compilierst brauchst du halt die dementsprechende Dll. Ein als 32 Bit compiliertes Programm braucht auch unter 64 Bit die 32er DLL! Meine ConnectionLib wählt automatisch die richtige...


----------



## eugenhuber (25 März 2014)

Hallo,
habe mit Umstellung auf VS2013 erstmals versucht ne 64er App zu schreiben ... krieg jetzt aber beim Erstellen eines Verweises im Projekt die Fehlermeldung, dass die libnodave_jfkmods (32er und 64er) keine gültige COMs oder Assemblies Komponenten sind.
Danke für Eure Anschubhilfe.


----------



## Jochen Kühner (25 März 2014)

eugenhuber schrieb:


> Hallo,
> habe mit Umstellung auf VS2013 erstmals versucht ne 64er App zu schreiben ... krieg jetzt aber beim Erstellen eines Verweises im Projekt die Fehlermeldung, dass die libnodave_jfkmods (32er und 64er) keine gültige COMs oder Assemblies Komponenten sind.
> Danke für Eure Anschubhilfe.



Dieses Problem hast du aber auch bei einem 32 Bit Projekt, da dies C Dlls und keine DotNet Dlls sind!
Probiers am besten mal damit: http://www.sps-forum.de/hochsprache...en-aus-s7-mit-dotnetsiemensplctoolboxlib.html


----------



## eugenhuber (7 April 2014)

Hallo Jochen,
erstmal Danke für Deine coole Toolbox samt Unterstützung.
Steh auf dem Schlauch: Unter WinXP funktioniert die S7DLL Verbindung, Auswahl der PG/PC Schnittstelle funktioniert.
Gleiches PG mit Win7/64 funktioniert nicht.
Hast Du nen Tip?
Danke und Gruss
	

		
			
		

		
	




Eugen


----------



## Jochen Kühner (10 April 2014)

eugenhuber schrieb:


> Hallo Jochen,
> erstmal Danke für Deine coole Toolbox samt Unterstützung.
> Steh auf dem Schlauch: Unter WinXP funktioniert die S7DLL Verbindung, Auswahl der PG/PC Schnittstelle funktioniert.
> Gleiches PG mit Win7/64 funktioniert nicht.
> ...



Unterm Step7 für 64 Bit Windows stehen die S7Online Schnitstellen nicht mehr in der Registry sondern woanderst, glaub in nem Config File auf der festplatte! Hab Ich aber noch nicht angepasst! Und auch ob die S7Onlinx Dll mit 64 Bit geht... Kein Plan...


----------



## PN/DP (5 November 2015)

Jochen Kühner schrieb:


> So, falls jemand libnodave als 64 Bit Version braucht, in meiner ConnectionLibrary ist nun eine funktionierende Version mit drin (http://siemensplctoolboxlib.codeplex.com/)


Ich habe mir die libnodave_jfkmod64.dll von hier heruntergeladen und versuche nun, unter Windows 7 Professional 64-Bit mit Excel 14.0 (64-Bit) Daten aus S7-300 via Ethernet auszulesen.
Meine Excel-Anwendung funktioniert unter Windows 7 64-Bit mit Excel 32-Bit mit original libnodave.dll einwandfrei.
Ich habe die für Excel-64-Bit-VBA nötigen Programmanpassungen vorgenommen, so sieht mein VBA-Code auszugsweise aus:

```
#If Win64 Then  [COLOR="#006400"]'*** Declarations for Excel 64-Bit with Libnodave 64-Bit[/COLOR]
  Private Declare PtrSafe Function openSocket Lib "libnodave_jfkmod64.dll" (ByVal port As Long, ByVal peer As String) As LongPtr
  Private Declare PtrSafe Function daveNewInterface Lib "libnodave_jfkmod64.dll" (ByVal fd1 As LongPtr, ByVal fd2 As LongPtr, ByVal name As String, ByVal localMPI As Long, ByVal protocol As Long, ByVal speed As Long) As LongPtr
  Private Declare PtrSafe Function daveInitAdapter Lib "libnodave_jfkmod64.dll" (ByVal di As LongPtr) As Long
  Private Declare PtrSafe Function daveNewConnection Lib "libnodave_jfkmod64.dll" (ByVal di As LongPtr, ByVal mpi As Long, ByVal Rack As Long, ByVal slot As Long) As LongPtr
  Private Declare PtrSafe Function daveConnectPLC Lib "libnodave_jfkmod64.dll" (ByVal dc As LongPtr) As Long
'...
#Else  [COLOR="#006400"]'Not Win64 *** Declarations for Excel 32-Bit with Libnodave 32-Bit[/COLOR]
'...
#End If

Sub readFromFAFM()
Dim ph As LongPtr, di As LongPtr, dc As LongPtr
'...

Call daveSetDebug(daveDebugAll)

Peer$ = "192.168.196.196"
ph = openSocket(102, Peer$)
If (ph > 0) Then
    IFname$ = "IF1"
    [COLOR="#FF0000"]di = daveNewInterface(ph, ph, IFname$, 0, daveProtoISOTCP, daveSpeed187k)[/COLOR]
    res = daveInitAdapter(di)
    If res = 0 Then
        dc = daveNewConnection(di, MpiPpi, Rack, Slot)
        res = daveConnectPLC(dc)
```

Die DLL-Funktionen openSocket(..), closePort(..) und closeSocket(..) funktionieren einwandfrei, doch bei daveNewInterface(..) schmiert mir das Excel immer ab (auch wenn ich statt IFname$ direkt "IF1" in den Aufruf schreibe):

```
Microsoft Excel funktioniert nicht mehr

Problemsignatur:
  Problemereignisname:     APPCRASH
  Anwendungsname:          EXCEL.EXE
  Anwendungsversion:       14.0.7160.5000
  Anwendungszeitstempel:   55fc2723
  Fehlermodulname:         libnodave_jfkmod64.dll
  Fehlermodulversion:      0.0.0.0
  Fehlermodulzeitstempel:  5318b692
  Ausnahmecode:            c0000005
  Ausnahmeoffset:          000000000001aeb0
  Betriebsystemversion:    6.1.7601.2.1.0.256.48
  Gebietsschema-ID:        1031
```

1) Was läuft da verkehrt? Wie kann ich ohne C-Compiler und Debugger rauskriegen, wo das Problem liegt?
2) Gibt es schon irgendwo fertig die VBA-Deklarationen der DLL-Funktionen für 64-Bit? Kann man die Deklarationen vielleicht sogar irgendwie direkt aus der DLL importieren?

Harald


----------



## Jochen Kühner (6 November 2015)

Warum gibts den ersten Parameter "ph" 2 mal???

https://github.com/jogibear9988/libnodave/blob/master/libnodave/nodave.c#L142


----------



## PN/DP (6 November 2015)

Jochen Kühner schrieb:


> Warum gibts den ersten Parameter "ph" 2 mal???


Hallo Jochen,

das ist im original Libnodave im VBA-Beispiel "Excel And VB/Modul12.bas" so deklariert und funktioniert bei mir auch einwandfrei mit Excel 32-Bit. Ich habe nur die Deklaration der HANDLE- und Pointer-Parameter für Excel-64-Bit angepasst.

Siehe auch hier https://github.com/netdata/libnodave/blob/master/Excel And VB/Modul12.bas 
Zeile 164

```
Private Declare Function daveNewInterface Lib "libnodave.dll" (ByVal fd1 As Long, ByVal fd2 As Long, ByVal name As String, ByVal localMPI As Long, ByVal protocol As Long, ByVal speed As Long) As Long
```

Ich weiß nicht, vielleicht kann man mit VBA keine Struktur an eine externe DLL übergeben und die beiden Port-HANDLE der Struktur _daveOSserialType werden deshalb einzeln übergeben?

Harald


----------



## Jochen Kühner (6 November 2015)

hast du es mal versucht mit nur einmal dem Parameter?


----------



## Jochen Kühner (7 November 2015)

Ok, kann schon sein das du den Parameter 2 mal übergibst, da der Interne Typ in LibNoDave ja ein Struct mit 2 Handels ist!

Kann es sein, das longs in VBA 64 Bit trotzdem nur 32 Bit groß sind? ABer alle Handles in libnodave 64 sind nun 64 Bit groß? Du solltest die bas Datei so anpassen das statts "long" für einen zeiger "*LongPtr" verwendet wird! Dieser Typ hat in 32 und 64 Bit die richtige größe! (*https://msdn.microsoft.com/de-de/library/office/gg264421.aspx)


----------



## Jochen Kühner (7 November 2015)

Sorry, hab ganz übersehen das du diese anpassungen gemacht hast...

Was Ich mir noch vorstellen könnte, das z.B. auch ein int 64bit groß ist, d.h. du müsstest da auch LongLong für die Typen verwenden! 
http://stackoverflow.com/questions/11438794/is-the-size-of-c-int-2-bytes-or-4-bytes


----------



## PN/DP (9 November 2015)

*Libnodave 64-Bit (libnodave_jfkmod64.dll) mit Excel/VBA 64-Bit*

In Excel-VBA können Struct ("benutzerdefinierter Typ") nicht als Wert (ByVal) übergeben werden. Vermutlich daher bei daveNewInterface(..) die Übergabe der zwei Handle einzeln in VBA 32-Bit. Warum das gleiche Vorgehen in der 64-Bit Variante zum Excel-Absturz führt weiss ich nicht. Ich habe alles mögliche ausprobiert...
(Gibt es von der 64-Bit-Kompilierung der DLL ein List-File, wo man sehen kann, welcher Maschinencode erzeugt wurde?)

Zum Glück bietet Libnodave die Funktion daveNewInterface(..) auch als Variante mit Übergabe des Struct als Referenz: *davePascalNewInterface(..)* Damit funktioniert auch Excel 64-Bit. 

Der blaue Code führt zum Erfolg:

```
[COLOR="#0000FF"]Public Type daveOSserialType
    rfd As LongPtr
    wfd As LongPtr
End Type

Private Declare PtrSafe Function davePascalNewInterface Lib "libnodave_jfkmod64.dll" (ByRef fds As daveOSserialType, ByVal name As String, ByVal localMPI As Long, ByVal protocol As Long, ByVal speed As Long) As LongPtr[/COLOR]

Sub readFromFAFM()
Dim ph As LongPtr, di As LongPtr, dc As LongPtr
[COLOR="#0000FF"]Dim fds As daveOSserialType[/COLOR]
[COLOR="#008000"]'...
'Call daveSetDebug(daveDebugAll)[/COLOR]

Peer$ = "192.168.196.196"
ph = openSocket(102, Peer$)
If (ph > 0) Then
    [COLOR="#0000FF"]fds.rfd = ph
    fds.wfd = ph[/COLOR]
[COLOR="#008000"]'    di = daveNewInterface(ph, ph, "IF1", 0, daveProtoISOTCP, daveSpeed187k)   'schmiert ab![/COLOR]
    [COLOR="#0000FF"]di = davePascalNewInterface(fds, "IF1", 0, daveProtoISOTCP, daveSpeed187k)[/COLOR] 'funktioniert
    res = daveInitAdapter(di)
    If res = 0 Then
        dc = daveNewConnection(di, MpiPpi, Rack, Slot)
        res = daveConnectPLC(dc)
```

Harald


----------



## Diamond (3 Mai 2016)

Hallo Leute,

Hat von Euch jemand die Libnodave Verbindung zur SPS mit der 64 Bit Version hingekriegt und zwar mit Win10 und Excel2016? 
Habe bisher immer mit VB.Net meine Verbindungen aufgebaut, hat auch  Problemlos funktioniert. Ich habe die Version von Harald Libnodave] Beispiel TCP Verbindung zu S7-Welt versucht, jedoch bekomme ich immer die Meldung das libnodave_jfkmod64.dll  nicht gefunden wurde. Diese habe ich jedoch in das Verzeichnis C:\Windows\System32 kopiert. Bin mir jedoch nicht sicher ob diese irgendwie registriert werden muss. Admin Rechte habe ich benutzt an dem kann es nicht liegen.


Weiss jemand was ich  hier Falsch mache??
Nikola


----------



## Wincctia (12 Juli 2016)

Hallo Beisamnen,

ich bin zum Thema Libnodave leider noch Blutiger Anfänger hab mir jetzt mal mit PN/DP´s Beispiel aus den FAQ ein Bild gezeichnet nun scheitere ich aber mit der DLL ich habe es wie PN DP schreibt von 
https://github.com/dotnetprojects/DotNetSiemensPLCToolBoxLibrary/tree/master/externalDlls das *libnodave_jfkmod64.dll* heruntergeladen (ich hoffe von github lädt man Dateien herunter indem man auf den RAW Button drückt).
aber immer wenn ich das DLL Registrieren will kommt folgende Meldung: 



Ich nutze WIN 10Pro x64 mit Office 2016.

Besten dank schon mal!

Edit hat sich erledigt
habs rausgefunden Datei muss unter c Windows Sytem32 liegen dann läufts und kann auch über den RAE Knop geladen werden
Danke!!


----------

