LabVIEWForum.de
Speichern von definierter Anzahl von Messwerten? - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Speichern von definierter Anzahl von Messwerten? (/Thread-Speichern-von-definierter-Anzahl-von-Messwerten)

Seiten: 1 2


Speichern von definierter Anzahl von Messwerten? - WolfiB - 03.08.2010 12:22

Hallo,

über eine analoge Karte erfasse ich mehrere Signale kontinuierlich mit 1kHz. Diese Teile ich durch die Indizes auf, so dass ich
einzelne Signale habe.

In einer State-Machine läuft mein Ablauf ab. Wenn ich nun in einem bestimmten Case bin soll die Messung genau wie möglich gestartet
werden und dann eine definierte Anzahl an Messwerten (Bsp. 12000) aufnehmen. Bei der Abtastrate von 1kHz würde dies dann genau
12 Sekunden dauern. Die Messwerte sollen dann in einem Array-gespeichert werden.

Reicht es wenn ich hier eine ForSchleife mit Wartezeit 1ms einfüge? Das wird aber nicht genau genug sein, oder?
Wie kann ich dies noch anders, sicherer erstellen?


Vielen Dank.


Speichern von definierter Anzahl von Messwerten? - Y-P - 03.08.2010 12:36

Hi Wolle,

hast Du das Bsp. im "Example Finder" schon mal angeschaut (Finite Samples)?
[attachment=28438]
Lv85_img

Gruß Markus


Speichern von definierter Anzahl von Messwerten? - Matze - 03.08.2010 12:43

Hallo,

um welches System geht es denn? Bei einem echtzeitfähigen System kann man es grob so machen, unter Windows nicht. Da wirst du nie exakt eine Millisekunde erreichen.

Wenn es z.B. um DAQmx geht, dann liest deine Karte die Werte mit 1 kHz ein und du kannst davon mehrere Werte auf einmal in deine Anwendung holen (z.B. alle 100 Werte eine Übertragung). Die Werte haben dann einen exakten zeitlichen Abstand von 1 ms.

Wenn du das über DAQmx lösen solltest, musst du beachten, dass beim Start der Messung recht viel Zeit vergeht bis zu den ersten Messwert erhältst, sofern du den DAQmx-Task beim Start der Messung erst erstellst. Du kannst her gehen und die Werte kontinuierlich einlesen und in deinem bestimmten Fall die Auswertung vornehmen bzw. die Zuweisung in ein Array. Trifft deine Bedinung nicht zu, ignorierst du die eingelesenen Werte einfach.
Pro Schleifendurchlauf kannst du auch die eingelesenen Werte durchlaufen und ab einem bestimmten Wert die Daten einem Array zuweisen o.ä.

Ich denke, genauere Angaben zur Aufgabenstellung sind hier sinnvoll.


Speichern von definierter Anzahl von Messwerten? - WolfiB - 03.08.2010 12:54

Hallo,

wie das Beispiel von YP hatte ich es bisher gemacht.
Ich verwende auch DAQmx.


LV V8.5
[attachment=28439]

Das ging aber nur mit einem Signal gut. Als ich dies auf 3 erweitert habe kam ab und zu eine Fehlermeldung.
Dann hatte ich gelernt, dass es nur einen Task pro Karte geben darf. Daraufhin hatte ich versucht das ganze in 1 Task zu packen.

[attachment=28440]

Allerdings ist mit hier die Vorgangsweise zu:
- der Trennung der Signale
- sowie die Vorgehensweise zur Aufnahme in ein Array für den definierten Zeitpunkt mit bestimmter Anzahl an Messwerten nicht bekannt.

Die Werte können von mir aus ständig aufgenommen werden, aber nur ab dem Startzeitpunkt in ein Array geschrieben werden.

Wie muss allein die Whileschleife definieren??? Welche Wartezeit???

Steh da grad völlig auf dem Schlauch.


Speichern von definierter Anzahl von Messwerten? - dimitri84 - 03.08.2010 13:22

Ein paar Stichpunkte:

-Deine 3 Kanäle in einen Task packen geht z.B. so:
[attachment=28441]
... dann brauchst du auch nur eine Schleife.

-Du musst unbedingt die
1) Initialisierung des Tasks
2) Datenerfassung
3) Löschen des Task
in verschiedenen States deiner State-Machine durchführen. Also pro Messung nur einmal Initialisierung und Löschung des Tasks.

-Du musst, wie du schon geahnt hast, N Samples und N Chans bei DAQRead einstellen und z.B. 100 Samples pro Lesezyklus abholen.

-Du brauchst kein Wait.vi! Weg mit dem Metronom - das macht alles der DAQ-Treiber.

-Wieso benutzt du lokale Variablen und platzierst die Controls gefühlte 3 Meter neben dem eigentliche Blockdiagramm. Nimm direkt die Controls!

-Du musst einen Stop-Button erstellen der alles in deinem Programm zum Stillstand bringt. Wenn du mit deinem Auto anhalten willst, betätigst du ja auch ganz normal die Bremse anstatt mit 120 Sachen vorn Baum zu fahrenWink

... als ersten Ansatz


Speichern von definierter Anzahl von Messwerten? - WolfiB - 03.08.2010 13:43

Hey,

ich muss aber die jeweiligen Signalkanäle einzeln und zu verschiedenen Zeitpunkten starten können.
Denn die Aufnahme muss teilweise parallel ablaufen.

Zur weiteren Erklärung:
- Es handlet sich um eine Station mit 3 Prüfplätzen
- jeder Prüfplatz macht das gleiche, ist aber völlig autark voneinander
- Die Messung an einem jeweiligen Platz dauert z.B. 15s (Über Frontpanel vorgebbar)
- Daher kann es auch vorkommen, dass P1 startet, 7s später P3, 5s später P2.


Was soll ich da mit einem Stop anfangen? Muss doch die ganze zeit laufen oder?

Nun müssen einfach die Werte der eingelesenen Analogkarte vom Startsignal ab, hierfür setze ich eine Variable in
dem Case davor, in ein Array geschrieben werden. Dies müssen dann ziemlich genau 15000 Werte für 15s Zeit bei
einer Abtastung von 1kHz sein.

Denn aus dem Array heraus muss ich dann Bsp.weise den 7000 Wert auswerten und mit Grenzwerten vergleichen und
gleichzeitig sollen die ganzen Werte noch auf einem Graphen angezeigt werden. Diese Punkte stellen keine Problem dar.
Aber die genaue Aufnahme.


Braucht ihr noch mehr Infos? Würde gerne den noch fehlenden Punkt erklären, wenn noch was fehlen sollte.


Speichern von definierter Anzahl von Messwerten? - WolfiB - 03.08.2010 14:59

Hallo,

kann ich dies so machen wie in diesem Beispiel mit dem 3 Signal (1+2 Signal muss natürlich auch entsprechende ändern)?
Ist dies für die AUfgabe korrekt oder bekomme ich so zeitliche Probleme???

V8.5
[attachment=28446]


Danke


Speichern von definierter Anzahl von Messwerten? - Lucki - 03.08.2010 19:08

' schrieb:ich muss aber die jeweiligen Signalkanäle einzeln und zu verschiedenen Zeitpunkten starten können.
Denn die Aufnahme muss teilweise parallel ablaufen.

Zur weiteren Erklärung:
- Es handlet sich um eine Station mit 3 Prüfplätzen
- jeder Prüfplatz macht das gleiche, ist aber völlig autark voneinander
- Die Messung an einem jeweiligen Platz dauert z.B. 15s (Über Frontpanel vorgebbar)
- Daher kann es auch vorkommen, dass P1 startet, 7s später P3, 5s später P2.

Es gibt nur einen internen Timer für ai, dehalb können nicht mehrere ai-Tasks gleichzeitig laufen. Allerdings kann man mehrere ai-Tasks (mit jeweils verschiedenen Kanälen) gleichzeitig initialisieren, und man kann sie auch einzeln starten, ohne daß man immer die Tasks neu initialisieren muß. Sie dürfen nur nicht gleichzeitig laufen, d.h. gleichzeitig den Timer beanspruchen wollen.
Deine Aufgabe läßt sich also so nicht lösen. Eine Möglichkeit sehe ich aber: Die Tasks müßten sich gegenseitig verriegeln. D.h. wenn Task 1 läuft, dann wird der Start - falls innerhalb dieser Zeit ein weiterer Startknopf gedrückt wird - von Task 2 oder 3 so lange verzögert, bis Task 1 beendet ist.
Lv85_img[attachment=28458]


Speichern von definierter Anzahl von Messwerten? - WolfiB - 04.08.2010 06:44

Hallo,

@Lucki: Dies ist aber nur so, wenn ich verschiedene Tasks benutze, oder? Dann kann ich also nicht mehrere AI
parallel messen, denn so schnell schalten die ja nicht hin und her, dass ich ohne Wertverluste parallele Messungen erhalte.
Eine "Nacheinanderbearbeitung" ist für diese Anwendung bzw. Anlage nicht tragbar.


Wenn ich aber wie in den Berichten zuvor nur einen Task verwende der alle 3 AI-Signale ständig ausliest, und nur zu den
Messzeiten die Werte in ein Array schreibe, sollte es doch funktionieren, oder?
Wenn ja geht es mir vorallem um die sicherstellung, dass ich genau die Werte ab Start der Messung erhalte, und hier nicht mit
einer Zeitverzögerung und somit verschobenem Wertbild arbeite.


Speichern von definierter Anzahl von Messwerten? - Matze - 04.08.2010 07:03

Was hast du denn für eine Startbedingung?
Wenn diese in einer Schleife überprüft wird, wirst du eher schlechte Karten haben. Das liegt daran, dass du bei der hohen Abtastrate mit DAQmx vermutlich nicht jeden einzelnen Wert übertragen kannst, sonder nur blockweise.
Ist das Triggersignal z.B. eine Überschreitung eines bestimmten Messwerts, ab dem du die Werte dann in dein Array schreibst, dann ist dein Vorhaben möglich.

Oder arbeitest du mit einem externen Trigger?