Hallo,
Ich möchte mit meinem A/D-Wandler mehrere Minuten lang mit 20kHz ein Signal aufnehmen. Die bisherige Grenze liegt bei 25min (=30Mio Single Precision Werte). Darüber wird gemeldet, dass der Speicher voll ist. Das "Profile Performance and Memory"-Tool meint, dass das VI 700 MB verschlingt nach 25min messen und hinterher auswerten... was mir aber irgendwie ein Rätsel ist... ich hab mit der Hälfte gerechnet 0_o
Das was meiner Meinung nach am meisten Speicher frisst, wird in den Bildern illustriert. Hier würde ich gerne mal wissen, ob ich das mit dem Frequenz-Filter (im Auswerten-Event) und dem Betrag bilden (im SubVI) richtig gelöst habe. Labview konnte beide Aktion zunächst nicht ausführen, als ich das gesamte Array angebunden habe, da anscheinend das Array einfach zu groß war (schon nach 15min Messzeit = 18Mio Werte). Deshalb hab ich es in einzelne Subarrays zerlegt.
Ciao!
Hallo Riske,
in so einem Fall speichere ich die Daten in einer Speicherdatei laufend und nach der Messung hole ich sie wieder zur Auswertung. So bleibt mir der Arbeitsspeicher frei und sind mir die Daten gesichert im Falle eines Messausfalles.
Erstens:
Andora hat recht!
Zweitens und
:
Eine Schleife in einer Eventstruktur zu platzieren ist ein absolutes No-No! Da kannst du dir die Event-Struktur auch sparen, du kannst deine Schleife damit ja nicht mal mehr anhalten...
Gruß
Achim
Heyho,
ich sollte das dann sicherlich mit dem "Write To Binary File"-VI machen oder?
Gibt es da auch keine Probleme, dass die Festplatte evtl. nicht hinterherkommt mit dem Schreiben oder Daten verloren gehen? Wenn ich das richtig sehe, legt das GetStat-VI das Array an. In dem Array befinden sich dann mehrere Millionen Werte, die alle Null sind. Und mit der Zeit wird dann das Array mit 20kHz an Binär-Daten überschrieben und danach in dem ToEng-VI in Volts umgerechnet.
Wie soll ich aus dem Array fortlaufent die Daten in eine Text-Datei schreiben?
Hier das Standard-VI des Herstellers in
[
attachment=30450]
Kann schon sein...aber das ist eher eine grundlegende Sache und hat nix mit der Platzierung von "langem" (unendlichem?!) Code in einem EVENT-Case zu tun...
' schrieb:ich sollte das dann sicherlich mit dem "Write To Binary File"-VI machen oder?
Nö, nicht unbedingt. Auch TDMS bietet sich an. Offtopic: Mit NI-Hardware als Datenerfassung kannst du inzwischen direkt aus dem DAQmx-Treiber in einen TDMS-File streamen. Direkter geht nicht.
Wir können das auch mal überschlagen: 20kHz bei Single Precision -> Binär also ca. 80kB/s auf die Festplatte streamen. Das ist jetzt nicht sooo viel. Leg als ASCII einen Faktor 2 drauf, dann sind wir bei 160kB/s, auch noch nicht die Welt.
' schrieb:Gibt es da auch keine Probleme, dass die Festplatte evtl. nicht hinterherkommt mit dem Schreiben oder Daten verloren gehen? Wenn ich das richtig sehe, legt das GetStat-VI das Array an. In dem Array befinden sich dann mehrere Millionen Werte, die alle Null sind. Und mit der Zeit wird dann das Array mit 20kHz an Binär-Daten überschrieben und danach in dem ToEng-VI in Volts umgerechnet.
Wie soll ich aus dem Array fortlaufent die Daten in eine Text-Datei schreiben?
Welches GetStat-VI? Alles eine Frage der Programmierung, und natürlich, welche Möglichkeiten deine ausgefallene DAQ-Hardware liefert.
Gruß, Jens
Eine Möglichkeit, die Aufzweichnungskapazität um den Faktor 3 zu erhöhen, wäre, direkt die 16Bit Rohdaten vom ADC zu speichern, anstatt das Single-Format zu verwenden
Edit wegen Hinweis Unicorn: Single = 4 Bit, also nur Faktor 2 und nicht Faktor 3
Single -> I16 Kommt da nicht nur ein Faktor 2 zusammen?
Um große Datenmengen im Speicher zu haben biete sich ein Array von Clustern von kleineren Datenarrays an. Durch den Cluster braucht LV keinen zusammenhängenden Speicher mehr für das äußere Array.
Je nach Konfiguration benötigt LV nochmal den Speicher, wenn ein Array an ein SubVI gegeben wird.
Es ist wahrscheinlich besser ein VI mit einer Schleife mit Shift Register, in dem die Daten "seitenweise" gespeichert werden, zu haben und die Daten Seitenweise abzulegen und zu holen. Auf diese Weise kann ich problemlos 460 MB Daten im Speicher halten, was 96 Minuten Singleformat Samples sind. Das ist jetzt aber auch nicht die endgültige Grenze.
Hey Leute... vielen Dank für die vielen Antworten!!!
@Jens:
Warum empfiehlst du TDMS? Was ist der Vorteil gegenüber "Write To Binary File"?
Ich meine das GetStat-VI, was sich in der einen Grafik in der While-Schleife befindet (mit "GetStatus" bezeichnet).
Hier noch mal extra in
[
attachment=30526]
Das VI legt halt mit einem mal die die Größe des Arrays fest, deshalb stelle ich mir das schwierig vor mit dem streamen der einzelnen Werte. Da kann man doch sicherlich nur am Ende der Messung das komplette Array reinschreiben oder?!
@Achim:
Ich werd das mit der While-Schleife noch mal überarbeiten... hab da eine Idee
@unicorn:
Die Cluster-Idee klingt auch interessant. Eine "Seite" würde ja dann zB 1min an SGL-Daten entsprechen. Aber wenn ich die Daten in einem SubVI auswerten will, muss ich das Cluster doch wieder in ein zusammenhängendes Array schieben. Und dann würde das Programm ja auch wieder abstürzen. Oder seh ich das falsch?
Du kriegst aber schon immer nur kleine Messpakete von deiner Karte zurück? Nicht die 60 min in einem Array aus dem GetStat-VI?!
Dann diese Pakete speichern, und nicht alles im RAM halten.
Und zwecks TDMS: Dann kannst du die Daten wesentlich einfacher wieder einlesen. z.B. in Excel oder Diadem direkt.
Gruß, Jens