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!
Ich habe ein Problem mit dem Schreiben von Werten in eine Queue innerhalb einer While-Schleife und dem sehr schnellen Auslesen eben dieser Werte durch eine andere While Schleife. Es kommt dabei zu "Unterbrechungen", bzw. dem scheinbaren einlesen von Nullen (siehe Bilde im Anhang).
Ich lasse in meiner Anwendung zwei While-Schleifen parallel laufen. Eine Auslese-Schleife liest Werte aus einem Gerät aus und die andere Auswerte-Schleife ist für die Auswertung.
Daten der Auslese-Schleife sende ich mit einer Queue-Funktion zur Auswerte-Schleife. Es wird jeweils immer nur eine einzige Zahl pro Schleifendurchlauf übermittelt!
Mein Problem ist nun, dass je nachdem wie schnell ich die Auswerteschleife die Daten der Ausleseschleife abruft, es scheinbar zu "Unterbrechungen" der übertragenen Werte kommt.... es wird also immer mal wieder eine Null eingelesen, obwohl da keine Null ist.
Im Anhang habe ich drei Bilder angehängt welche durch eine Waveform-Chart dargestellt wurden. Angezeigt wird der durch die Queue-Funktion übertragene und von der Auswerte-Schleife abgerufene Wert über der Zeit:
1. Langsamer Auslesevorgang mit 50ms zwischen den Auslesevorgängen -> so sollte das aussehen !!!
2. Schneller Auslesevorgang mit 20ms zwischen den Auslesevorgängen -> man sieht schon ein paar "Einbrüche" bei denen scheinbar eine Null eingelesen wird !!!
3. Sehr schneller Auslesevorgang mit 10ms zwischen den Auslesevorgängen -> Es treten quasi ständig "Einbrüche" auf !!!
Man sieht also deutlich die Einbrüche je schneller ich die Werte aus der Auslese-Schleife abrufe. Die Auslese-Schleife schreibt ca. alle 15ms einen neuen Wert in die Queue-Funktion. Die Anzahl der Werte pro Queue ist auf nur einen Wert begrenzt.
Umgeghen kan nich das Problem durch das setzen eines hohen Time-Outs, allerdings ist das eine eher Suboptimale Option für mich, da wenn kein neuer Wert vorhanden ist, eben der alte Werte eingelesen wird.
Ich denke mal, dass das Problem folgendes ist:
Wenn die Auslese-Schleife im Begriff ist einen neuen Wert in die Queue zu schreiben und in dem selben Moment die Auswerte-Schleife einen Wert abrufen möchte, kommt es zu diesem "Einburch", bzw. dem einlesen einer Null??? !!!
Kann das sein?
Hat jemand eine Idee, wie ich dieses Problem aus der Welt schaffen kann?
viele Grüße
Peter
Anzeige
03.03.2011, 02:29 (Dieser Beitrag wurde zuletzt bearbeitet: 03.03.2011 08:02 von jg.)
RE: Zu SCHNELLES Auslesen einer Queue-Funktion ???
Ich habe gerade mal ein einfaches Beispielprogramm erstellt, welches das selbe Verhalten zeigt! Einfach runterladen und ausführen!
Man sieht wieder diese "Einbrüche" bei hoher Abrufrate.
Am liebsten wäre es mir, dass wenn noch kein neuer Wert in die Queue geschrieben wurde, einfach der alte Wert ausgegeben wird!
RE: Zu SCHNELLES Auslesen einer Queue-Funktion ???
(03.03.2011 00:45 )Sternhagel schrieb: Ich denke mal, dass das Problem folgendes ist:
Wenn die Auslese-Schleife im Begriff ist einen neuen Wert in die Queue zu schreiben und in dem selben Moment die Auswerte-Schleife einen Wert abrufen möchte, kommt es zu diesem "Einburch", bzw. dem einlesen einer Null??? !!!
Kann das sein?
Die Ausleseschleife liest alle 50ms eine Wert aus der Queue, egal ob einer drin ist, oder nicht, da der Timeouteingang der Queue mit 0 belegt ist, also nicht auf die Queue gewartet wird, bis ein neuer Wert ansteht.
(03.03.2011 00:45 )Sternhagel schrieb: Hat jemand eine Idee, wie ich dieses Problem aus der Welt schaffen kann?
Ja, Timing aus der Ausleseschleife raus
Beste Grüße,
NWO
9 von 10 Stimmen in meinem Kopf sagen: Ich bin nicht verrückt,
die andere summt die Melodie von Tetris.
NI schrieb:To use the abort button is like using a tree to stop a car!
RE: Zu SCHNELLES Auslesen einer Queue-Funktion ???
Alternative: Dequeue hat einen Ausgang "timed out?". Diesen einfach auswerten und entsprechend reagieren:
Denn wenn "timed out?" = TRUE, dann ist gerade kein Element in der Queue, dann darf man auch keine Ausgabe weiterverarbeiten.
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!
RE: Zu SCHNELLES Auslesen einer Queue-Funktion ???
Dann wird das Element in der Queue also nach dem Auslesevorgang immer gelöscht, wenn ich euch richtig verstehe?
Nach der LabView Hilfe sollte es aber nicht so sein. Im Context-Menue bei der "Enqueue-Funktion" steht:
"Removes an element from the front of a queue and RETURNS the element."
Das "Returns the element" verstehe ich eigentlich so, dass es nach dem Auslesevorgang noch in der Queue sein sollte oder nicht???
03.03.2011, 16:18 (Dieser Beitrag wurde zuletzt bearbeitet: 03.03.2011 16:22 von GerdW.)
RE: Zu SCHNELLES Auslesen einer Queue-Funktion ???
Ich habe das Problem nun folgendermaßen gelöst:
So kann ich nun sicher gehen, dass wenn kein neuer Wert in der Schleife ist, einfach der letzte vorhandene Wert genommen wird und nicht stattdessen eine Null eingelesen wird.
Sie Bilder im Anhang!
03.03.2011, 16:29 (Dieser Beitrag wurde zuletzt bearbeitet: 03.03.2011 16:34 von toaran_.)
RE: Zu SCHNELLES Auslesen einer Queue-Funktion ???
Hi
Warum lässt du nicht einfach 0 am timout eingang des DeQueue weg ... dann werden im diagramm auch nur die Werte angezeigt die du in den Q reinschreibst ... wenn nicht drinn steht wartet die schleife bis wieder was zum auslesen da ist ...
RE: Zu SCHNELLES Auslesen einer Queue-Funktion ???
(03.03.2011 16:29 )toaran_ schrieb: Warum lässt du nicht einfach 0 am timout eingang des DeQueue weg ... dann werden im diagramm auch nur die Werte angezeigt die du in den Q reinschreibst ... wenn nicht drinn steht wartet die schleife bis wieder was zum auslesen da ist ...
Ich denke auch, dass dies die bessere Variante ist (wie ich oben bereits gezeigt habe). Denn bei deiner Lösung
(03.03.2011 16:18 )Sternhagel schrieb: So kann ich nun sicher gehen, dass wenn kein neuer Wert in der Schleife ist, einfach der letzte vorhandene Wert genommen wird und nicht stattdessen eine Null eingelesen wird.
wird ja immer ein Wert mehrmals hergenommen, wenn du schneller liest. Ist das wirklich so gedacht?
Beste Grüße,
NWO
9 von 10 Stimmen in meinem Kopf sagen: Ich bin nicht verrückt,
die andere summt die Melodie von Tetris.
NI schrieb:To use the abort button is like using a tree to stop a car!
RE: Zu SCHNELLES Auslesen einer Queue-Funktion ???
(03.03.2011 16:18 )GerdW schrieb: Mit dem Übersetzen hast du es nicht so? "returns the element" TO YOU, but not to the queue...
Naja... dann ist halt die englische Hilfe etwas mißverständlich geschrieben :-) "returns the element" würde ich nie mit "das Element ausgeben" übersetzen sondern mit "das Element zurück geben" vor allem wenn im Satzteil davor explizit von "remove the element" gesprochen wird ... aber kann natürlich sein, dass "RETURN" für den Computerexperten tatsächlich "ausgeben" bedeutet... dafür bin ich nicht genug Fachmann :-)