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!
Ich versuche (zur Zeit nur simuliert) über ein USB-9234 3 Spannungen auszulesen. Was ich eigentlich brauche, ist, nur 2 Mal pro Sekunde den aktuellen Spannungswert zu lesen. Ich habe dazu in MAX einen Task erstellt, mit den Einstellungen "kontinuierlich", "1 Sample", "2 Hz". Im Programm lese ich (ebenfalls alle 0,5 Sek.) mit "DAQmX Read" "Analog 2D DBL NChan NSamp" aus. Von diesem 2D-Array nehme ich die letzte Spalte, da ich nur die neusten Werte brauche den Rest nicht (da die beiden Raten aber zumindest theoretisch synchron sind, sollte da sowieso nie mehr als ein Wert drin stehen).
Nach meinem Verständnis sollte bei dieser Leseart der Puffer immer automatisch geleert werden (ich habe den Sample-Eingang der Read-Funktion offen gelassen). Trotzdem bekomme ich nach unterschiedlichen Zeiten den Fehler 200279.
Was muss ich da anders einstellen? Wie gesagt, ich brauche eigentlich nur einen möglichst aktuellen Wert, zu dem Zeitpunkt wo ich Abfrage. Was davor war ist egal. Am liebsten wäre mir einfach mit der Rate zu samplen, was die Hardware hergibt, wobei die aber nur den letzten Wert zu speichern braucht.
ganz kann ich nicht nachvollziehen, was du da zusammengebaut hast. Ein Screenshot wäre viel sinnvoller.
Normalerweise sollte es reichen, wenn du "Analog 2D DBL NChan 1Samp" wählst, da du ja immer nur einen Messwert auslesen möchtest (bei 2 Hz geht das auch problemlos). Denke daran, dass du in deiner Erfassungsschleife keine manuelle Zeitverzögerung wie "Warten (ms)" einbaust. Das übernimmt der DAQmx-Treiber für dich.
Sonst führt es mit großer Wahrscheinlichkeit dazu, dass du die Messwerte zu langsam ausliest.
Ein anderes Problem könnte sein, dass du z.B. eine ungebremste parallele Schleife laufen hast, die die CPU so sehr auslastet, dass keine Ressourcen mehr für die Erfassung zur Verfügung stehen.
Ich glaube nicht, dass es an deinen DAQmx-Einstellungen liegt, sondern am Code drum herum, da die Erfassung zu langsam abläuft.
Ob's Sinn hat das ganze hier reinzustellen weiß ich nicht, da ein einziges Bild längst nicht ausreicht und das ganze Projekt schon über 60 Datein hat. Da wird sich keiner einlesen wollen.
Zur Zeit ist es so, dass ich in einer Schleife Events behandle und dann entsprechende "Kommandos" per Queue an eine andere Schleife sende, die sie verarbeitet. Neben den normalen UI-Events wird auch 2 mal pro Sekunde ein "lies Daten" an die andere Schleife gesendet, was dann die Hardware ausliest. Ungebremst ist nichts. Die eine Schleife wartet an der Queue, die andere auf Events (unter anderem ein 5ms-Timeout, um zu prüfen, ob mehr als 0,5 Sekunden seit der letzten HW-Abfrage vergangen sind). Groß gerechnet wird nirgends. Prozessorlast ist, wenn überhaupt, im unteren einstelligen %-Bereich.
Gibt's keine Möglichkeit, die Hardware einfach messen zu lassen, sodass der Puffer laufend überschrieben wird ohne eine Fehlermeldung zu erzeugen? Das wäre das einfachste.
Die beste Möglichkeit wäre also eine dritte Schleife zu machen, die einfach die Abfrage macht (und rein mit der Abtastfrequenz des Tasks arbeitet)? Das Problem ist, dass das jetzt gar nicht in mein Design passt, da die Initialisierung der Tasks usw. in einer State-Machine in der Consumer-Schleife passiert.
So, nachdem ich jetzt einige Zeit keine Zeit hatte, daran weiter zu arbeiten, setzte ich mich über die Feiertage wieder dran. Ich werde wohl tatsächlich versuchen das Programm umzubauen und die Abfragen in einer frei laufenden Schleife zu machen. Muss mir überlegen wie ich die Tasks initialisiere (passiert an anderer Stelle) und erst dann die Schleife starten lasse.
Aber was ganz anderes: es kommen jetzt noch 2 USB-9213 (Temperatur-Messung) dazu. In MAX habe ich alle auf kontinuierlich, 2 Hz gestellt. Aber wie bringe ich nun die 3 Tasks dazu, zur gleichen Zeit zu sampeln?