INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

schnelle+kontinuierliche Datenerfassung: Speicherproblem



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!

01.10.2010, 18:46
Beitrag #1

mh10 Offline
LVF-Neueinsteiger


Beiträge: 6
Registriert seit: Oct 2010

10.0 (32 bit)
-
de

.
Deutschland
schnelle+kontinuierliche Datenerfassung: Speicherproblem
Hallo,

zuerst eine kleine Beschreibung was ich machen will:
Ich möchte einen (oder später mehrere) analogen Eingang (+- 10 V, Kraftmessung) sowie einen Zähler (digitaler Zähler, A/B Signal zur Positionsbestimmung) zusammen, also zeitgleich, mit etwa 10 kS/s kontinuierlich aufzeichnen. Dazu verwende ich einen A/D Wandler der per USB angeschlossen ist (NI USB-6221; M-Serie, 16 bit, 250 KS/s).

Mein Problem ist die Speichernutzung, sowie die Geschwindigkeit des ablaufenden Programms (CPU Last 100% und Speicher läuft bis zum Abbruch voll), was eine kontinuierliche Aufzeichnung über einen längeren Zeitraum verhindert. Ich weiß, dass man das Programm an einigen Stellen verbessern kann, allerdings weiß ich nicht wie genau und bin daher für Hilfe sehr dankbar.

Was habe ich gemacht? (Im Folgenden ist mein VI in mehrere Screenshots unterteilt.)
Am Anfang initialisiere ich den Wandler mit Hilfe der DAQmx Module mit gewünschten Sample-Takt (wie im Example Finder auch zu finden). [siehe initialise.jpg]

Mittels einer Producer-Schleife werde die Daten von der Messkarte gelesen. [siehe producer.jpg]
Bei DAQmx-Read auf 1 Sample kann ich sichergehen, dass ich bei beiden Eingängen einen Wert bekomme, diese Einstellung ist leider zu langsam bei hohen Sampleraten. Daher lese ich nun immer NSamples pro Durchlauf. Damit kann ich auch Sampletraten von 100 kS/s einstellen, ohne dass der Buffer der Messkarte überschrieben wird. Frage: Kann ich mich darauf verlassen, dass die Aufzeichnung weiterhin synchron ist, ich also immer gleich viele Messdaten im gleichen zeitlichen Abstand bekomme?
Bei Abbruch des Programms wird der DAQmx-Task erst geschlossen und die Queue gelöscht, wenn die Warteschlange geleert wurde um keine Messwerte zu verlieren. Auf die unschöne Verwendung der dynamischen Daten komme ich nachher noch zu sprechen.

Das größte Problem liegt nun in der Consumer-Schleife: [siehe consumer.jpg]
Hier werden die dynamischen Daten aus der Schlange wieder in zwei einzelne Arrays zerlegt, der neuste Wert (das neuste 1D Array an Werten) dem Array hinzugefügt, das ganze in einem Schieberegister. Da ich aber annehme, dass mit jedem Ändern des Arrays ich neu Speicher alloziieren muss und die Arrays sehr schnell sehr groß werden (1M Einträge und mehr) wird alles sehr schnell sehr langsam bis zum Programmabbruch. Ich kann zwar vorher ein riesiges Array initialisieren, das braucht aber relativ lange und beschränkt mich dann auf die Größe dieses Arrays.
Fragen: Gibt es einen besseren Weg, beide Messreihen zu vereinen, als die dynamischen Signale zusammen zu fassen? Bei einem Versuch, verschieden große Arrays an ein existierendes 2D Array zu hängen kam ich nicht zurecht mit Spalten/Reihen/Größen/usw. (Trotz versuchtem Transponieren und verschiedenen Tests). Da habe ich irgendetwas übersehen oder einfach nicht gewußt.
Um das Problem mit dem Speicher zu umgehen, könnte man die Messdaten direkt auf die Festplatte speichern, dies ist auch das eigentliche Ziel. Wie stelle ich das an? Um jeden einzelnen Messwert zu schreiben, ist die Schreibroutine viel zu langsam, d.h. ich müsste, sagen wir alle 2-5 Sekunden, den Inhalt des Arrays auf Platte schreiben und danach den Speicherplatz wieder frei geben. Das alles ohne die weiterlaufende Messung zu unterbrechen oder zu stören. Dazu fehlt mir aber leider das Wissen.

Das Verarbeiten der gemessenen Daten [siehe processing.jpg] geschieht nach Beenden der Aufzeichnung, dies ist durch die Mittelwertbildung bedingt. Da ich gelesen hatte, dass bei jeder Verzweigung eine Kopie der Daten erstellt wird habe ich einen Ausweg gesucht und bin auf die Inplace-Struktur gestoßen. Dadurch werden, soweit ich das Verstanden habe, Pointer verwendet um die Daten direkt zu editieren, ohne zusätzliche Kopien im Speicher zu benötigen. Ich hoffe, dass ich diese Strukturen dementsprechend richtig verwendet habe. Alle aufgezeichneten Daten werden noch einmal in einem Graphen ausgegeben und dann gespeichert. Momentan sind zwei Speichermethoden implementiert, als Vergleich zueinander. Später werde ich das Express-VI löschen, da mir das eine wiederholte Wandlung in dynamische Daten erspart und entsprechend schneller und weniger speicherintensiv ist. Gibt es hier bessere Ansätze die Daten zu speichern? Abgesehen vom Streamen in der Consumer-Schleifer.

Abschließend wird der Speicher von LabVIEW freigegeben und das Programm beendet. Den Speicher muss ich explizit freigeben, da dies sonst nicht geschieht (Speicherauslastung bleibt entsprechend hoch). SubVI würden zwar bei der Übersichtlichkeit des Programms helfen, allerdings habe ich noch nicht genau herausgefunden wie ich Ein- und Ausgabemasken (Graphen usw.) an das Haupt-Frontpanel weiterleiten kann.

Im Anhang die entsprechenden angesprochenen Teilbilder des Programms.

Zusammenfassend ist das Ziel also eine relativ schnelle, endlose Aufzeichnung der synchronisierten und mit festen Sampleraten aufgenommen Messwerte.

Ich hoffe, dass mir jemand helfen kann, sei es mit Tips, Erklärungen oder Beispielen ;-)

Vielen Dank und schöne Grüße,
mh

PS Der Code ist in LabVIEW 8.6 geschrieben


Angehängte Datei(en) Thumbnail(s)
               

Using: LabVIEW 10.0 (32 bit); Windows 7 (64 bit); Core2 Duo E8500; 3,16 GHz; 4 GB RAM
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Nachrichten in diesem Thema
schnelle+kontinuierliche Datenerfassung: Speicherproblem - mh10 - 01.10.2010 18:46

Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Delay für kontinuierliche Datenerfassung zwingend? Philipp841 9 5.561 12.07.2018 10:27
Letzter Beitrag: GerdW
  Kontinuierliche Datenerfassung mit USB 6003 Tobolf 18 10.952 02.02.2017 16:54
Letzter Beitrag: GerdW
  Datenerfassung cDAQ + NI9203 keine synchrone Datenerfassung dieseldunst 5 5.897 24.06.2016 14:49
Letzter Beitrag: jg
  kontinuierliche Datenerfassung in Array speichern Jonas_02 2 4.452 04.09.2015 16:17
Letzter Beitrag: Trinitatis
  Kontinuierliche Messung Ringpuffer dbuckl 9 7.445 07.04.2015 09:19
Letzter Beitrag: dbuckl
  DAQ --> Kontinuierliche Frequenzmessung Flo89 10 12.710 25.04.2014 14:34
Letzter Beitrag: GerdW

Gehe zu: