LabVIEWForum.de - XY Graph wärend der VI Ausführung aktualsieren

LabVIEWForum.de

Normale Version: XY Graph wärend der VI Ausführung aktualsieren
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,

ich habe zwei Anliegen:

Anliegen 1:
Ich lese in einer Whileschleife Daten aus einem FIFO, die ich per "Array erstellen" mit jedem Schleifendurchgang per Schieberegister hintereinander hänge.
Ich würde gerne die neuen Werte in meinem Plot direkt anzeigen. Da ich pro Schleifendurchgang mehrere Werte aus dem FIFO lese macht auch eine Verzögerung nichts. Nur, dass ich gerne ein paar mal pro Sekunde den Plotverlauf checken wollen würde. In der Grafik kann man sehen, dass ich erst nach der Schleife dann alle Daten gleichzeitig plotte.

Anliegen 2:

Ich kann mir vorstellen, dass das Array durch Schieberegister durch die Gegend zu schieben mit höherer Datenanzahl ziemlich Rechenaufwendig ist und würde gerne eine elegantere Alternative erfragen falls meine Vermutung korrekt ist.


Danke schonmal für er Hilfe und ich hoffe, dass Anliegen 2 nicht im falschen Forum steht. sonst gerne einfach löschen.

Gruß

knulf
Hallo knulf,

die VIs wie "Array erstellen"/"Build Array" oder "In Array einfügen"/"Insert Into Array" mit großen Arrays sollte man nie in Schleifen aufrufen, schon gar nicht in Real-Time-Anwendungen. Bei jedem Einfügen wird das gesamte Array in einen neuen Speicherbereich kopiert. Auf Real-Time-Anwendungen kann es bei großen Arrays aufgrund der Fragmentierung sogar zu einem vermeintlich "vollen" Speicher kommen, obwohl der Speicher fast leer, jedoch sehr fragmentiert ist. Der neue Speicherbereich muss immer zusammenhängend sein, damit ein Array kopiert werden kann.
Genug der Theorie.

Kannst du von vornherein festlegen, wie groß dein Array maximal sein wird?
Beispiel: Max. Messdauer: 30 Sekunden, Abtastrate: 100 Hz
Das macht dann max. 30 s * 100 Werte/s = 3000 Werte

In dem Fall kannst du her gehen und über das VI "Array initialisieren" ein Array mit der Größe 3000 erstellen. Dann wird einmalig Speicher zugewiesen. In der Schleife selbst machst du es genau wie oben mit dem Schieberegister, jedoch mit dem VI "Teil-Array ersetzen".
Dann werden die Elemente ersetzt und es muss kein Speicher zugewiesen werden, was dann natürlich deutlich schneller geht und nebenbei noch deterministisch ist.

Den Graphen kannst du auch innerhalb der Schleife aktualisieren, indem du dein Gebilde im unteren Teil in die Schleife packst (z.B. per Sub-VI, um die Übersicht zu erhöhen). Ist es nicht erforderlich, den Graphen in jedem Schleifendurchlauf zu aktualisieren (das kostet massiv Performance), kannst du das z.B. auch alle 250 ms oder alls x Schleifendurchläufe veranlassen. Dazu musst du dann eine entsprechende Case-Struktur einbinden.

Für die untere Schleife gilt das mit dem Array natürlich auch. Es ist immer schlecht, fortlaufend dynamisch Speicher zuzuweisen.
Das Signalverlaufsdiagramm hat ja bereits einen eingebauten Buffer, das kannst Du mit neuen Einzelwerten in einer Schleife ständig aktualisieren und muß Dir nicht mit selbstgebastelten Schieberegistern und Ringpuffern die Sache erschweren.
Und für die XY-Darstellung gibt es ein entsprechendes VI auch. Es nennt sich "Express XY Graph". Probiers einfach mal aus. Ich nehme das in solchen Fällen, auch wenn ich sonst kaum Express-VIs verwende.
Das gehört dann natürlich in die Schleife rein, in der die Daten entstehen, und nicht außen hin so wie bei Dir jetzt.
Danke für die schnelle Hilfe. Bin aber heute erst wieder an mein Problem zurück gekommen.

Zitat:Und für die XY-Darstellung gibt es ein entsprechendes VI auch. Es nennt sich "Express XY Graph".

Ich finde ein solches Express VI nicht.

Ich benutze LV 8.6

Kannst du mir, wenn es in der Version vorhanden ist, sagen wo ich es finde? (Suchfunktion habe ich schon benutzt)

An sonsten ist das was ich da mache aus dem Beispiel XY Graph.vi übernommen.

Gruß

knulf
Zitat:Das Signalverlaufsdiagramm hat ja bereits einen eingebauten Buffer, das kannst Du mit neuen Einzelwerten in einer Schleife ständig aktualisieren und muß Dir nicht mit selbstgebastelten Schieberegistern und Ringpuffern die Sache erschweren.
Und für die XY-Darstellung gibt es ein entsprechendes VI auch. Es nennt sich "Express XY Graph". Probiers einfach mal aus. Ich nehme das in solchen Fällen, auch wenn ich sonst kaum Express-VIs verwende.
Das gehört dann natürlich in die Schleife rein, in der die Daten entstehen, und nicht außen hin so wie bei Dir jetzt.

Ich habe jetzt versucht das "Express XY Graph" VI einzubinden. Bekomme aber Probleme mit der Datenform.
Ich habe bzgl. der Datenformen noch nicht viel gearbeitet und sitze deshalb gerade auf dem Trockenen.

Mein Problem ist folgendes:

Mein FPGA schreibt mit jedem Schleifendurchlauf 4 Werte in das FIFO [Schleifenzähler, Wert 1, Wert2, Wert3].
Ich lese nun alle x ms Werte aus dem FIFO, die ich dann per 1 D Array dezimieren in 4 1D arrays aufsplitte.
Ich würde gerne nun die 3 Werte zusammen gegenüber dem Schleifenzähler auftragen.

Wie bekomme ich denn nun die Arrays in ein Format, das ich dem Entsprechenden VI füttern kann?
Bisher habe ich die Funktion benutzt wie oben in dem angehangenen Bild.

Ich habe mich damit selber nicht auseinander gesetzt, da dies meine letzten Fragen kurz vor Feierabend sind, deshalb wäre es eine nette Geste wenn mir jemand Denkanstöße geben kann. Da ich aber nicht verlangen kann, dass ihr meine Arbeit macht würde ich es wohl verstehen wenn ihr Euch noch nicht äussertSmile.
Wenn ich mich weiter damit beschäftigt habe und ein wenig rumgesucht habe melde ich mich wieder mit Fragen die ich nicht durch Recherche beantwortet bekomme.

Gruß
Knulf
Hallo nochmal,

ich bin jetzt soweit, dass ich meine Daten mittels XY Expres VI dargestellt bekomme.
Gibt es nun eine Möglichkeit meine Daten in Text/Tabellenform abzuspeichern?

Ich habe da mal einen Versuch unternommen das in der Schleife zu machen. Dabei speichere ich aber meine Daten-Arrays als Arrays und es läuft so schon nicht mehr flüssig. Liegt das daran, dass ich eine schlechte Möglichkeit genutzt habe meine Daten zu speichern? Oder ist Speicherzugriff in einer Echtzeitanwendung grundsätzlich mit mehr Zeit zu bedenken? Und wenn ich nun mittels For-Schleife die Array-Werte noch auseinander ziehe, würde das sicher nicht den Ablauf beschleunigen...

Zitat:Ist es nicht erforderlich, den Graphen in jedem Schleifendurchlauf zu aktualisieren (das kostet massiv Performance), kannst du das z.B. auch alle 250 ms oder alls x Schleifendurchläufe veranlassen. Dazu musst du dann eine entsprechende Case-Struktur einbinden.

Ich hoffe die Case Struktur sinnvoll gelöst zu haben.

Schaut mal bitte kurz drüber.


Gruß

Knulf
Wenn Du während der Datenerfassung nur einen Teil der Werte sehen willst, sagen wir die letzten 1000 Wert, um festzustellen, dass etwas aufgenommen wir, bietet sich der Waveform Chart an. Hier kann in jedem Schleifendurchlauf ein neuer Wert reingeschrieben werden. LabView übernimmt, so weit ich weiß, die Aktualisierung des Waveform Charts zu vernünftigen Zeitpunkten. Es wird also nicht bei jedem Wert das komplette Diagramm neu gezeichnet.
Referenz-URLs