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 

GetSnapshot-Funktion funktioniert in While-Schleife nicht richtig



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!

06.02.2012, 16:31
Beitrag #1

labrat Offline
LVF-Grünschnabel
*


Beiträge: 30
Registriert seit: Oct 2011

2011 DS2
2008
DE



GetSnapshot-Funktion funktioniert in While-Schleife nicht richtig
Hallo,

ich habe ein Programm, mit dem ich über diverse Funktionen aus einer DLL-Datei von einer Kamera (Sumix SMX150) Bilder hole, wobei wir die Kamera extern triggern. In der DLL ist eine Funktion "CxGetSnapshot" enthalten, die bei einer Triggerflanke ein einzelnes Kamerabild erzeugt. Im Prinzip funktioniert die Funktion einwandfrei. Ruft man die Funktion 1mal auf, bekommt man auch 1 Snapshot. Würde man beispielsweise die Funktion 100mal hintereinander mit 100 verschiedenen DLL-Knoten aufrufen, würde man auch 100 Frames bekommen. Soweit so gut!

Nun ist diese Vorgehensweise etwas umständlich, aber dafür gibt es ja Schleifen. Genau hier liegt aber das Problem.
Angenommen, das Triggersignal kommt mit 0,5Hz, dann erwartet man, dass alle 2 Sekunden ein Bild aufgenommen wird. Tatsächlich aber werden Bilder mit der höchstmöglichen Framerate (ca. 30fps) erzeugt.

Ich kann definitiv sagen, dass die Kamera auf den Triggerpuls reagiert, da wir sonst nicht unsere extrem kurzen Laserpulse (einige Nanosekunden) detektieren könnten. Außerdem kann man beid er Bilddarstellung alle 2 Sekunden ein Flackern im Bild erkennen. Es scheint jedoch fast so, als ob zwischen den getriggerten Bildern einfach beliebige weitere Bilder erzeugt werden.

Ich bin ein wenig am Verzweifeln, denn dies scheint so ein Problem zu sein vom Typ: Sollte eigentlich funktionieren, tut es aber nicht. Vielleicht habe ich aber einfach nur etwas übersehen. Für eure Hilfe bin ich jedenfalls sehr dankbar.

schöne Grüße
labrat


Angehängte Datei(en)
8.0 .vi  SMX150_SnapshotWhileLoop_Ext.Trigger.vi (Größe: 42,29 KB / Downloads: 273)

0.0 .dll  SMX150.dll (Größe: 126,11 KB / Downloads: 240)

0.0 .txt  SMX150API.txt (Größe: 35,1 KB / Downloads: 755)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
06.02.2012, 19:27
Beitrag #2

cnongs Offline
LVF-Grünschnabel
*


Beiträge: 46
Registriert seit: Oct 2008

6i 7.1 8.2 9.0 10.0
2006
kA

06126
Deutschland
RE: GetSnapshot-Funktion funktioniert in While-Schleife nicht richtig
Hallo,

wenn ich dein Programm richtig verstehe, wird die GetSnapshot DLL ständig aufgerufen. Setzte doch eine "Wait" Funktion mit dem Wert 2000 in die While-Schleife.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
07.02.2012, 09:56
Beitrag #3

labrat Offline
LVF-Grünschnabel
*


Beiträge: 30
Registriert seit: Oct 2011

2011 DS2
2008
DE



RE: GetSnapshot-Funktion funktioniert in While-Schleife nicht richtig
Die GetSnapshot-Funktion sollte eigentlich auf ein externes Triggersignal waren, d.h. die Schleife (inkl. Snapshotfunktion) sollte sowieso nur alle 2 Sekunden aufgerufen werden. So wie es aussieht, reagiert die Funktion auch auf das Triggersignal. Aber sie wird eben auch permanent innerhalb der 2 Sekunden ausgeführt, wenn auch gerade kein Trigger anliegt.

Aber du hast natürlich recht. Füge ich eine Wartefunktion ein, kann die Schleife natürlich nur alle 2 Sekunden durchlaufen werden. Problem gelöst! Aber: Der 2 Sekunden Takt, war nur zur Verdeutlichung gedacht. Bei einer so langsamen Frequenz kann man eben gut erkennen, wie die Funktion auf einen Trigger reagiert - oder eben nicht. In Wirklichkeit benötigen wir deutlich höhere Frameraten (25 - 100 fps). Da wird es dann extrem schwierig das exakte Timeing hinzubekommen.

Kann es vielleicht sein, dass etwas mit der GetSnapshotfunktion ansich nicht stimmt? Das dürfte aber doch eigentlich nicht vorkommen.
Laut Hersteller soll die Funktion tatsächlich nämlich nur 1 Frame pro 1 Triggerflanke einholen.

schöne Grüße
labrat
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
07.02.2012, 18:07
Beitrag #4

cnongs Offline
LVF-Grünschnabel
*


Beiträge: 46
Registriert seit: Oct 2008

6i 7.1 8.2 9.0 10.0
2006
kA

06126
Deutschland
RE: GetSnapshot-Funktion funktioniert in While-Schleife nicht richtig
Wenn die GetSnapshot-Funktion auf das externes Triggersignal warten soll, dann würde ich das Trigersignal mit Hilfe einer While-Schleife abfragen und wenn der Wert "True" ist die Dll-Funktion einmal aufrufen lassen.
In deinem Programm wird die DLL-Funktion ständig aufgerufen.

Das wäre zumindest mein Ansatz Wink


Angehängte Datei(en) Thumbnail(s)
   

8.6 .vi  GetSnapshot.vi (Größe: 6,2 KB / Downloads: 233)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
07.02.2012, 22:30
Beitrag #5

labrat Offline
LVF-Grünschnabel
*


Beiträge: 30
Registriert seit: Oct 2011

2011 DS2
2008
DE



RE: GetSnapshot-Funktion funktioniert in While-Schleife nicht richtig
Im Prinzip hast du recht, so würde es gehen. Aber an müsste man anstelle der Snapshot-Funktion natürlich ständig den Trigger abfragen. Das hieße dann aber, dass eine DAQ-Karte benötigt wird um das Triggersignal einzulesen.

Das Seltsame ist ja, dass die Funktion nach aufruf auch tatsächlich auf eine Triggerflanke wartet. Kaum packt man sie in eine Schleife scheint das Warte-Feature jedoch nicht mehr zu funktionieren. Das dürfte doch eigentlich nicht so sein, oder?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
09.02.2012, 06:18 (Dieser Beitrag wurde zuletzt bearbeitet: 09.02.2012 06:21 von rolfk.)
Beitrag #6

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: GetSnapshot-Funktion funktioniert in While-Schleife nicht richtig
(07.02.2012 22:30 )labrat schrieb:  Im Prinzip hast du recht, so würde es gehen. Aber an müsste man anstelle der Snapshot-Funktion natürlich ständig den Trigger abfragen. Das hieße dann aber, dass eine DAQ-Karte benötigt wird um das Triggersignal einzulesen.

Das Seltsame ist ja, dass die Funktion nach aufruf auch tatsächlich auf eine Triggerflanke wartet. Kaum packt man sie in eine Schleife scheint das Warte-Feature jedoch nicht mehr zu funktionieren. Das dürfte doch eigentlich nicht so sein, oder?

Dürfte? Es wäre natürlich sinnvoll wenn das nicht so wäre, aber da Du nicht weisst was der Programmierer getan hat, ist es schwierig zu beurteilen ob das jetzt ein Bug ist oder einfach ein unwillkommenes Feature. Wahrscheinlich verhedert sich die DLL an den inherenten Multithreadingmöglichkeiten von LabVIEW, indem sie beispielsweise per aufrufendem Thread beihält ob der Trigger schon abgefragt wurde. Funktioniert perfekt wenn man das aus einer C Routine in einer Schleife aufruft, aber in LabVIEW ist die Chance recht gross, dass bei einem folgenden Aufruf ein anderer Thread aus dem vorhandenen Pool verwendet wird, dann zuvor.

Abhilfen wären:

- Sicherstellen dass Du die Parallelisierung der Loop nicht eingeschaltet hast.
- Dem VI explizit ein bestimmtes Execution System zuweisen und mit dem vi.lib\utility\sysinfo.llb\threadconfig.vi diesem Execution System nur einen einzigen Thread zuweisen. LabVIEW muss neu gestartet werden, da die Threadkonfiguration nur beim Starten gemacht wird.
- Die DLL Funktion im UI Thread laufen lassen (nicht empfehlenswert da Dein Image Capture dann mit dem LabVIEW UI konkuriert und das kann unschöne Ergebnisse haben (schlechte Performance) bis hin zu totalen Lockouts der LabVIEW Applikation, wenn die DLL sich selber auch noch irgendwie in die Windows Message Queue einhängt).

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
09.02.2012, 09:26
Beitrag #7

Hook1986 Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 149
Registriert seit: Jan 2012

2010
2011
DE_EN


Deutschland
RE: GetSnapshot-Funktion funktioniert in While-Schleife nicht richtig
Hallo labrat,

zunächst einmal ein kleiner Programmierhinweis. In deinem VI aus Beitrag #1 verwendest du eine flache Sequenzstruktur. Diese brauchst du doch garnicht. Denke an das Datenflussprinzip. Dann wirst du feststellen, dass diese Dinge so oder so nacheinander ablaufen müssen.

Darüber hinaus wäre das "Producer-Consumer" Design Pattern für deine Anwendung sehr hilfreich. Dann einfach eine Eventstruktur nutzen und bei einem Triggersignal in die Queue schreiben. Das lässt dann auch deine CPU-Auslastung sinken, da nicht ständig in der Schleife rotiert wird. Dann wird die Funktion auch nur genau dann aufgerufen, wenn es sein muss. Dies ist dann ähnlich zu dem Vorschlag von cnongs.

MfG Carsten
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
  Einbindung DLL funktioniert nicht Schrankwand 1 4.111 10.03.2023 18:50
Letzter Beitrag: GerdW
  HWND auslesen, funktioniert nicht mit jedem PC Mischa E 10 12.926 23.04.2012 13:31
Letzter Beitrag: rolfk
  VI mit .net dll's funktioniert nur als exe, nicht im Entwicklungsmodus markus321 7 7.978 31.01.2012 15:31
Letzter Beitrag: markus321
Sad dll-funktion open öffnet nicht und bei get_info bleibt Labview hängen Erik_M 6 8.307 02.01.2012 23:44
Letzter Beitrag: rolfk
  WinAPI Aufruf funktioniert nicht unter Win7 Lessy2205 5 8.161 15.11.2011 13:03
Letzter Beitrag: Lessy2205
  dll einbinden Fehler: Funktion in Bibliothek nicht gefunden mrstrom 1 7.571 06.12.2010 13:40
Letzter Beitrag: oenk

Gehe zu: