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!
03.02.2011, 09:02 (Dieser Beitrag wurde zuletzt bearbeitet: 03.02.2011 09:07 von Meinhart_E.Steil.)
Wie ihr im Anhang ersehen könnt, plotte ich mir Graphen in zwei Diagramme. Hierbei ist die Anzahl der Graphen sowie die Anzahl der Messpunkte zufällig gewählt. So wie es bei einer realen Messreihe sein könnte. Vorallem auf die Anzahl der Messpunkte je Messung habe ich keinen Einfluss.
Dabei plottet mir das eine Diagramm XY-Graphen, während die Messreihe noch läuft (Das macht z. B. Sinn, wenn meine Messungen 10h laufen und ich die angefallenen Graphen währenddessen vergleichen will (auch farblich)). Und das andere Diagramm gibt mir alle Graphen am Ende der Messreihe wieder (was ich eigentlich nicht möchte).
Zum Problem: Das Ganze ist nicht elegant programmiert. Das kann man daran erkennen, dass, wenn ich die Anzahl der Messungen und Messpunkte signifikant erhöhe, mir der Speicher vollläuft. Wie kann ich geschickt die Graphen in "ein" Array platzieren?
Bitte könnt Ihr Lösungsvorschläge inlv86senden (an der Uni haben wir nur 8.6)
LG Marcel
Edit: Sorry, wenn das hier thematisch nicht ganz passt.
Das Volllaufen des Speichers ist im XY-Express-Graph von NI schlichtweg so vorprogrammiert. Der XY-Express-Graph funktioniert ja wie das Signalverlaufsdiagramm. d.h. er vergißt die alten Werte nicht, wenn man neue Punkte hinzufügt. Während aber aber beim SV-Diag. ein Ringpuffer mit einstellbarer Historienlänge zuständig ist und damit der Speicher in der Länge begrenzt ist, fehlt so etwas beim Express-Graph. Wenn man den nicht ab und zu rücksetzt, wird es bei genügend langem kontinuierlichem Betrieb immer zum Pufferüberlauf kommen.
03.02.2011, 11:39 (Dieser Beitrag wurde zuletzt bearbeitet: 03.02.2011 11:40 von Meinhart_E.Steil.)
Das ist ja richtig, sehe ich auch vollkommen ein. Ich glaube aber nicht, dass dies hier das Problem ist. Das Problem ist eher was an den XY-Express-Graph übergeben wird.
Also wenn ich 1000 Messungen mit 1000 x und y Werten generiere, habe ich, wenn ich mein Programm richtig verstehe, 1000 Arrays mit 1000 Spalten x 1000 Werten (und in einer einzigen Spalte steht was anderes drin als null). Klar geht da der Speicher in die Knie.
Mir gehts halt darum, wie ich es anders machen kann.
' schrieb:wenn ich mein Programm richtig verstehe, 1000 Arrays mit 1000 Spalten x 1000 Werten (und in einer einzigen Spalte steht was anderes drin als null).
[*OhneKommentar*]
Pack die einzelnen Arrays, also die einer (1) Messung in ein Cluster. Der Graph kann Array of Cluster of Messung(X,Y) anzeigen. Die Cluster-Variante hat den Vorteil, dass die einzelnen Arrays (die der Messung) unterschiedlich lang sein können.
Kommt mein Muster deinen Wünschen irgendwie nahe?
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Ich weiß auch nicht, worauf das Progamm hinausläuft, insbesondere was die Sache mit den vielen Nullen betrifft.
Ein Express-Graph macht hauptsächlich Sinn, wenn man im Programm bereits das Datenfomat "Signal" als Output von anderen Express-VIs hat. Hier jedoch würde ich die Verwendung normaler Graphen empfehlen. Bei äquidistantem dt müßte es übrigens kein XY-Graph sein - man spart dann die Hälfte an Speicherplatz.
Es gibt bei jedem Graphentypen mehrere mögliche Eingabefomate. Beim XY-Graph ist ein Plot entweder ein Cluster aus X-und Y-Array, oder aber ein Array aus Punkten (Punkt = Cluster [x;y]). Bei mehrere Plots können die Plotlängen aber in beiden Formaten unterschiedlich sein, IchSelbst hat in dieser Hinsicht nicht ganz recht. Das Punktformat ist logisch klarer, aber leider fallen die Daten meist nicht dieser Form an, so daß man mit dem anderen Format meist etwas weniger Code hat.
NB: Ein Graph ist ein FP-Element und kann mehrere Plots enthalten. Ein Satz wie ".. die bei der Messung anfallenden Graphen.." tut meinen Augen schon sehr weh.
' schrieb:Ich weiß auch nicht, worauf das Progamm hinausläuft, insbesondere was die Sache mit den vielen Nullen betrifft.
Der Anwender hat nicht bedacht, dass das Aneinanderreihen von Arrays bewirkt, dass die bereits bestehenden Arrays entsprechend erweitern werden. Daher kommen die vielen Nuller. LV kennt keine 2D-Arrays mit unterschiedlichen Längen in der zweiten Dimension.
Ein Aneinanderreihen ist natürlich in so fern sinnvoll, weil die einzelnen Messungen aneinandergereiht werden sollen - zweck gleichzeitiger Anzeige. Die Frage ist eben wie macht man das am geschicktesten: Beschreibung lesen, welches Datenformat ein Graph kann. In einem Falle wie diesem wird wohl alles auf ein Array of Cluster hinauslaufen (ob nun Cluster of (Arr,Arr) oder Cluster of (Xo,dX,YArr) überlass ich mal dem Anwender).
Noch ein Gedanke:
Für eine Onlineanzeige ist ein Graph eigentlich schlechter als ein Signalverlauf. Bei einem Graph muss man immer alle Daten an das Element übergeben. Das heißt aber, dass die Daten im eigenen Programm aufsummiert werden müssen (Schieberegister und Array-Addition). Einem Signalverlauf muss man immer nur die aktuellen Daten übergeben. Der macht dann das Aufsummieren selbständig. (Ob ein Signalverlauf im vorliegenden Falle überhaupt geeignet ist, muss noch entschieden werden)
Und dass man Express-VIs nicht verwenden soll, muss ich ja nicht mehr sagen.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Vielen Dank für die Lösung. Obwohl ich immer noch nicht nachvollziehen kann, was ich wirklich gemacht habe? Habe das jetzt so verstanden, dass ich ein bestehendes Array fortwährend erweitere und dazu ein neues Array erstellen.
Muss das Ganze noch mal auf mich wirken lassen.
ALso vielen Dank nochmals für die Lösung
VG Marcel
PS: Die aktuelle Messung lasse ich mir natürlich auch in "Echtzeit" mittels Signalverlauf zeigen
03.02.2011, 17:51 (Dieser Beitrag wurde zuletzt bearbeitet: 04.02.2011 07:38 von Lucki.)
' schrieb:Noch ein Gedanke:
Für eine Onlineanzeige ist ein Graph eigentlich schlechter als ein Signalverlauf. Bei einem Graph muss man immer alle Daten an das Element übergeben. Das heißt aber, dass die Daten im eigenen Programm aufsummiert werden müssen (Schieberegister und Array-Addition). Einem Signalverlauf muss man immer nur die aktuellen Daten übergeben. Der macht dann das Aufsummieren selbständig. (Ob ein Signalverlauf im vorliegenden Falle überhaupt geeignet ist, muss noch entschieden werden)
Man beachte auch die weiteren Unterschiede von Graph und Diagramm:
Graph: Plotpunkte äquidistant (dT=konst), aber jeder Plot kann anderes t0, dt und andere Länge haben.
Diagr: jeder Plotpunkt kann anderes t0 (dt nicht äquidistant) haben, aber bei mehreren Plots müssen die Punkte aller Plots übereieinanderliegen (gleiches t) und die Plots gleiche Länge haben.
Graph: Kursoren möglich. Stapelplot nicht möglich
Diagr: Kursoren nicht möglich, Stapelplot möglich.
' schrieb:Es gibt bei jedem Graphentypen mehrere mögliche Eingabefomate. Beim XY-Graph ist ein Plot entweder ein Cluster aus X-und Y-Array, oder aber ein Array aus Punkten (Punkt = Cluster [x;y]). Bei mehrere Plots können die Plotlängen aber in beiden Formaten unterschiedlich sein
NB: Ein Graph ist ein FP-Element und kann mehrere Plots enthalten. Ein Satz wie ".. die bei der Messung anfallenden Graphen.." tut meinen Augen schon sehr weh.
' schrieb:Der Anwender hat nicht bedacht, dass das Aneinanderreihen von Arrays bewirkt, dass die bereits bestehenden Arrays entsprechend erweitern werden. Daher kommen die vielen Nuller. LV kennt keine 2D-Arrays mit unterschiedlichen Längen in der zweiten Dimension.
Ein Aneinanderreihen ist natürlich in so fern sinnvoll, weil die einzelnen Messungen aneinandergereiht werden sollen - zweck gleichzeitiger Anzeige. Die Frage ist eben wie macht man das am geschicktesten: Beschreibung lesen, welches Datenformat ein Graph kann. In einem Falle wie diesem wird wohl alles auf ein Array of Cluster hinauslaufen (ob nun Cluster of (Arr,Arr) oder Cluster of (Xo,dX,YArr) überlass ich mal dem Anwender).