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.)
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:
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_.)
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."
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!!
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."
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.
(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."