INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

DLL in LV einbinden. Geht es nur mit einer anderen Wrapper-DLL



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

24.06.2010, 16:21 (Dieser Beitrag wurde zuletzt bearbeitet: 25.06.2010 19:10 von jg.)
Beitrag #1

Dimitri Offline
LVF-Grünschnabel
*


Beiträge: 34
Registriert seit: Jun 2009

2009
2009
de

30171
Deutschland
DLL in LV einbinden. Geht es nur mit einer anderen Wrapper-DLL
Hallo zusammen ,

seit ein Paar Tagen beschäftige ich mich mit folgendem Problem...Huh

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

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

Da ich in C und C++ nicht so stark bin, weiß ich nicht, wie ich eine passende eine Wrapper-DLL erstellen kann.Unsure

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


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
24.06.2010, 16:44
Beitrag #2

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.687
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
DLL in LV einbinden. Geht es nur mit einer anderen Wrapper-DLL
' schrieb: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.
Da in allen deinen Strukturen keine Pointer vorkommen, solltes eine Wrapper-DLL nicht notwendig sein.

Mach einen Cluster, der genau die Daten enthält, wie das Struct es vorschreibt. Im DLL-Knoten sagst du dann "Zeiger auf Daten".

Die char[]'s in den Struct's musst du als Array of U8 behandeln.

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
24.06.2010, 16:54
Beitrag #3

rolfk Offline
LVF-Guru
*****


Beiträge: 2.302
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
DLL in LV einbinden. Geht es nur mit einer anderen Wrapper-DLL
' schrieb:Die char[]'s in den Struct's musst du als Array of U8 behandeln.

Nein bitte nicht!! Ein Array in LabVIEW ist ein Handle. Das ist ein Pointer auf einen Pointer auf die eigentlichen Daten und ein LabVIEW Array Handle bleibt ein LabVIEW Array Handle wenn es innerhalb einer Struktur an eine C Funktion übergeben wird. Das ist 200% anders dann das inlined Stringarray das durch char[] gemeint ist. Die einzige Art um solche inlined Arrays in einem LabVIEW Cluster direkt zu realisieren ist um dieses Array als ein embedded Cluster von sovielen Elementen des Basistypen zu machen. Nun wirst Du aber wohl kaum einen Cluster machen wollen wo 2048 Elemente drin sind und die Array To Cluster Funktion die das programmatisch machen könnte kennt eine maximale Grenze von 512 Clusterelementen. Also Sackgasse!

Die einzige Variante die ohne Wrapper DLL auskäme ist um die ganze Struktur als ein C Pointer auf ein Bytearray zu übergeben und die Informationen danach aus diesem Bytearray herauszuklauben mittels, Array Subset, Typecast und Byte, Word und Longword Swaps. Ziemlich viel Aufwand, grosse Fehleranfälligkeit und katastrophale Unterhaltbarkeit von solchem Code ist aber 200% gewährleistet.

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
24.06.2010, 20:05
Beitrag #4

Dimitri Offline
LVF-Grünschnabel
*


Beiträge: 34
Registriert seit: Jun 2009

2009
2009
de

30171
Deutschland
DLL in LV einbinden. Geht es nur mit einer anderen Wrapper-DLL
Erstmal vielen Dank für die schnelle Reaktion.SmileTop1



Zitat:Die einzige Variante die ohne Wrapper DLL auskäme ist um die ganze Struktur als ein C Pointer auf ein Bytearray zu übergeben und die Informationen danach aus diesem Bytearray herauszuklauben mittels, Array Subset, Typecast und Byte, Word und Longword Swaps. Ziemlich viel Aufwand, grosse Fehleranfälligkeit und katastrophale Unterhaltbarkeit von solchem Code ist aber 200% gewährleistet.

Außerdem beinhaltet eine der struct noch eine anderre struct
Zitat:char ErrorMessage[2048];

char ProtocolFiles[256];

struct tm FileTime;
}
ML5DataStatic;

Sieht so aus, dass ohne Wrapper-DLL komme ich nicht aus. Oder ?Unsure

Kann mir jeman mit der Erstellung Wrapper-DLL helfen ??
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
24.06.2010, 23:32 (Dieser Beitrag wurde zuletzt bearbeitet: 24.06.2010 23:35 von rolfk.)
Beitrag #5

rolfk Offline
LVF-Guru
*****


Beiträge: 2.302
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
DLL in LV einbinden. Geht es nur mit einer anderen Wrapper-DLL
' schrieb:Erstmal vielen Dank für die schnelle Reaktion.SmileTop1
Außerdem beinhaltet eine der struct noch eine anderre struct
Sieht so aus, dass ohne Wrapper-DLL komme ich nicht aus. Oder ?Unsure

Struct innerhalb einer Struct ist kein Problem. Das ist einfach ein Cluster innerhalb eines Clusters in LabVIEW. Ausser eventuelen Alignmentproblemen vollständig equivalent.

Was die Hilfe mit dem C Code betrifft, das ist nicht ganz so einfach, da ich kurz vor den Ferien noch soviele Sachen habe die ich noch abschliessen sollte. Grundsätzlich kann man sagen dass der Entwickler dieser Library ziemliche Monsterstrukturen ersonnen hat. Das macht ein guter Programmierer eher nicht, jedenfalls nicht in Parametern zu öffentlichen Funktionen.

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
25.06.2010, 07:28
Beitrag #6

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.687
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
DLL in LV einbinden. Geht es nur mit einer anderen Wrapper-DLL
' schrieb:Nein bitte nicht!! Ein Array in LabVIEW ist ein Handle.
Ach, da hab ich mich wieder vom Zielsystemleiten lassen. Die Ziel-DLL erfordert keinen Pointer in einem Cluster. Daher kann man die Daten als linearen Stream übergeben. Und dass es in LabVIEW keine statischen Arrays gibt ...

Ich würde aber trotzdem Mal einen Versuch mit Serialisieren machen. Bei 3 verschiedenen Datentypen sollte sich der Aufwand in Grenzen halten.

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
25.06.2010, 09:13
Beitrag #7

rolfk Offline
LVF-Guru
*****


Beiträge: 2.302
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
DLL in LV einbinden. Geht es nur mit einer anderen Wrapper-DLL
' schrieb:Ach, da hab ich mich wieder vom Zielsystemleiten lassen. Die Ziel-DLL erfordert keinen Pointer in einem Cluster. Daher kann man die Daten als linearen Stream übergeben. Und dass es in LabVIEW keine statischen Arrays gibt ...

Ich würde aber trotzdem Mal einen Versuch mit Serialisieren machen. Bei 3 verschiedenen Datentypen sollte sich der Aufwand in Grenzen halten.

Das ist zwar jetzt wirklich Tüpflischeissen wie es in der Schweiz genannt wird, aber mit statischen Arrays hat das wenig zu tun. Statisch zumindest im Sinne der C Programmiersprache hat etwas mit der Allozierung von Speicher zu tun. Statischer Speicher wird zur Ladezeit eines Programmes angelegt respektive ist sogar Bestandteil des geladenen Executable-Images. Ganz anders bei dynamischen Speicher der erst zur Laufzeit angelegt wird.

Was Du meinst sind Fixedsize Arrays und die unterstützt LabVIEW inzwischen auch, da das für die Verwendung in FPGA Targets sehr hilfreich ist. Aber das Fixedsize Arrays innerhalb einer Struktur inlined sind ist nicht eine zwingende Vorgabe (und LabVIEW macht das meines Wissens auch nicht) sondern ganz einfach eine Optimalisierung die von vielen Compilern durchgeführt wird, wie auch in C.

Ich denke das die Serialisierung der Daten in ein Bytearray in diesem Fall tatsächlich eine der besseren Varianten ist in Anbetracht der beschränkten C Kenntnisse des ursprünglichen Problemstellers. Nur beisst sich das selber auch wieder in den Schwanz, da man dafür schon ziemlich genau wissen muss wie ein C Compiler die Daten in einer Struktur anordnet und dieses Wissen geht eindeutig über das notwendige Wissen der Basis C Programmierung hinaus.

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
25.06.2010, 10:08
Beitrag #8

Dimitri Offline
LVF-Grünschnabel
*


Beiträge: 34
Registriert seit: Jun 2009

2009
2009
de

30171
Deutschland
DLL in LV einbinden. Geht es nur mit einer anderen Wrapper-DLL
Nun bin ich komplett durch einander. Wie soll ich jetzt vorgehen ?

Außerdem verstehe ich leider nicht was unter Serialisierung der Daten in ein Bytearray gemeint ist. Blink

' schrieb:Ich denke das die Serialisierung der Daten in ein Bytearray in diesem Fall tatsächlich eine der besseren Varianten ist in Anbetracht der beschränkten C Kenntnisse des ursprünglichen Problemstellers...

rolfk kannst du mir bitte das bisschen detaillierter erklären (am besten mit einem Beispiel)?? So für DummiesWacko
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
25.06.2010, 10:22
Beitrag #9

Dimitri Offline
LVF-Grünschnabel
*


Beiträge: 34
Registriert seit: Jun 2009

2009
2009
de

30171
Deutschland
DLL in LV einbinden. Geht es nur mit einer anderen Wrapper-DLL
' schrieb:Da in allen deinen Strukturen keine Pointer vorkommen, solltes eine Wrapper-DLL nicht notwendig sein.

Mach einen Cluster, der genau die Daten enthält, wie das Struct es vorschreibt. Im DLL-Knoten sagst du dann "Zeiger auf Daten".

Die char[]'s in den Struct's musst du als Array of U8 behandeln.

Ich habe versucht den Vorschlag von IchSelbst zu realisieren, aber wenn ich unter Einstellungen "Datenzeiger" auswähle,
kann ich keine Daten mehr an den Knoten witergeben. (Sihe Bild)


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
25.06.2010, 11:02 (Dieser Beitrag wurde zuletzt bearbeitet: 25.06.2010 15:05 von IchSelbst.)
Beitrag #10

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.687
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
DLL in LV einbinden. Geht es nur mit einer anderen Wrapper-DLL
' schrieb:Ich habe versucht den Vorschlag von IchSelbst zu realisieren, aber wenn ich unter Einstellungen "Datenzeiger" auswähle, kann ich keine Daten mehr an den Knoten witergeben. (Sihe Bild)
Das geht doch nicht - weil Arrays hier nicht fixedsized sind.

Serialisieren befindet sich auf der Palette Numerisch->Datenbearbeitung.

Hinweis:
Ich glaube es muss little-endian sein.

Und einen Muster DLL-Knoten hab ich auch gleich noch mit reingemacht. Probiers mal so.

Und was auch noch offen ist: Muss der Speicherbereich, der ja per Pointer an die DLL übergeben wird, bestehen bleiben auch über die Laufzeit des Knotens hinaus?

Lv85_img


Angehängte Datei(en) Thumbnail(s)
   

Sonstige .vi  Muster.vi (Größe: 13,85 KB / Downloads: 301)

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  LabView Wrapper - PostUserEvent aus externer DLL Stephan235 3 9.872 22.07.2015 13:28
Letzter Beitrag: rolfk
  DLL einbinden mittels Wrapper OXO 11 12.988 08.05.2013 10:27
Letzter Beitrag: OXO
  Wrapper DLL zum dynamischen Laden b.p 3 6.066 17.04.2012 13:18
Letzter Beitrag: rolfk
  C# MAPI .NET WRAPPER DLL und Lotus Notes Totte 3 7.231 16.12.2011 09:15
Letzter Beitrag: Totte
  Einbinden einer DLL mit mehr Output-Parametern, als Input-Parametern Herm 3 5.550 14.06.2011 11:12
Letzter Beitrag: rolfk
  Trinamic TMCM 610 über Wrapper.dll passimatze 2 5.240 17.06.2010 06:23
Letzter Beitrag: passimatze

Gehe zu: