12.04.2011, 15:57
(Dieser Beitrag wurde zuletzt bearbeitet: 04.05.2011 12:51 von jg.)
Beitrag #1
|
jak888
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."
|
|
|
12.04.2011, 16:29
(Dieser Beitrag wurde zuletzt bearbeitet: 12.04.2011 16:31 von toaran_.)
Beitrag #2
|
toaran_
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
|
|
|
27.04.2011, 16:03
Beitrag #5
|
|
|
27.04.2011, 16:21
Beitrag #6
|
NWOmason
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: 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ß
Beste Grüße,
NWO
|
|
|
28.04.2011, 11:47
Beitrag #7
|
jak888
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."
|
|
|
03.05.2011, 13:29
Beitrag #8
|
rolfk
LVF-Guru
Beiträge: 2.305
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.
|
|
|
04.05.2011, 10:24
(Dieser Beitrag wurde zuletzt bearbeitet: 04.05.2011 10:54 von jak888.)
Beitrag #9
|
jak888
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."
|
|
|
| |