Hallo,
Folgende Problemtatik: Eine Datenerfassung mit variabler Sample Rate soll mittels Diagramm/Graph visualisiert werden. Die schnellste Erfassungsrate sind 10kHz. Das sind ja immerhin 10000 Messwerte pro Sekunde.
Jetzt habe ich auf der Homepage von NI den Artikel über die Min Max Reduktion gelesen:
http://zone.ni.com/reference/de-XX/help/...data_sets/
Nur leider habe ich ihn noch nicht komplett verstanden. Was bedeutet denn da "Verbinden Sie die MIN und MAX Werte". Gibt es für diesen Artikel ein Codebeispiel?
Die Datenerfassung läuft über lange Zeit (Stunden). Welche Programmiertechnik wende ich hierfür am besten an um die Werte darzustellen? Sagen wir mein Graph/Diagramm ist 500 Pixel breit. Wie gehe ich da vor um die Daten so zu reduzieren, dass es genau die Information pro px anzeigt die nötig sind und gleichzeitig die Zeitachse mitläuft und aktualisiert?
Vielen Dank im Voraus!
Andy
Hallo Andy,
Zitat:Nur leider habe ich ihn noch nicht komplett verstanden. Was bedeutet denn da "Verbinden Sie die MIN und MAX Werte". Gibt es für diesen Artikel ein Codebeispiel?
Für einen 500px breiten Graph unterteilst du deine Daten in 2×500=1000 Intervalle (auf der X-Achse).
Für jedes dieser Intervalle berechnest du Min und Max und plottest alle Werte in einem Plot! (Im einfachsten Fall also ein Plot mit Min-Max-Min-Max-…)
Hi Gerd,
danke schon mal für Deine Hinweise. Ich hab mal was programmiert, von dem ich glaube, dass es die Guideline und Deine Empfehlungen erfüllt. Ich bekomme alle 20ms ein Array mit 200 Zeit/Spgs Wertepaaren. Daraus suche ich mir das Minimum und das Maximum und indiziere dazu den jeweiligen Zeitstempel. Die beiden Wertepaare hänge ich an die vorhandenen Messdaten des XY Graphen an. Der XY Graph hat eine Pixelbreite von 500px. Das heisst nach 10sec müssten dann genau 1000 Zeiten und 1000 Spannungen im Array sein. (500x2=1000 =>Pro Pixel 2 Wertepaare).Nach 10sec setze ich den Cluster aus Zeit und Wertearrays zurück, erhöhe die Skalierung und beginne bei 0.
Entspricht dies in etwa dem, was mit der Guideline und Deiner Empfehlung gemeint ist? Oder hab ich da noch einen Denkfehler.
Danke im Voraus für die Hilfe
Andy
Hallo Andy,
Zitat:Entspricht dies in etwa dem, was mit der Guideline und Deiner Empfehlung gemeint ist?
So in etwa schon.
Ich würde stark davon abraten, den XYGraph selbst als Datencontainer zu nutzen und ständig über Propertynodes abzufragen. Speichere die Daten stattdessen lieber in Feedbacknodes…
Außerdem könnte man das Pixelarray "rotieren", sodass immer die letzten 10s zu sehen sind, statt den Graph nach jeweils 10s zu leeren.
Hi Gerd,
das sind interessante Anmerkungen. Was meinst Du damit, wenn Du sagst ich soll das Pixelarray rotieren? Kannst Du mir erklären wie ich ein Array "rotiere"?
Die Performance der Operation ist auch eine Angelegenheit die ich nicht vernachlässigen möchte. Was ist denn aus Sicht der Performance die beste Art und Weise derartige Messwert Arrays für die Darstellung in XY Graphen zu verarbeiten?
Danke und Gruß
Andy
Hallo Andy,
Zitat:Was meinst Du damit, wenn Du sagst ich soll das Pixelarray rotieren? Kannst Du mir erklären wie ich ein Array "rotiere"?
Es gibt da eine Funktion namens "Rotate 1D array"!
Beispiel: Du hast ein Array mit 1000 Samples. Wenn ein neues Sample kommt, soll das älteste "vergessen" werden: einfach das Array um eine Position rotieren und das neue Sample überschreibt das älteste…
Zitat:Was ist denn aus Sicht der Performance die beste Art und Weise
Propertynodes abzufragen ist so ziemlich der langsamste Weg, um an Daten zu kommen.
Und üblicherweise sind Schieberegister/Feedbacknodes einer der schnellsten Wege, Daten zu speichern…
Hallo Gerd,
okay verstanden. Beides sehr gute Vorschläge, die ich implementieren werde. Damit betrachte ich das 10sec Diagramm als gelöstes Problem. Dies führt mich gleich zu einer neuen Frage:
Parallel zur Darstellung der Messwerte der letzten 10sec muss ich auch einen Graphen darstellen, der der einen Verlauf von T0(Startzeitpunkt) bis zum aktuellen Messwert visualisiert. Da es ja nicht möglich ist dies mit der vollen Datenmenge zu realisieren (genau wie das schon bei den 10sec Diagramm der Fall war) muss ich auch hier die dargestellte Datenmenge reduzieren.
In dem Falle ist rotieren offensichtlich die falsche Methode weil ich ja nicht nur die letzten x Werte darstellen möchte, sondern alle Werte minus x beliebigen Werten so dass es gerade noch genug Werte sind um alle relevanten Informationen darzustellen und gleichzeitig auch wieder nur 2 Werte pro Pixel zu haben (In meinem Fall dann ein Array mit 1000 Elementen Länge) um die Performance optimal zu gestalten.
Mir fehlt es noch an einer Idee, was für diese Applikation der optimale Algorithmus zur Reduktion der Datenmenge wäre. Vielleicht eine Min Max Reduktion auf größere Zeitintervalle (zB. 60Sec). Mittelwertbildung wäre auch eine Idee, aber dann verliere ich die Information über transiente Spitzen.
@Gerd und alle anderen: Was denkt Ihr darüber? Wie würdet Ihr an so eine Aufgabe rangehen?
Vielen Dank im Voraus und schon mal schönes Wochenende!
Andy
Hallo Andy,
Zitat:In dem Falle ist rotieren offensichtlich die falsche Methode weil ich ja nicht nur die letzten x Werte darstellen möchte,
Ja, richtig erkannt…
Folgende Idee:
Du startest mit dem Sammeln der Daten, sagen wir mal 1000 Samples. Dazu merkst du dir das dt der Daten.
1. Wenn das 1001. Sample kommt, rufst du eine Skalierroutine auf:
1a. Jeweils 2 bisherige Samples werden zusammengefasst (wie bisher schon geübt)
1b. gleichzeitig wird das dt verdoppelt
1c. du landest also bei 500 alten Samples mit 2*dt
2. jetzt musst du jeweils 2 neue Samples zusammenfassen und zu deinem Buffer hinzufügen
3. irgendwann hast du wieder 1000 Werte im Buffer: zurück zu Punkt 1, nur dass dann mit 4 statt 2 dt/Samples gerechnet werden muss.
Mit jedem Erreichen der Buffergröße fasst du größere Blöcke von Samples zusammen…
Das klingt jetzt nicht ganz so einfach, aber du musst schon etwas "Energie" investieren, wenn du quasi unbegrenzt Daten in deinem Graph anzeigen willst…
Hi Gerd,
ok verstanden. Der Ansatz gefällt mir gut.
Jetzt habe ich nur ein Problem bei der Angelegenheit: Die Sample Rate ist variabel und kann vom Benutzer zu jedem Zeitpunkt variiert werden (1Hz, 1kHz, 10kHz).
Das bedeutet ich habe kein festes sondern ein variables dt.
Übrigens: Ich habe das mit dem Rotieren ausprobiert. Aber ich verändere ja dadurch nur die Indizes der enthaltenen Werte. Ich möchte jedoch die Größe meines Arrays limitieren, damit dieses nicht unbegrenzt wächst. Ist da rotieren nicht die falsche Funktion?
Andy
Hallo Andy,
Zitat:Ich habe das mit dem Rotieren ausprobiert. Aber ich verändere ja dadurch nur die Indizes der enthaltenen Werte. Ich möchte jedoch die Größe meines Arrays limitieren, damit dieses nicht unbegrenzt wächst. Ist da rotieren nicht die falsche Funktion?
Wenn du mit RotateArray und ReplaceArraySubset arbeitest, kann sich die Arraygröße nie ändern.
Du musst es nur einmal per InitArray anlegen…