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- Datentypen nicht in LabVIEW vorhanden



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!

12.04.2011, 15:57 (Dieser Beitrag wurde zuletzt bearbeitet: 04.05.2011 12:51 von jg.)
Beitrag #1

jak888 Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 133
Registriert seit: Apr 2010

2010
2010
en

97447
Deutschland
DLL- Datentypen nicht in LabVIEW vorhanden
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.

"Good judgement comes from experience, experience comes from bad judgement."
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
12.04.2011, 16:29 (Dieser Beitrag wurde zuletzt bearbeitet: 12.04.2011 16:31 von toaran_.)
Beitrag #2

toaran_ Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 237
Registriert seit: Feb 2007

2012
2006
EN

90763
Deutschland
RE: DLL- Datentypen nicht in LabVIEW vorhanden
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/Interfac...94#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...union.html

T
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
27.04.2011, 10:54 (Dieser Beitrag wurde zuletzt bearbeitet: 27.04.2011 14:28 von jak888.)
Beitrag #3

jak888 Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 133
Registriert seit: Apr 2010

2010
2010
en

97447
Deutschland
RE: DLL- Datentypen nicht in LabVIEW vorhanden
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?

"Good judgement comes from experience, experience comes from bad judgement."
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
27.04.2011, 15:53
Beitrag #4

rolfk Offline
LVF-Guru
*****


Beiträge: 2.302
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: DLL- Datentypen nicht in LabVIEW vorhanden
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!!

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
27.04.2011, 16:03
Beitrag #5

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
RE: DLL- Datentypen nicht in LabVIEW vorhanden
Offtopic2 Wie bringt man denn das Fenster mit Rollbalken (Beitrag #1) zustande?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
27.04.2011, 16:21
Beitrag #6

NWOmason Offline
Simultator
*****


Beiträge: 1.078
Registriert seit: Dec 2010

2012.SP1
2008
EN

93047
Deutschland
RE: DLL- Datentypen nicht in LabVIEW vorhanden
(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

9 von 10 Stimmen in meinem Kopf sagen: Ich bin nicht verrückt,
die andere summt die Melodie von Tetris
.

NI schrieb:To use the abort button is like using a tree to stop a car!

(20.01.2012 11:02 )NWOmason schrieb:  Getting Started with NI LabVIEW Student Training
http://zone.ni.com/devzone/cda/tut/p/id/7466

Introduction to NI LabVIEW - Learn LabVIEW Basics
http://www.ni.com/gettingstarted/labviewbasics/

Top 5 der Empfehlungen für LabVIEW-Einsteiger
http://www.ni.com/newsletter/51735/de/
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
28.04.2011, 11:47
Beitrag #7

jak888 Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 133
Registriert seit: Apr 2010

2010
2010
en

97447
Deutschland
RE: DLL- Datentypen nicht in LabVIEW vorhanden
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?

"Good judgement comes from experience, experience comes from bad judgement."
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
03.05.2011, 13:29
Beitrag #8

rolfk Offline
LVF-Guru
*****


Beiträge: 2.302
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: DLL- Datentypen nicht in LabVIEW vorhanden
(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.

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
04.05.2011, 10:24 (Dieser Beitrag wurde zuletzt bearbeitet: 04.05.2011 10:54 von jak888.)
Beitrag #9

jak888 Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 133
Registriert seit: Apr 2010

2010
2010
en

97447
Deutschland
RE: DLL- Datentypen nicht in LabVIEW vorhanden
(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:
   

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.

"Good judgement comes from experience, experience comes from bad judgement."
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
09.05.2011, 14:52
Beitrag #10

rolfk Offline
LVF-Guru
*****


Beiträge: 2.302
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: DLL- Datentypen nicht in LabVIEW vorhanden
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).

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
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  .dll nicht LabView kompatibel? virtualmake 5 5.705 10.09.2013 14:49
Letzter Beitrag: virtualmake
  DLL-Einbindung, Struct mit verschiedenen Datentypen als Pointer übergeben hawk72 4 10.257 11.05.2012 14:41
Letzter Beitrag: hawk72
  CRC Berechnung: Codebeispiel vorhanden Takuro 6 12.014 01.06.2011 17:17
Letzter Beitrag: Lucki
  pointer auf struct mit unterschiedlichen datentypen neven 8 7.024 27.11.2007 16:42
Letzter Beitrag: neven

Gehe zu: