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, 00:50
Beitrag #1

Erik_M Offline
LVF-Neueinsteiger


Beiträge: 3
Registriert seit: Dec 2011

9, 11
2009
DE_EN



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


Angehängte Datei(en)
0.0 .zip  lightstone.zip (Größe: 44,13 KB / Downloads: 293)

9.0 .vi  Test.vi (Größe: 12,85 KB / Downloads: 233)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30.12.2011, 13:33
Beitrag #2

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
RE: dll-funktion open öffnet nicht und bei get_info bleibt Labview hängen
(30.12.2011 00:50 )Erik_M schrieb:  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)?
Ja, denn du brauchst diesen Rückgabewert für weitere Aufrufe!
(30.12.2011 00:50 )Erik_M schrieb:  Bei der lightstone_get_count Funktion war dies jedoch nicht erforderlich.
Steht explizit auch so in der Beschreibung!
(30.12.2011 00:50 )Erik_M schrieb:  Bei der lightstone_get_info ist der Rückgabetyp ein array mit float,float. Wie erstelle ich die Verbindung zur Funktion?
Laut Header-File ist das auch eine Structure, kein Array. Könnte mglw. mit einem Cluster aus 2 Elementen funktionieren. Trial and Error ist angesagt.
(30.12.2011 00:50 )Erik_M schrieb:  Ist es erforderlich in der lightstone_get_info bei der Aufrufkonvention stdcall (WINAPI) anstatt c einzustellen?
Ich denke nein.

Gruß, Jens

Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)

!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!

Einführende Links zu LabVIEW, s. GerdWs Signatur.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
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.302
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
31.12.2011, 22:38
Beitrag #4

Erik_M Offline
LVF-Neueinsteiger


Beiträge: 3
Registriert seit: Dec 2011

9, 11
2009
DE_EN



RE: dll-funktion open öffnet nicht und bei get_info bleibt Labview hängen
Vielen Dank für die Antworten.

Die Funktionsaufrufe funktionieren soweit. Ich habe bei den jeweiligen Parametereinstellungen für lightstone *dev
bei übergeben: Wert anstatt Zeiger auf Wert angegeben.
Nur bei dem Lösungsvorschlag mit der Zuhilfenahme des Aufrufs der MoveBlock LabVIEW C Funktion bin ich bisher gescheitert. Bahn
Ich habe wie vorgeschlagen bei der lightstone_get_info Funktion den Rückgabetyp für den lightstone_info Parameter ebenfalls als Pointer sized Integer konfiguriert. (Test4.vi Lv09_img2 ist beigefügt)
Doch wie gehe ich bei der MoveBlock Funktion vor?
Der AusgabeCluster besteht doch aus 2 32-bit Integer Variablen.
Die 3 Parameter der MoveBlock Funktion sind doch: Adresse, Destination und Size.

Die Suche in den Foren nach MoveBlock bringt mich nicht viel weiter.

M.f.G.
Erik


Angehängte Datei(en)
9.0 .vi  Test4.vi (Größe: 10,54 KB / Downloads: 237)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
01.01.2012, 23:53
Beitrag #5

rolfk Offline
LVF-Guru
*****


Beiträge: 2.302
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
(31.12.2011 22:38 )Erik_M schrieb:  Vielen Dank für die Antworten.

Die Funktionsaufrufe funktionieren soweit. Ich habe bei den jeweiligen Parametereinstellungen für lightstone *dev
bei übergeben: Wert anstatt Zeiger auf Wert angegeben.
Nur bei dem Lösungsvorschlag mit der Zuhilfenahme des Aufrufs der MoveBlock LabVIEW C Funktion bin ich bisher gescheitert. Bahn
Ich habe wie vorgeschlagen bei der lightstone_get_info Funktion den Rückgabetyp für den lightstone_info Parameter ebenfalls als Pointer sized Integer konfiguriert. (Test4.vi Lv09_img2 ist beigefügt)
Doch wie gehe ich bei der MoveBlock Funktion vor?
Der AusgabeCluster besteht doch aus 2 32-bit Integer Variablen.
Die 3 Parameter der MoveBlock Funktion sind doch: Adresse, Destination und Size.

Die Suche in den Foren nach MoveBlock bringt mich nicht viel weiter.

M.f.G.
Erik

Two points:

The second parameter to lightstone_open is an input, indicating which of the devices that lightstone_create detected and lightstone_get_count reported, should be opened.

MoveBlock is almost right. You should configure the second parameter not to be a pointer to Interface data, but a Handle by Value or Pointer to Handle. Which doesn't matter, since we do not pass a handle here but a structure. Last but not least the cluster should contain two single precision floats and not integers and then the length needs to be 8 since you want to copy two single precision floats of 4 bytes each, not only one.

I would also make sure that the cluster input is actually defined by a constant and not just left open. Leaving it open "might" work fine in the newest versions of LabVIEW but can be a cause of protection fault errors in older versions, as LabVIEW didn't preallocate unwired input parameters on the Call Library Node automatically in the past.

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
02.01.2012, 22:04
Beitrag #6

Erik_M Offline
LVF-Neueinsteiger


Beiträge: 3
Registriert seit: Dec 2011

9, 11
2009
DE_EN



RE: dll-funktion open öffnet nicht und bei get_info bleibt Labview hängen
Folgende vi bringt mir jedoch nur den ersten 4Byte Wert (float hrv).:
Test5.vi Lv09_img2
Der zweite Wert (float scl) bleibt auf 0,0000.
Ich musste jedoch in moveblock bei dem ersten Parameter (src) anstatt Wert, den Zeiger auf Wert übergeben, damit sich
überhaupt etwas tat.
size steht auf 8 Byte.

1.Warum werden nur die ersten 4 Byte des Cluster kopiert?

2. Ist es richtig, daß man beim Parameter lightstone * dev den Wert und beim lightstone_info Parameter im moveblock den Zeiger
auf Wert übergibt?

3. Muss man ewas beachten, wenn man die Funktion lightstone_get_info und moveblock in einer Schleife mehrmals hintereinander aufruft?


Angehängte Datei(en)
9.0 .vi  Test5.vi (Größe: 11,1 KB / Downloads: 238)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
02.01.2012, 23:44
Beitrag #7

rolfk Offline
LVF-Guru
*****


Beiträge: 2.302
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
(02.01.2012 22:04 )Erik_M schrieb:  Folgende vi bringt mir jedoch nur den ersten 4Byte Wert (float hrv).:
Test5.vi Lv09_img2
Der zweite Wert (float scl) bleibt auf 0,0000.
Ich musste jedoch in moveblock bei dem ersten Parameter (src) anstatt Wert, den Zeiger auf Wert übergeben, damit sich
überhaupt etwas tat.
size steht auf 8 Byte.

1.Warum werden nur die ersten 4 Byte des Cluster kopiert?

2. Ist es richtig, daß man beim Parameter lightstone * dev den Wert und beim lightstone_info Parameter im moveblock den Zeiger
auf Wert übergibt?

3. Muss man ewas beachten, wenn man die Funktion lightstone_get_info und moveblock in einer Schleife mehrmals hintereinander aufruft?

1) Zeiger auf Wert ist falsch. Damit kopierst Du den Pointer Wert und der ist nur 4 Byte lang.

2) Nein.

3) Solange dass in der selben Loop geschieht nicht. Der Pointer wird aber wahrscheinlich nur solange Gültigkeit haben bis die Funktion wieder aufgerufen wird.

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.478 10.09.2013 14:49
Letzter Beitrag: virtualmake
  GetSnapshot-Funktion funktioniert in While-Schleife nicht richtig labrat 6 6.411 09.02.2012 09:26
Letzter Beitrag: Hook1986
  dll einbinden Fehler: Funktion in Bibliothek nicht gefunden mrstrom 1 6.780 06.12.2010 13:40
Letzter Beitrag: oenk

Gehe zu: