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!
mein VI zur Datenerfassung via serieller Schnittstelle macht Probleme:
Die Datenerfassung an sich klappt. Erfasst werden gleichzeitig mehrere Kanäle mit einem Messintervall von 2 s. Für jeden Messkanal werden Arrays u.a. eines für die Messdauer und eines für den Messwert angelegt und in einer Schleife mit Schieberegister fortlaufend gefüllt. Die Arrays werden also fortlaufend größer. Gleichzeitig erfolgt für jeden Kanal die Darstellung der beiden Arrays in einem xy-Graphen. Nach ca. 9 Stunden Messdauer (d.h. pro Kanal ca. 16.000 Messwerte) passiert folgendes: Für Kanal Nr. 1 (immer Kanal 1, unabhängig davon, für welchen Kanal die Messung als erstes gestartet wurde) startet die Messung im Minutentakt neu ohne dass ich den entsprechenden Knopf gedrückt hätte, während die übrigen Kanäle normal weiterlaufen. Zu diesem Zeitpunkt sind noch 1 GB physikalischer Speicher verfügbar. Die CPU-Auslastung nimmt mit steigender Messdauer kontinuierlich zu (ich vermute aufgrund der immer größer werdenden Arrays, die bei jedem Schleifendurchlauf durchgereicht werden?) und erreicht zu diesem Zeitpunkt ca. 66 %.
Was passiert hier? Warum startet ein Kanal ab einer gewissen Messdauer ständig neu? Läuft Labview-intern evtl. irgendwas über? Gibt es da irgendwelche Begrenzungen bzgl. Speicher o.ä.? Wie kann man Abhilfe schaffen?
Das VI ist für die langfristige Datenerfassung gedacht, d.h. die Messung soll u.U. über Wochen laufen. Insofern ist Abhilfe dringend notwendig.
Danke und viele Grüße
Tim
26.04.2012, 09:28 (Dieser Beitrag wurde zuletzt bearbeitet: 26.04.2012 09:30 von GerdW.)
erstens: VI anhängen.
zweitens: "Die Arrays werden also fortlaufend größer." klingt nach grob falscher Programmierweise für den geplanten Einsatzzweck "u.U. über Wochen laufen"...
drittens: Es gibt bei NI Tutorials zum Umgang mit großen Datenmengen. Die sind sehr lehrreich...
ich hab das VI jetzt mal auf das wesentliche und nur einen Kanal reduziert (s. Anhang). Ich bin mir sicher, dass man das VI für die vorgesehene Aufgabe wesentlich eleganter gestalten kann - das ist halt jetzt meine bisherige Lösung als LV-Anfänger im Rahmen meiner Möglichkeiten (ist mein erstes LV-Projekt).
Wie lassen sich die erhobenen Messdaten (Masse in Abhängigkeit der Messdauer, Darstellung seit Beginn der Messung) denn ressourcenschonender als über Arrays und einen xy-Graphen darstellen? Insbesondere vor dem Hintergrund, dass die Zeitspanne zwischen zwei Messpunkten leicht variiert (d.h. ein Kurvendiagramm mit festem Deltat wäre wohl - insbesondere bei Langzeitmessungen - nicht empfehlenswert). Ich möchte einfach nur die Daten, die auch fortlaufend in die Datei geschrieben werden, graphisch darstellen. Arrays und ein xy-Graph scheint für eine Langzeitmessung ja nicht die richtige Wahl zu sein.
Ich habe bei NI mal nach Informationen bzgl. großer Datenmengen gesucht, bin bislang aber nicht fündig geworden...
Prinzipiell hast du die korrekte Problemstelle erkannt (Zitat: Diese Arrays werden immer größer ...).
Genau hier musst du ansetzen.
Es ist bei einer Langzeitmessung je nach Messrate einfach nicht machbar, alle Messwerte in einem Graphen anzuzeigen. Irgendwann ist der Speicher des Rechners voll.
Außerdem verbraucht die Anzeige von sehr vielen Messwerten in einem XY-Graphen viel Rechenzeit, das kann schon mal dazu führen, dass der UI-Thread mehr als 1 Sekunde ausgelastet ist, und entsprechend lange steht dann das gesamte Programm.
Die Standard-Lösung lautet "Ringpuffer" oder auch "Ringspeicher". Konkret: Du setzt dir eine Maximalanzahl an Messpunkten, die du im XY-Graphen anzeigen willst, und wenn du an dieser Maximalanzahl angekommen bist, werden zu alte Messwerte verworfen und die Neuesten hinzugenommen.
Alternativ, wenn du wirklich alles anzeigen willst, dann musst du von Anfang an die Anzahl der Messwerte im Speicher reduzieren, indem du z.B. nur jeden 10. oder 100. Messwert anzeigst.
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
vielen Dank für die Hinweise. Da stets der Verlauf der Messwerte seit Messbeginn von Interesse ist, hab ich's jetzt folgendermaßen gelöst:
In Schleife 2 habe ich die besagten Arrays, welche im Fortgang der Messung immer größer wurden, völlig weggelassen, d.h. diese Arrays und die zugehörigen Schieberegister entfernt. Sie dienten ja ohnehin nur der graphischen Anzeige der Messwerte. Stattdessen lade ich nun die Messwerte, welche ja kontinuierlich in eine .txt-Datei geschrieben werden, auf Knopfdruck in Arrays, um sie im xy-Graphen anzuzeigen. Außerdem habe ich eine Funktion integriert, die diese Arrays und damit den xy-Graphen auf Knopfdruck leert. Auf diese Weise kann ich den beanspruchten Speicherbedarf gering halten. Außerdem waren noch einige Queues vorhanden (s. Schleife 1 und 2), die ich nicht sauber konfiguriert bzw. geleert hatte und die deshalb immer größer wurden. Das hab ich jetzt auch noch geändert. Was darüber hinaus noch zu Peaks in der CPU-Auslastung geführt hat, war Microsoft Security Essentials. Nachdem ich LabView und die entsprechenden Dateien von der Prüfung ausgenommen habe, bleibt die CPU-Auslastung konstant gering.