LabVIEWForum.de
Array in der Whileschleife begrenzen - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Array in der Whileschleife begrenzen (/Thread-Array-in-der-Whileschleife-begrenzen)



Array in der Whileschleife begrenzen - joe1234 - 21.05.2008 13:40

Hallo,

ich habe mir ein Programm gebastelt indem ich ein Array in einer While-Schleife durch Indizierung schiebe und durch weitere Werte ergänze. Nun sind es ziehmlich viele Werte (pro 120ms 12 Werte!!!) und ich wollte mal wissen, ob es möglich wäre so ein Array zu begrenzen?

Bsp.
Grenzwert = 800 Werte
While - Schleife läuft solange bis die 800 Werte im Array vollgeschrieben sind. Danach soll der erste Werte entfernt werden und der Neue hinzugefügt werden (also einfach schieben und der älteste (erste) Wert fällt dann raus), aber das "Fenster" über die 800 Werte sollte dann immer bestehen.

Ich hoffe, das Bsp ist verständlich.

Gruß Joe


Array in der Whileschleife begrenzen - oenk - 21.05.2008 13:57

Du meinst wohl einen Ringpuffer, oder?
Such mal im Forum, da wirst du sicher einiges finden....

Gruss,
Christian


Array in der Whileschleife begrenzen - Lucki - 21.05.2008 14:49

Meines Wissesn nach - bitte korrigiert mich, wenn ich mich irre - gíbt es keinen Rinpuffer als fertiges VI, es ist Handarbeit angesagt.
Ein supereinfache (wenn auch nicht unbedingt die schnellste) Lösung ist aber die: Das Signalverlausfdiagramm enthält intern einen Ringpuffer. Einfach die Histrorylänge auf 800 vorgeben und die anfallenden Daten in das Diagramm geben. Mit dem Eigenschaftsknoten "History" lassen sich die letzten 800 Datenpunkt jederzeit zurücklesen. Falls die Daten nicht gesehen werden müssen, aus dem Diag ein verborgenes Element machen.


Array in der Whileschleife begrenzen - jg - 21.05.2008 19:17

Schon mehrfach hier verlinkt:

http://forum.ib-berger.com/index.php?showtopic=92

MfG, Jens


Array in der Whileschleife begrenzen - Lucki - 21.05.2008 22:26

' schrieb:Schon mehrfach hier verlinkt:
Interessant. Zum Vergleich habe ich diese Demo gleich mal modifiziert. Funktional gleich, aber mit "missbräuchlicher Verwendung" eines Signalverlaufsdiagramms als Ringpuffer.
Lv85_img [attachment=12632]


Array in der Whileschleife begrenzen - joe1234 - 26.05.2008 14:50

Erstmal Danke für eure Beispiele!
Aber irgendwie habe ich ein Problem diesen Ringpuffer einzubauen. Mein VI sieht so aus:

[attachment=12685]

Es handelt sich hier um diese 13 Arrays im SGL-Format. Diese werde in Abhängigkeit von der ID in den jeweiligen Array geschrieben. Den Ringpuffer müsste ich ja in jedes Case einbauen, oder? Wenn ich das realisiere mit dem Bsp von Lucki, dann wird mein VI extrem langsam. Das Bsp von Jens kann ich irgendwie gar nicht einbauen!
Kann da jemand helfen oder zumindest sagen, warum mein VI so langsam wird?


LV8.5
[attachment=12686]

Hier ist noch mein VI. (Wahrscheinlich werden nicht alle SubVIs erkannt!)


Array in der Whileschleife begrenzen - RoLe - 26.05.2008 15:51

' schrieb:Meines Wissesn nach - bitte korrigiert mich, wenn ich mich irre - gíbt es keinen Rinpuffer als fertiges VI, es ist Handarbeit angesagt.

Zur Info, hier gibt es Ringpuffer Beispiele:
C:ProgrammeNational InstrumentsLabVIEWexamplesgeneralglobals.llb


Array in der Whileschleife begrenzen - joe1234 - 26.05.2008 16:19

' schrieb:Zur Info, hier gibt es Ringpuffer Beispiele:
C:ProgrammeNational InstrumentsLabVIEWexamplesgeneralglobals.llb


Danke. Ich schaue es mir heute abend mal an.

Gruß Joe


Array in der Whileschleife begrenzen - Lucki - 26.05.2008 18:06

' schrieb:Hier ist noch mein VI. (Wahrscheinlich werden nicht alle SubVIs erkannt!)
Also aus Deinem Bild werde ich nocht richtig schlau. Aber selbstverständlich brauchst Du den Ringpuffer nicht mehrere Male. Einfach alle Elenete die gepuffert werden sollen als Cluster zusammenfassen.
Auch Deine ganz oben beschriebene Aufgabenstellung ist zwar klar, aber unvollständig. Klar ist, daß Du die Werte in den Puffer lesen willst und nur die letzten 800 Werte zu behalten wünschst. Was aber dann mit den Werten weiter geschehen soll, sagst Du nicht. Willst Du den geamten Puffer lesen und ihn dabei jedesmal leeren? Willst Du ihn lesen, ohne ihn zu leeren? Willst Du das älteste Element lesen und dabei aus dem Puffer entfernen. (Es ist bei Puffern üblich, daß das was gelesen wird aus dem Puffer entfernt wird)-

Erfreuliche Nachricht: Ich habe über das Thema Ringpuffer nochmal nachgedacht und bin jetzt glaube ich zur besten Lösung gekommen. Vergiss also das Signalverlausfsdiagramm, wenn Du die Daten nicht ständig sehen willst.
Die Methode ist, Queues als Puffer zu "missbrauchen". Habe mal ein passendes VI gemacht, sicherheitshalber mit allen obengenannten Methoden des Lesens.
Tip: Kein Horror vor Queues. es ist etwas ganz Einfaches, mit einer Stunde Lesen der Hilfe für die wenigen Funktionen hat man es darauf.
Lv85_img[attachment=12688]
Und für Vergleichstudien hier die Rinpuffer-Demo von ib-Berger, umgestellt auf Queues:
Lv85_img[attachment=12689]


Array in der Whileschleife begrenzen - joe1234 - 28.05.2008 13:26

' schrieb:Also aus Deinem Bild werde ich nocht richtig schlau. Aber selbstverständlich brauchst Du den Ringpuffer nicht mehrere Male. Einfach alle Elenete die gepuffert werden sollen als Cluster zusammenfassen.
Auch Deine ganz oben beschriebene Aufgabenstellung ist zwar klar, aber unvollständig. Klar ist, daß Du die Werte in den Puffer lesen willst und nur die letzten 800 Werte zu behalten wünschst. Was aber dann mit den Werten weiter geschehen soll, sagst Du nicht. Willst Du den geamten Puffer lesen und ihn dabei jedesmal leeren? Willst Du ihn lesen, ohne ihn zu leeren? Willst Du das älteste Element lesen und dabei aus dem Puffer entfernen. (Es ist bei Puffern üblich, daß das was gelesen wird aus dem Puffer entfernt wird)-

Hi Lucki,
erstmal großes Danke für deine Mühen und Ideen!!!
Mein Ziel ist es, ein Programm mit LV zu schreiben, mit dem ich meinen USB-to-CAN von IXXAT auslesen kann. Dabei ist es wichtig, dass ich die Werte gemäß der ID zuordnen kann. Später will ich einfach eine Tabelle ausgeben können, die aus ausgewählten IDs besteht. Also wenn ich ID 1,2,3 und 4 anwähle, soll meine Tabelle auch aus ID 1,2,3,4 bestehen. Diese Werte will ich dann abspeichern können.
Das war ungefähr die grobe Beschreibung von meinem Ziel.
Aus meinem VI kann man erkennen, dass nach jedem While-Schleifendurchlauf genau 1 Cluster (besteht aus: ID, Timestamp, Data...) gelesen wird. Dabei werden alle 120 sec. (erkennbar am Timestamp) 13 Werte und zwar hintereinander ausgegeben (der Cluster überschreibt bei jeden Durchlauf seine Werte). In meinem VI habe ich deshalb eine Case-Struktur gemacht, die je nach ID den Wert in den passenden Array hineinschreibt, somit kann ich meine ausgelesenen Werte später nutzen (Darstellen, Speichern, evtl. Zeichnen). Nun werden die Arrays natürlich nach kürzester Zeit riesig und dies wollte ich durch einen Ringbuffer auf ca. 8000 (sollte einstellbar sein) Werte pro ID begrenzen, damit ich das Programm auch mal über Nacht laufen lassen kann, ohne dass mir meine PC "abschmiert".
Bevor ich die Werte in meine Arrays hineinschreibe, rechne ich sie noch um.
Ich hoffe, nun ist die Sache etwas klarer. Die Werte möchte ich also auf keinen Fall aus dem Ringbuffer löschen. Ich möchte lediglich die Werte in einer Tabelle darstellen und bei Bedarf abspeichern.

Hier habe ich noch einen Ringbuffer gefunden:
LV8.5
[attachment=12730]

Dieser ist eingentlich das was ich gesucht habe. Problem ist nur: ich kann nur einzelne Werte abspeichern und dann als Array ausgeben.

Die Idee mit dem Cluster-Ringbuffer ist ziehmlich gut. Denn dann würde ich ja nur einen Ringbuffer für alle Arrays benötigen!
Ich mache mir mal kurz Gedanken und werde mich dann später melden.

Gruß Joe
Ich benötige jedoch, dass ich einen 1D-Array abspeichere und dann einen 2D-Array (enthalten viele 1D-Arrays) ausgebe.