LabVIEWForum.de
DLL- Datentypen nicht in LabVIEW vorhanden - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: DLL & externer Code (/Forum-DLL-externer-Code)
+---- Thema: DLL- Datentypen nicht in LabVIEW vorhanden (/Thread-DLL-Datentypen-nicht-in-LabVIEW-vorhanden)

Seiten: 1 2


DLL- Datentypen nicht in LabVIEW vorhanden - jak888 - 12.04.2011 15:57

Hallo,

ich versuche gerade ein LabVIEW Programm zu schreiben, mit dessen Hilfe man mit dem tiny_CAN 2XL Modul kommunizieren kann. Hierzu stellt der Hersteller eine API bereit, bei der man im Prinzip nur die DLL einbinden muss und die nötigen Funktionen so nutzen kann (was ja auch der Sinn einer DLL ist).
Prinzipiell funktioniert das auch bis jetzt ganz Gut, leider bin ich bei ein paar der Funktionen auf Probleme mit den Datentypen gestoßen:
In einer Funktion wird beispielsweise der Datentyp "unsigned char" verlangt, den es in LabVIEW nicht gibt. Ich denke, dass ich das umgehen kann, indem ich den Datentyp uint_8 verwende.
In einer anderen Funktion wird der Datentyp "struct TCanMsg" gefragt. Dieser wie folgt aufgebaut:

Code:
struct TCanFlagsBits
{
unsigned Len:4; // Dlc
unsigned TxD:1; // TxD -> 1 = Tx CAN Message, 0 = Rx CAN Message
unsigned Res:1; // Reserviert
unsigned RTR:1; // remote transmition request bit
unsigned EFF:1; // extended frame bit
unsigned Res2:8;
};

union TCanFlags
{
struct TCanFlagsBits Flag;
uint32_t Long;
};

union TCanData
{
char Chars[8];
unsigned char Bytes[8];
uint16_t Words[4];
uint32_t Longs[2];
};

struct TTime
{
uint32_t Sec;
uint32_t USec;
};

struct TCanMsg
{
uint32_t Id;
union TCanFlags Flags;
union TCanData Data;
struct TTime Time;
};

Dabei stellt sich mir auch die Frage: Wie kann ich die TCanFlagsBits umsetzen?

Wie kann ich diesen Datentyp simulieren oder was muss ich übergeben, dass die Funktion bekommt, was sie erwartet? Wenn ich an dieser Stelle einen String übergebe kommt die Funktion zwar ohne Fehler zurück, aber ich traue dem ganzen Frieden nicht wirklich.

Ein anderes Problem ist noch, dass bei einer anderen Funktion als Fehler zurückkommt, dass keine Hardware angebunden wäre. Muss ich den Treiber (Das Gerät wird vom System als USB auf RS232 umsetzer erkannt) extra einbinden oder sollten die DLLs das erledigen?

Bin für jede Hilfe dankbar

EDIT jg (damit es nicht in Beitrag #8 untergeht): Crosspost unter NI-Support-Forum.


RE: DLL- Datentypen nicht in LabVIEW vorhanden - toaran_ - 12.04.2011 16:29

Hallo

also struct Datentypen in Labview zu übergeben ist nicht ganz so einfach ... und dann auhc noch so ein Verschachtelten..viel Glück!

zum Thema hat rolfk was gepostet (am besten den ganzen Thread lesen ...
http://forums.ni.com/t5/LabVIEW/Interface-dll-function-with-struct-in-LabVIEW/m-p/1492294#M562268

ich habe wenn ich sowas an eine DLL übergebe eine wrapper DLL geschrieben das war meistens der schnellere Weg.

zum Thema unions ich bin in c++ nur Anfänger .. aber der Link hilft dir vieleicht: http://www.imb-jena.de/~gmueller/kurse/c_c++/c_union.html

T


RE: DLL- Datentypen nicht in LabVIEW vorhanden - jak888 - 27.04.2011 10:54

So, dann grab ich mal den Thread aus.

Ich bin mit meiner Dll Forschung soweit ganz gut vorangekommen was auch hauptsächlich an dem wunderbaren Link von toaran_ liegt. Danke nochmal dafür.

Auf einen ganz grünen Zweig bin ich allerdings immernoch nicht gekommen. Ich habe zwar inzwischen Kommunikation mit dem tiny_CAN Modul, aber es sendet immernoch keine Daten raus...

In der Dokumentation steht:
Die Datei "Can_Drv.h" muss immer eingebunden werden.

Jetzt frage ich mich natürlich: Muss ich das in LabVIEW genauso machen, oder wird die Datei Can_Drv.h automatisch beim Aufruf der Dll aufgerufen?
Wie kann ich die Datei am besten einbinden?

Eine weitere Frage, die inzwischen aufgetreten ist, ist ob es möglich ist eine Dll mehrmals parallel laufen zu lassen. Gibt es da konflikte oder kann ich das beliebig machen?


RE: DLL- Datentypen nicht in LabVIEW vorhanden - rolfk - 27.04.2011 15:53

Tja, die Bemerkung bezüglich des can_drv.h Headers bezieht sich natürlich darauf wenn man diese DLL von einem C/C++ Projekt aufrufen will. In LabVIEW kannst Du versuchen mit dem Import Library Wizard aus dem Header File eine LabVIEW VI Library zum Aufrufen der DLL generieren zu lassen. Das Resultat kann durchaus brauchbar sein, abhängig davon wie kompliziert der entsprechende Header ist.

Ob eine DLL mehrmals parallel (reentrant) aufgerufen werden kann hängt völlig vom DLL Programmierer ab. Das lässt sich nicht generell sagen, aber grundsätzlich ist es möglich. Wenn die DLL nicht dafür vorgesehen ist, kanns krachen, oder der Compi schmiert ab, oder man bekommt unsinnige Resultate oder man merkt nichts bis die Applikation am anderen Ende der Welt installiert wird, oder, oder, oder!!


RE: DLL- Datentypen nicht in LabVIEW vorhanden - Lucki - 27.04.2011 16:03

Offtopic2 Wie bringt man denn das Fenster mit Rollbalken (Beitrag #1) zustande?


RE: DLL- Datentypen nicht in LabVIEW vorhanden - NWOmason - 27.04.2011 16:21

(27.04.2011 16:03 )Lucki schrieb:  Offtopic2 Wie bringt man denn das Fenster mit Rollbalken (Beitrag #1) zustande?

Mit den [code#]-Tags:

[code#]
1
2
3
[/code#]

(ohne # natürlich)


Mit Scrollbalken funktioniert automatisch nach ner gewissen Zeilenanzahl:

Code:
1
2
3
4
5
6
7
8
9
1
0
11
12

Ein sehr gutes Feature, dann werden die Posts nicht so groß Smile

Beste Grüße,
NWO


RE: DLL- Datentypen nicht in LabVIEW vorhanden - jak888 - 28.04.2011 11:47

Hi,

ein Problem, bei der Übergabe des CAN Frames an das CAN Modul ist denke ich, dass das Programm einen Pointer auf eine Struct erwartet.
Ich habe zwar die entsprechende Struct zusammengebastelt und die DLL mit Adapt to type und pointers to handles intialisiert, aber da empfängt das Modul gar nichts.

Ich denke, dass ich das Problem umgehen kann, indem ich eine Wrapper dll schreibe.

Dazu hab ich mir gerade dieses Tutorial durchgelesen und es hat sogar funktioniert das Volumen eines Quaders damit zu berechnen. (Und dass obwohl pointer übergeben werden mussten)

Soweit bin ich eigentlich also in der Materie drin. Eine frage bleibt mir allerdings noch: Wie kann ich eine Dll in die Dll einbinden?
Kann ich DLL so schreiben, wie ein Programm, welches die DLL nutzt?


RE: DLL- Datentypen nicht in LabVIEW vorhanden - rolfk - 03.05.2011 13:29

(28.04.2011 11:47 )jak888 schrieb:  Hi,

ein Problem, bei der Übergabe des CAN Frames an das CAN Modul ist denke ich, dass das Programm einen Pointer auf eine Struct erwartet.
Ich habe zwar die entsprechende Struct zusammengebastelt und die DLL mit Adapt to type und pointers to handles intialisiert, aber da empfängt das Modul gar nichts.

Ich denke, dass ich das Problem umgehen kann, indem ich eine Wrapper dll schreibe.

Dazu hab ich mir gerade dieses Tutorial durchgelesen und es hat sogar funktioniert das Volumen eines Quaders damit zu berechnen. (Und dass obwohl pointer übergeben werden mussten)

Soweit bin ich eigentlich also in der Materie drin. Eine frage bleibt mir allerdings noch: Wie kann ich eine Dll in die Dll einbinden?
Kann ich DLL so schreiben, wie ein Programm, welches die DLL nutzt?

Was hast Du denn für einen Cluster gebastelt? Adapt to Type ist richtig, aber Pointer to Handles tut gar nichts, da Du keine Arrays und Strings übergibst sondern eben einen Cluster.

Eine DLL bindet man in eine andere DLL ein, indem man entweder diese DLL explizit mit LoadLibrary() lädt und dann mit GetProcAddress() Funktionspointer auf die exportierten Funktionen erhält, oder implizit indem man die entsprechende Importlibrary (*.lib) der zu importierend DLL in das DLL Project mit einbezieht. Diese Importlibrary kommt mit der entsprechenden DLL, da sie beim Erstellen der DLL miterzeugt wurde, und enthält im wesentlichen maschinenerzeugten Code, der LoadLibrary() und GetProcAddress() aufruft. Wenn Du keine Importlibrary hast oder die mitgelieferte nicht für Deinen Compiler arbeitet (Importlibraries sind binaire Files die Compilerspezifische Formate haben) dann gibt es bei jedem Compiler auch ein Commandlinetool mit dem man für einer DLL eine solche Importlibrary erstellen kann.


RE: DLL- Datentypen nicht in LabVIEW vorhanden - jak888 - 04.05.2011 10:24

(03.05.2011 13:29 )rolfk schrieb:  Was hast Du denn für einen Cluster gebastelt? Adapt to Type ist richtig, aber Pointer to Handles tut gar nichts, da Du keine Arrays und Strings übergibst sondern eben einen Cluster.

Ich hab einen Cluster Gebastelt der wie folgt aussieht:
[attachment=33639]

Ich habe eben versucht die Stucture aus dem eingangspost nachzubauen, mit den Grundregeln:
C Array[8] ist ein Cluster mit 8 Elementen
C Structure ist als Cluster Darzustellen
Bei unions werden die jeweils größten Datentypen verwendet.

Als was soll ich das Ganze dann übergeben?

Ich sollte vielleicht erwähnen, dass ich einen anderen Thread zu dem Thema im ni.com forum geposted habe.


RE: DLL- Datentypen nicht in LabVIEW vorhanden - rolfk - 09.05.2011 14:52

Also im ursprünglichen C Code kommen die TCanFlags vor den TCanData. Also scheint mir da noch was falsch.

Dann sollte man natürlich noch sicher sein dass die Structure by Reference übergeben wird, also als Pointer und nicht etwa by Value.

Will sagen der Functionsprototype sollte irgendwie so aussehen: something FunctionsName(..., TCanMeg *msg, ...);

Dann konfiguriert man den Parameter in der CLN einfach als Adapt to Type (Rest ist unwichtig da nicht anwendbar in diesem Fall).