LabVIEWForum.de
LIFO wie realisieren? - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: LIFO wie realisieren? (/Thread-LIFO-wie-realisieren)



LIFO wie realisieren? - DoubleU - 07.09.2006 09:33

Hallo,

ich möchte einen LIFO in LabVIEW realsieren, bei dem ich immer Werte anfügen kann - jedoch nur eine definierte Anzahl darin enthalten bleibt. Wird lesend auf den Fifo zugegriffen sollen z.b. die letzten Werte der reihe nach (last in first out) abgegirffen werden.

Es gibt ein Beispiel in LabVIEW (Suche:Fifo) mit Message Queues, der Ansatz gefällt mir ganz gut. Das Problem dabei ist jedoch: Ist die Message Queue voll, kann kein Weiteres Element angefügt werden, bei mir soll jedoch einfach das älteste überschrieben werden.

Ich weiss das das ganze mit Shiftregister sehr leicht funktioniert, jedoch ist die Performance dabei nicht ideal, da immer meine ganzen Daten wieder "durchgeschoben" werden, obwohl ich nur auf ein Array Element zugreifen will. Ich bräuchte mehr LIFOS die ich zur Laufzeit dynamisch erzeugen kann. Bei Message queues wäre das ja in einer for-Schleife möglich...

Gruss
Uli


LIFO wie realisieren? - Kvasir - 07.09.2006 11:27

Was du machen könntest wäre, den Case abfangen, dass die Queue voll ist und dann das älteste Element aus der Queue löschen um für das neue Platz zu machen.

Die volle Queue abzufangen geht ganz einfach. Einfach einen Timeout beim schreiben setzen. Wenn dieser überschritten wird, dann weil die Queue voll ist.
Schwieriger ist es das älteste Element aus der Queue zu löschen. Dazu hab ich keine Funktion gefunden. Habe dir also ein kleines SubVi geschrieben, was genau das erledigt.
Ob das Performance mäßig dann besser ist als eine Schieberegister weiß ich nicht. Allerdings startet dieses SubVi ja nur, wenn die Queue voll ist.

Hab dir auch ein kleines Beispiel angehängt, wie du das SubVi in etwa verwenden könntest. Ist allerdings nicht sonderlich schön.

Gruß


LIFO wie realisieren? - DoubleU - 07.09.2006 11:56

Danke, sowas könnte funktionierenSmile
Im Normallfall wird die Queue nicht voll, nur im Fehlerfall, und schnell soll das ganze nur im "Normallfall" sein. D.h. es ist auf jeden Fall für mich intressant.

Gruss
Uli

Edit:

' schrieb:Schwieriger ist es das älteste Element aus der Queue zu löschen. Dazu hab ich keine Funktion gefunden. Habe dir also ein kleines SubVi geschrieben, was genau das erledigt.
?? Muss man nicht einfach Dequeue element aufrufen um das älteste zu löschen, so hab ich mir das gedacht...


LIFO wie realisieren? - Kvasir - 07.09.2006 12:45

Hmm also wenn ich dich richtig verstanden habe, soll dein Programm folgendes machen:
- Die neuesten Einträge der Queue als erstes abarbeiten (Lifo)
- Wenn die Queue voll ist, das älteste löschen und das neue reingeben.

Dequeue liest nun immer das vorderste Element aus der Queue aus.
Um deinen Lifo zu realsieren hängst du also neue Elmente an den Anfang der Queue (Element am Anfang einfügen), damit sie auch als erstes wieder ausgelesen werden.

Ist deine Queue nun voll willst du aber nicht ein Element vom Anfang löschen (dequeue), sondern das älteste, also das ganz hinten.
Und genau das macht mein SubVi. Es liest alle Einträge aus, löscht den letzten und schreibt die Restlichen wieder in der gleichen Reihenfolge in die Queue. Es ist sozusagen ein Workaround dafür, dass LabVIEW keine Funktion hat um bestimmte Postionen in der Queue auszulesen (zumindest kenn ich keine).


LIFO wie realisieren? - DoubleU - 07.09.2006 13:25

JA richtig,

inzwischen hab ich einen anderen Entwurf mit einem FIFO zum testen realisiert, da hab ich es so gemacht. Hab ganz vergessen das es um LIFO gingWink. Im Prinzip müsste LabVIEW einfach noch ein VI zur verfügung stellen dequeue at opposit end.

Gruss
Uli


LIFO wie realisieren? - Kvasir - 07.09.2006 13:57

Jep. genau diese Funktion fehltSad
Macht aber nix, mein kleines SubVi macht das wieder wett. Klingt komisch, is aber so ...Wink