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 benutze eine Queue um Steuerdaten für eine Heizrampe in mein Hauptprogramm einzufüttern. Ein Sub-VI erstellt diese Queue mit einem Element pro Sekunde und das Haupt-VI liest diese Queue dann im Sekundentakt ein. Das funktioniert auch alles soweit.
Ich benutze zum Auslesen die Funktion "Dequeue Element". Wenn die Warteschlange leer ist, dann soll das Programm mit dem letzten Wert der Queue weiterlaufen. Leider tut es das nicht, ich muß den Timeout des "Dequeue Element" auf >1 setzen, ansonsten hängt das Programm, was ja auch zu erwarten ist, weil es auf den nächsten Wert der Queue wartet. Leider ist im Fall des Timeout dann das letzte Element, das die Queue verläßt, Null.
Genau da brauche ich dann den letzten Wert der Queue. Ich habe es mit einem "Preview Element" versucht, laufe da aber auch wieder in das Problem des Timeout.
Naja du könntest dir immer das gerade entnommene Element in ein Schieberegister schreiben...und mit "Get Queue Status" guckst du, wieviele Elemente noch in der Queue sind...wenn das "Null" sind, nimmst du das zuletzt ins Schieberegister geschobene Element ...wenn nicht, führst du "Dequeue Element" aus und schreibst dieses Element ins Schieberegister!
"Is there some mightier sage, of whom we have yet to learn?"
"Opportunity is missed by most people because it is dressed in overalls and looks like work." (Thomas Edison)
Du mußt den Timeout=0 setzen und den Boolschen Ausgang abfragen, ob Timeout überschritten wurde.
Timeout nicht überschritten: es war zum Zeitpunkt der Abfrage mindestens ein Element in der Queue, alles ist OK.
Timeout überschritten: Es war zum Zeitpunkt der Abfrage kein Element in der Queue. Dann nimmst Du das vorhergehende Element aus dem Schieberegister. so wie vorgeschagen
Der Timeout = 0 muß angeschlossen werden, wenn auf das Kommen neuer Werte kein Verlass ist. Ohne Anschluß ist der Timeout -1 = unendlich und das kann zur Blockade führen.
Der Vorschlag von EG funktioniert so nicht, denn zum Zeitpunkt des Auslesens aus der Queue weißt Du ja noch nicht, ob bei der nächten Abfrage das reguläre nächste Element in der Queue ist oder nicht. Wenn ja, dann war das eingeschriebene Element überflüssig wie ein Kropf umd macht Probleme. Natürlich wäre das mit irgendeiner verqueren Logk alles wieder zurechtzubiegen, aber wozu der Aufwand.