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-funktion open öffnet nicht und bei get_info bleibt Labview hängen



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!

30.12.2011, 14:30 (Dieser Beitrag wurde zuletzt bearbeitet: 30.12.2011 14:38 von rolfk.)
Beitrag #3

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: dll-funktion open öffnet nicht und bei get_info bleibt Labview hängen
(30.12.2011 00:50 )Erik_M schrieb:  Hallo miteinander,

ich habe sehr wenig Erfahrung mit dem Zugreifen auf dlls in Labview.
Gerne möchte ich auf den Lightstone (USB Meßgerät vom Spiel Wild Divine, das den Hautwiderstand und
die Herzfrequenz und -variabilität misst) unter Labview zugreifen und die Daten erfassen.

Dazu gibt es liblightstone, ein Treiber (Cross-platform driver).
Hierzu habe ich die dll-, h-, und c-Dateien in der zip.Datei angefügt.
Unter:
http://docs.nonpolynomial.com/liblightst...ygen/html/
gibt es die Beschreibung der Daten Struktur, Kern Funktionen etc.

In der angefügten Test.vi Lv09_img2 habe ich erfolgreich die lightstone_create und lightstone_get_count Funktionen zum laufen bekommen.
Jedoch bei der lightstone_open Funktion zeigt der Rückgabetyp -3 an: E_LIGHTSTONE_NOT_OPENED

Bei der lightstone_get_info Funktion bleibt Labview hängen.Ahrg1Iwill

Muss man bei der lightstone_open Funktion unbedingt den lightstone* dev Parameter mit angeben (Datenfeld mit mehreren struct und int, welches mit der lighstone_create Funktion erstellt wurde)? Bei der lightstone_get_count Funktion war dies jedoch nicht erforderlich.
Bei der lightstone_get_info ist der Rückgabetyp ein array mit float,float. Wie erstelle ich die Verbindung zur Funktion?
Ist es erforderlich in der lightstone_get_info bei der Aufrufkonvention stdcall (WINAPI) anstatt c einzustellen?

Es wäre schön, wenn mir jemand hier helfen könnte.

M.f.G
Erik

Also so ist das aber wirklich völlig falsch. Die lighstone_create Function erzeugt eine Struktur und gibt den Pointer darauf zurück. Dieser Pointer muss dann an alle anderen Funktionen übergeben werden. Du kannst nicht einfach Funktionsparameter unterschlagen wenn Du eine Funktion aufrufst. Das hat beinahe zwingend eine Korruption des Stacks zur Folge und danach ist es schlicht grosses Unglück wenns nicht gleich crasht. Grosses Unglück weil Codeexecution mit korrumpiertem Stack sehr katastrophale Folgen haben kann bis hin zur Beschädigung des Betriebsystems.

Die lightstone_get_count Funktion hat eindeutige einen Parameter den Du einfach unterschlägst. Dass die damit etwas anderes dann 0 zurückgibt ist eher unwahrscheinlich. lightstone_open hat zwei Parameter. Der erste ist der Strukturpointer den die lightstone_create Funktion zurückgibt, der zweite ist der Index des Devices das geöffnect werden soll, und sollte wohl zwischen 0 und dem Rückgabewert -1 von lightstone_get_count liegen.

Wie also den Strukturpointer in LabVIEW behandeln? Ziemlich einfach. Konfigurierere den Rückgabewert von lightstone_create als Pointer sized Integer. Und bei allen anderen Funktionen die einen lightstone *dev Parameter haben konfigurierst Du diesen Parameter ebenso. Nun kannst Du den Ausgang von lightstone_create mit diesen anderen Paramtern verbinden. Und um ein Speicherleck zu vermeiden musst Du nicht vergessen lightstone_delete am Ende aufzurufen. ligtstone_create erzeugt im Speicher eine Struktur die ansonsten nicht wieder freigegeben wird.

Der Rückgabewert von ligtstone_get_info ist direkt in LabVIEW nicht auslesbar. LabVIEW akzeptiert nur Strings, und Skalars als Funktionsrückgabewerte. Bei einem String wird vom Startwert des Pointers so lange gesucht bis ein NULL Byte gefunden wird und das wird dann alles in einen LabVIEW String kopiert. Das heisst dass Du oftmals nicht alle 8 bytes der zwei Floats sehen würdest. Eine Möglichkeit besteht darin, diesen Parameter ebenfalls als Pointer sized Integer zu konfigurieren und dann mit Aufruf der MoveBlock LabVIEW C Funktion (suchen nach MoveBlock hier und bei forums.ni.com) die 8 Bytes in einen entsprechenden Cluster kopieren.


Und denke daran, wenn eine Funktion zwei Parameter hast musst Du in der Call Library Node auch wirklich zwei Parameter konfigurieren, keinen mehr oder weniger.

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


Nachrichten in diesem Thema
RE: dll-funktion open öffnet nicht und bei get_info bleibt Labview hängen - rolfk - 30.12.2011 14:30

Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  .dll nicht LabView kompatibel? virtualmake 5 6.027 10.09.2013 14:49
Letzter Beitrag: virtualmake
  GetSnapshot-Funktion funktioniert in While-Schleife nicht richtig labrat 6 7.034 09.02.2012 09:26
Letzter Beitrag: Hook1986
  dll einbinden Fehler: Funktion in Bibliothek nicht gefunden mrstrom 1 7.133 06.12.2010 13:40
Letzter Beitrag: oenk

Gehe zu: