Hallo Zusammen,
ich habe ein Problem beim lesen der Daten aus einem cDAQ-9178.
Folgende Hardware ist im Messystem verbaut:
NI 9205 (AI)
NI 9227 (3x) (AI)
NI 9426 (DI)
NI 9477 (DO)
NI 9217 (AI)
Die Messdaten frage ich in einem Zyklus von 60 ms ab.Einstellungen bzgl. der Tasks befinden sich im Anhang.
Mein Problem ist, dass ich in Unregelmässigen Abständen als Ergebnis der gemittelten Werte ein NaN erhalte.
Ich verstehe nicht, woher dieser "Fehler" stammt, vermute aber, dass es mit meinen Einstellungen im Timing zusammen hängt.
Hat jmd eine Idee?
LG
Dominik
Entschuldigung ich habe vergessen mich vorzustellen
Hi ich bin der Dominik und programmiere (eher nebenbei, leider) seit 2011 mit Labview.
Nach dem Labview Core 2 habe ich leider keine Schulungen mehr besuchen können.
Ich benutze Labview hauptsächlich zur Programmierung von Prüfständen.
LG
Hallo Dominik,
Zitat:Die Messdaten frage ich in einem Zyklus von 60 ms ab.Einstellungen bzgl. der Tasks befinden sich im Anhang.
Hier dürfte eine (die?) Ursache des Problems liegen:
- Du hast unterschiedliche Datenraten bei den Tasks definiert, fragst aber überall die gleiche Samplezahl ab. Das bedeutet, dass jeder der drei Tasks unterschiedlich schnell seinen Buffer vollschreibt, den du aber nur ungleichmäßig wieder leerst!
- Eine zusätzliche Wartezeit in einer Schleife, deren Iterationszeit durch DAQmxRead-Funktionen bestimmt wird, ist fast immer tödlich. Sowas macht man nicht!
Probiere mal:
- Wartezeit entfernen.
- Alle DAQmxRead
gleich schnell machen! Also entweder gleiche Samplerate und gleiche Sampleanzahl oder weiter unterschiedliche Samplerate und dann aber auch unterschiedliche Sampleanzahlen!
P.S.:
Die Mittelwert-Berechnung gibt dir den Mittelwert, aber kein RMS aus!
Es gäbe noch eine andere Möglichkeit, das VI zu "retten", d.h. im Wesentlichen so zu lassen wie es ist. Wie von Gerd schon gesagt, passen das Wait und das Lesen einer bestimmten Anzahl von Werten nicht so recht zusammen - schon gar nicht bei unterschiedlichen Raten.
Lösung: Kontinuierlicher Modus, das Wait so lassen, aber die Anzahl der zu Lesenden Sampels bei allen Tasks auf "-1" setzen. Dann werden auf allen Kanälen bei jedem Schleifendurchlauf so viel Samples gelesen, wie im Puffer sind, und es gibt keine Synchronisations- oder Pufferüberlauf-Probleme. Man muß sich dann allerings damit abfinden, dass die Anzahl der gelesenen Samples bei jedem Durchlauf etwas variieren kann. Die Raten der einzelnen Tasks können aber mit dieser Methode ganz unterschiedlich sein.
Edit: Sehe gerade, Du hast ja gar kein Schleife im Programm, es ist offenbar auf endliche Samplezahl konfiguriert. In dem Fall: Wait ist sinnlos, verlängert evtl. unnötig die Ausführung, richtet aber keinen Schaden an. Damit aber alle Samples gelesen werden, sollte ebenfalls die Anzahl auf "-1" gestellt werden - siehe Hilfe zu DAQmxRead.
Hallo,
erstmal vielen dank für die antworten. Dazu habe ich aber nochmal eine Frage.
Wenn ich die Samplerate und die Sampleanzahl gleich haben möchte, muss ich dann auf die im Task festgelegte Anzahl der Kanäle (oder auch Messkarten) achten? Oder Definiere ich ich einfach im MAX eine Samplerate und entsprechend im DAQmx die gleiche Sampleanzahl?
LG
Hallo Dominik,
Zitat:Wenn ich die Samplerate und die Sampleanzahl gleich haben möchte, muss ich dann auf die im Task festgelegte Anzahl der Kanäle (oder auch Messkarten) achten? Oder Definiere ich ich einfach im MAX eine Samplerate und entsprechend im DAQmx die gleiche Sampleanzahl?
Einfach Samplerate und Sampleanzahl definieren - und fertig…
Hab noch eine Frage
Wie erhalte ich dann ich eine "für den Benutzer schnelle" Frequenz der Messwerte.
Hat vll jmd einen rechnerischen Lösungsansatz. Oder einen Link wo so eine Problematik Beschrieben ist?
LG
Hallo Dominik,
der üblicher Ratschlag lautet: Sampleanzahl sollte ca. 1/10 der Samplerate betragen. Dann erhält man Messwerte im 100ms-Takt…