Hallo zusammen ,
seit ein Paar Tagen beschäftige ich mich mit folgendem Problem...
Ich erhalte eine fertige DLL (in C geschrieben, C-Code unbekannt, aus Headerdateien Funktionen mit den Parametern sichtbar).
Diese DLL soll ich in mein LV-Programm einbinden. Nachdem ich die Foren durchgesucht habe, weiß ich nun, dass es in LabVIEW über den "Knoten zum Aufruf externer Bibliotheken" machen kan.
In dem Tutorial LVF-Tutorial:[
http://www.LabVIEWforum.de/DLL-einbindung-t5504.html ] habe ich gefunden, dass eine Funktion, die einen Pointer auf eine Struktur, die aus Unterschiedlichen Komplexen datentypen besteht, nur mit großem Aufwand in LabVIEW eingebunden werden kann. Leider muss ich mit zwei solchen Strukturen zu tun haben.
Header Datei:
/////////////////////////////////////////////////////////////////////////////
// Headerdatei für Datenstrukturen und Funktions-Prototypen
// /////////////////////////////////////////////////////////////////////////////
#include <time.h>
#define NAN 9.9E34
typedef struct
{
double SpurVL, SpurVR, SpurHL, SpurHR, SpurVG, SpurHG, SpurVMaxDiff, SpurHMaxDiff;
double SturzVL, SturzVR, SturzHL, SturzHR, SturzVMaxDiff, SturzHMaxDiff;
double SpurDiff20VL, SpurDiff20VR, SpurDiff10VL, SpurDiff10VR, SpurDiffMaxDiffV;
double LenkWMaxLinksVL, LenkWMaxLinksVR, LenkWMaxRechtsVL, LenkWMaxRechtsVR;
double EingWinkel20VL, EingWinkel20VR, EingWinkel10VL, EingWinkel10VR;
double RadversatzV, RadversatzH;
double FahrachswinkelH;
double LenkwinkelMaxVL, LenkwinkelMaxVR;
double Nachlauf20VL, Nachlauf20VR, Nachlauf10VL, Nachlauf10VR, NachlaufMaxDiff;
double Spreizung20VL, Spreizung20VR, Spreizung10VL, Spreizung10VR, SpreizungMaxDiff;
double Achsversatz;
double SeitenversatzL, SeitenversatzR;
double Radstandsdiff;
double Spurweitendiff;
char ErrorMessage[2048];
char ProtocolFiles[256];
struct tm FileTime;
}
ML5DataStatic;
typedef struct
{
double SpurVL, SpurVR, SpurHL, SpurHR, SpurVG, SpurHG;
double geoAchseH;
double SturzVL, SturzVR, SturzHL, SturzHR;
double RadversatzV, RadversatzH;
char ErrorMessage[2048];
}
ML5DataDynamic;
/////////////////////////////////////////////////////////////////////////////
// Prototypen der Interface - Funktionen
/////////////////////////////////////////////////////////////////////////////
unsigned long GetDynamicData(ML5DataDynamic *DataSetPtr, char* ServerAddress, unsigned int ServerPort, unsigned int MaxTimeOut);
bool GetStaticData(char* Dir, char* Filter, char* Measurement, ML5DataStatic* DataSetPtr);
void InitDynamicData(ML5DataDynamic* DynamicData);
void InitStaticData (ML5DataStatic* StaticData);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Meines Wissens, gibt es zwei Möglichkeiten so eine DLL einzubinden:
1) Schreiben eine Wrapper-DLL, die die Daten aus den Strukturen in die einfache Datentypen konvertiert
2) Laut diesem Beitrag [http://www.LabVIEWforum.de/index.php?showtopic=16279&pid=96533&mode=threaded&start=#entry96533] kann man eine Struktur, die der Originalstruktur ähnlich ist, in LabVIEW erstellen. Und dann diese Struktur an den "Knoten zum Aufruf externer Bibliotheken" übergeben.
Mein Versuch nach Variante 2) (Siehe Anhang) war erfolglos.
Ich erhalte ein Fehler: "Mindestens ein Eingang dieser Funktion, der für deren Funktionsfähigkeit erforderlich ist, ist offen oder nicht korrekt verbunden."
Da ich in C und C++ nicht so stark bin, weiß ich nicht, wie ich eine passende eine Wrapper-DLL erstellen kann.
Kann mir jemand ein Tipp geben, bzw. eine Lösung meines Problems. Wie schreibe ich hierzu die passende Wrapperfunktion. Meine vorgehensweise in C++ (Visual C++).
Oder was habe ich in meinem VI (nach Lösungsvariante 2) falsch gemacht?
Für jede hilfreiche Antwort wäre ich sehr dankbar.
EDIT Jens G:
CROSSPOST:
http://LabVIEWportal.eu/viewtopic.php?f=53&t=2273