07.01.2010, 15:58
Hallo und frohes Neues,
ich bin seit ein paar Wochen dabei mit einer NI-6035E Karte, die ich unter Qt mit C++ und den entspr. Header Einbindungen anspreche, auf vier Kanälen zu messen und die Ausgabe grafisch darzustellen. Soweit funktioniert das auch hervorragend. Allerdings habe ich arge Performanceprobleme dabei. Ich lese mittels DAQmxReadAnalogF64 je 100 Wert ein, also insg. 4x100, und mittele diese dann. Diesen Vorgang wollte ich ca. 50 Mal/Sekunde ausführen. Ich komme aber lediglich auf ca 15Hz.
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>int32 DAQmxReadAnalogF64 (TaskHandle taskHandle, int32 numSampsPerChan, float64 timeout, bool32 fillMode, float64 readArray[],
uInt32 arraySizeInSamps, int32 *sampsPerChanRead, bool32 *reserved);</div>
Jetzt denke, ich hab den Lesemechanismus vielleciht noch nicht ganz verstanden. Ich sehe das so: Ich stelle mittels DAQmxCfgSampClkTiming das Timing und die Abtastrate ein. Da habe ich bsp. jetzt 8kHz eingestellt. (Meine Überlegung war, dass bei 8000Hz/400Samples rechnerisch noch reale 50Hz Wiederholungsrate möglich sind. Das legt zu Grunde, dass die 400Samples nacheinander eingelesen wurden. Hat jeder Kanal seinen eigenen Puffer und muss ich somit nur durch 100 teilen?) Ab dann wird der Puffer der Karte laufend befüllt - FIFO?
Nun kann ich mittels DAQmxReadAnalogF64 ein Array befüllen. Bei mir ist das 400 Samples groß, 100Samples für jeden Kanal und nacheinander angeordnet mittels des DAQmx_Val_GroupByScanNumber Arguments. Ist das wirklich nur eine Anordnung oder gibt das auch einen Hinweis auf die zeitliche Reihenfolge der Werte?
Ich hoffe, ich bin nicht in zu viele Details ausgebrochen und jemand tut sich diesen Text an. :-)
Herzlichen Dank
Grüße
Stefan
ich bin seit ein paar Wochen dabei mit einer NI-6035E Karte, die ich unter Qt mit C++ und den entspr. Header Einbindungen anspreche, auf vier Kanälen zu messen und die Ausgabe grafisch darzustellen. Soweit funktioniert das auch hervorragend. Allerdings habe ich arge Performanceprobleme dabei. Ich lese mittels DAQmxReadAnalogF64 je 100 Wert ein, also insg. 4x100, und mittele diese dann. Diesen Vorgang wollte ich ca. 50 Mal/Sekunde ausführen. Ich komme aber lediglich auf ca 15Hz.
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>int32 DAQmxReadAnalogF64 (TaskHandle taskHandle, int32 numSampsPerChan, float64 timeout, bool32 fillMode, float64 readArray[],
uInt32 arraySizeInSamps, int32 *sampsPerChanRead, bool32 *reserved);</div>
Jetzt denke, ich hab den Lesemechanismus vielleciht noch nicht ganz verstanden. Ich sehe das so: Ich stelle mittels DAQmxCfgSampClkTiming das Timing und die Abtastrate ein. Da habe ich bsp. jetzt 8kHz eingestellt. (Meine Überlegung war, dass bei 8000Hz/400Samples rechnerisch noch reale 50Hz Wiederholungsrate möglich sind. Das legt zu Grunde, dass die 400Samples nacheinander eingelesen wurden. Hat jeder Kanal seinen eigenen Puffer und muss ich somit nur durch 100 teilen?) Ab dann wird der Puffer der Karte laufend befüllt - FIFO?
Nun kann ich mittels DAQmxReadAnalogF64 ein Array befüllen. Bei mir ist das 400 Samples groß, 100Samples für jeden Kanal und nacheinander angeordnet mittels des DAQmx_Val_GroupByScanNumber Arguments. Ist das wirklich nur eine Anordnung oder gibt das auch einen Hinweis auf die zeitliche Reihenfolge der Werte?
Ich hoffe, ich bin nicht in zu viele Details ausgebrochen und jemand tut sich diesen Text an. :-)
Herzlichen Dank
Grüße
Stefan