LabVIEWForum.de
DAQmx schreiben mit NSamples - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: Datenerfassung (DAQ) (/Forum-Datenerfassung-DAQ)
+---- Thema: DAQmx schreiben mit NSamples (/Thread-DAQmx-schreiben-mit-NSamples)

Seiten: 1 2


DAQmx schreiben mit NSamples - Niwo - 03.08.2017 10:56

Hallo,

ich stecke schon seit mehreren Tagen an einem relativ simplen Problem fest und hoffe, dass mir hier kann jemand auf die Sprünge helfen kann.
Ich habe ein cDaq Chassis mit dem ich mehrere Signale lese, berechne, mir anzeigen lasse und speichere. Das alles funktioniert soweit, allerdings möchte ich einen Kanal zusätzlich wieder an einem analogen Ausgang ausgeben. Eingang und Ausgang sind jeweils Spannungen. Die Ausgangsspannung möchte ich für das Ist-Signal eines externen PID Reglers nutzen, der nichts mit LabVIEW zu tun hat. In dem angehängten Beispiel soll zusätzlich ein Kanal für das Soll Signal ausgegeben werden. Die Datenerfassung erfolgt zur Zeit mit 500 Hz und 50 Samples, deshalb wollte ich auch beim Schreiben wieder 50 Samples ausgeben. Mit der Hilfe in LabVIEW bin ich leider nicht weiter gekommen: http://zone.ni.com/reference/de-XX/help/370466AA-0113/mxcncpts/startfunction/

Das Beispiel ist mit LabVIEW 2017 erstellt.


Gruß
Nico


RE: DAQmx schreiben mit NSamples - GerdW - 03.08.2017 11:39

Hallo Nico,

wo genau ist jetzt dein Problem? Irgendwelche Fehlermeldungen?

Warum startest und stoppst du den AO-Task immer wieder?
Warum müssen es 50 Samples für den AO sein? Würde nicht auch ein Sample pro Iteration ausreichen?
Was passiert, wenn du den AO-Task in eine eigene parallele Schleife packst?


RE: DAQmx schreiben mit NSamples - Niwo - 03.08.2017 12:55

Danke für deine Antwort,

das Problem ist, dass keine Samples geschrieben werden. Ich wollte die gleiche Anzahl an Samples nutzen wie bei der Messdatenerfassung, was meiner Meinung nach auch Sinn macht.
Ich hatte schon den Task an jeder möglichen Stelle stehen, allerdings ohne Erfolg. Aktuell erscheint folgende Fehlermeldung beim Beenden des VI: Error -200088 occurred at DAQmx Start Task.vi:7220002.

Meinst du bei einem Sample pro Iteration, dass nur 1 Sample von den ursprünglichen 50 bei einem Durchlauf der Schleife ausgegeben werden soll.? Ich hatte so etwas schon zuvor implementiert und hat auch gut funktioniert. Allerdings ist dann mein zeitabhängiges Signal von der Quantität abhängig von der Sample-Anzahl, was für die Regelung nicht sonderlich gut ist (z.B. bei 500 Hz und 50 Samples wäre das dann nur 10 Hz für den Ausgang). Wozu gibt es dann bei dem VI DAQmx-Write, die Möglichkeit n-Samples auszuwählen, wenn es doch nicht so einfach funktioniert?

Das mit der parallelen Schleife hört sich gut an, allerdings weiß ich noch nicht so genau wie du es meinst, bzw. wie ich es am besten ausführen sollte.


RE: DAQmx schreiben mit NSamples - GerdW - 03.08.2017 14:00

Hallo Niwo,

Zitat:Das mit der parallelen Schleife hört sich gut an, allerdings weiß ich noch nicht so genau wie du es meinst, bzw. wie ich es am besten ausführen sollte.
LabVIEW bringt jede Menge Beispiel-VIs und auch -Projekte mit, einfach dort mal nach Producer-Consumer schauen!

Zitat:Error -200088
Die Fehlerbeschreibung lautet: "Task ist ungültig oder existiert nicht"…

Zitat:z.B. bei 500 Hz und 50 Samples wäre das dann nur 10 Hz für den Ausgang
Dann probiere doch 500Hz mit 10 Samples für 50Hz…
(Was soll der externe PID denn regeln und wie schnell?)

Ein Problem bei deinem Ansatz oben im Bild ist, dass das Starten und Stoppen des AO-Task eben auch Zeit benötigt - zusätzlich zur eigentlichen Ausgabe.
Der AO-Task wird deshalb immer langsamer arbeiten wie der AI-Task in der Schleife, sodass dessen Buffer irgendwann überläuft (und du schon vorher veraltete Samples einliest).


RE: DAQmx schreiben mit NSamples - Niwo - 04.08.2017 09:00

Ich habe mein größeres VI schon im Producer-Consumer-Layout angelegt, nur hatte ich die Eingang - Ausgang Tasks in einer Schleife, weil ich gedacht hatte, dass ich dadurch weniger Verzögerung bekomme. Das Test-VI habe ich nur erstellt um die Ausgabe zu testen.
Naja, ich kann dem nicht so zustimmen, dass es viele Beispiele in Labview gibt. Hatte vorher viel in Matlab gearbeitet und dort war immer zur Erklärung ein Beispiel in der Hilfe angehängt. LabVIEW hat meiner Meinung nach da große Lücken...
Kannst du vielleicht kurz drüber schauen ob ich in der neuen Version einen Fehler gemacht habe? Fehlermeldung war, dass ein Inputparameter nicht erlaubt sein soll. Eigentlich sollte es ja nicht allzu exotisch sein, Samples zu schreiben, die zuvor in einer Schleife berechnet wurden. Die Samples-Anzahl und die Sample Rate zu reduzieren bringt auch nichts. Es wird noch nicht einmal ein Sample-Paket geschrieben Confused


RE: DAQmx schreiben mit NSamples - jg - 04.08.2017 09:09

Das Problem an deinem VI (Screenshot) ist, dass du 2x die Queue zerstörst, mit ziemlicher Sicherheit das erste Mal nach Beendigung der oberen Schleife. Dann will die untere Schleife aber noch ein Dequeue ausführen - aber die Queue ist nicht mehr vorhanden. Folge: Fehler 1.

Entweder ignorierst du diesen Fehler programmatisch (es ist schließlich zu erwarten, dass er auftritt), oder du sorgst per Dataflow dafür, dass die Queue erst dann zerstört wird, wenn sie nicht mehr gebraucht wird, z.B. so:
[attachment=58096]

Gruß, Jens


RE: DAQmx schreiben mit NSamples - GerdW - 04.08.2017 09:14

Hallo Niwo,

Zitat:Naja, ich kann dem nicht so zustimmen, dass es viele Beispiele in Labview gibt. Hatte vorher viel in Matlab gearbeitet und dort war immer zur Erklärung ein Beispiel in der Hilfe angehängt. LabVIEW hat meiner Meinung nach da große Lücken...
Zwei Wege zum "Beispiel":
- Kontexthilfe immer geöffnet haben: Maus auf die gesuchte Funktion, dann auf "Ausführliche Hilfe" klicken - so kommst du direkt in die LabVIEW-Hilfe hinein. Dort findest du manchmal (aber eben nicht immer) BeispielVIs verlinkt zu den Funktionen (tendenziell eher bei den Signalverarbeitungs-Funktionen)
- Hilfe-Menü -> Beispielfinder: dort findest du jede Menge zu DAQmx…

Zitat:Fehlermeldung war, dass ein Inputparameter nicht erlaubt sein soll.
Ich gehe davon aus, dass der Fehler angezeigt wird, wenn du dein VI beendest: Nach der Producer-Schleife zerstörst du die Queue-Referenz. Dummerweise wartet die Consumer-Schleife aber noch auf Daten dieser Queue und meldet dann eben "Referenz ist nicht mehr gültig"! (Dies ist aber trotzdem ein üblicher Weg, um die Consumer-Schleife zu beenden. Man muss eben nur etwas Fehlerbehandlung programmieren und dies nicht allein LabVIEW überlassen…)

Zitat:Kannst du vielleicht kurz drüber schauen ob ich in der neuen Version einen Fehler gemacht habe?
Wieso startest und stoppst du den AO-Task nach der Consumer-Schleife? Da sollte doch gar nichts mehr passieren?!

Schau doch mal in den Beispielfinder nach einem Beispiel für genau deine Aufgabe: AI lesen und einen Wert an AO weiterreichen…


RE: DAQmx schreiben mit NSamples - Niwo - 10.08.2017 13:36

Hi,

die Hilfe ist mir vertraut, finde sie meistens aber auch nicht sehr hilfreich.
Ich habe das VI einmal umgebaut, allerdings wird die zweite Schleife nicht ausgeführt und ich komme nicht drauf wieso.

Hat jemand eine Idee?


RE: DAQmx schreiben mit NSamples - GerdW - 10.08.2017 13:57

Hallo Niwo,

Zitat:allerdings wird die zweite Schleife nicht ausgeführt und ich komme nicht drauf wieso.
Hast du mal etwas (Highlight-)Debugging ausprobiert? Da sieht man sowas meist sehr schnell…

Zitat:Hat jemand eine Idee?
Na klar!
THINK DATAFLOW!
Du hast eine "data dependency" zwischen den beiden Schleifen geschaffen, die dazu führt, dass die zweite Schleife erst nach der ersten ausgeführt wird. Wie schon gesagt: THINK DATAFLOW!

Ich glaube nicht, dass das mitgelieferte Producer-Consumer-Beispiel so programmiert wurde… Smile


RE: DAQmx schreiben mit NSamples - Niwo - 11.08.2017 08:28

Aha, dann stimmt aber das Beispiel von Jens nicht, weil ich es 1:1 übernommen habe. Das Problem lag auch an der Wartefunktion und an der Reaktion des Stop-Buttons.
Wenn ich es in einer Schleife ausführe funktioniert es jetzt: