01-30-2010 04:39 PM
Hallo,
ich habe folgendes Problem: Ich lese bis zu 15 Kanäle (Spannungen) über DAQmx ein. Die Siganle werden verarbeitet und sollen dann angezeigt werden. Die Darstellung soll die Möglichkeit bieten über die Bildlaufleitse in die Vergangenheit zu schauen.
Ich habe das so gelöst, dass diese 15 Kanäle in einem 1D Array als Signalverlauf vorliegen und dann an ein Signaldiagramm übergeben werden. Das funktioniert prinzipiel auch. Allerdings scheint diese Art der Anzeige die Ausführungsgeschwindigkeit der While-Schleife deutlich in den Keller zu ziehen. Von 100 Hz auf 1 Hz oder noch weniger.....
Was gibt es noch für eine Lösung um bei 15 Kanälen mit 10Hz Abtastrate eine Rückblicktiefe von 30 min zu erreichen?
Ich nutze LV 8.2.1 und bin relativ kurz dabei mit LV zu arbeiten.
Vielen Dank,T.Malec
01-31-2010 10:00 AM
Such mal nach producer/consumer design pattern. Damit lässt Du die Darstellung in einem parallelen thread zu der Erfassung laufen.
Bei 30 min bekommst Du auch einiges an Daten: 30*60*10Hz*4byte= 72kB bei einem Kanal. Jedes mal wenn diese Daten kopiert werden müssen (zur Weiterverarbeitung oder Darstellung), kostet das viel Rechenzeit. Es gibt ein Tool 'Show buffer allocations', mit dem Du anzeigen kannst, wo solche Kopiervorgänge notwendig sein können (der Compieler optimiert hier, also wird nicht jedes mal auch wirklich die Kopie gemacht). Wenn Du diese Anzahl an Kopien minimierst, verbesserst Du die performance des Programs.
Wenn Du einen Auszug Deines Source Codes posten kannst, versuche es mal mit einem englischen Post und angehängtem Code, es gibt hier einige die sehr geübt im Optimieren von solchen Sachen sind.
Felix
02-01-2010 08:06 AM
Servus
Felix hat Dir schon einige sehr gute Tipps gegeben.
Erstens ist es wichtig gerade bei der Erfassung von vielen Kanälen die Datenerfassung von der Visualisierung zu trennen.
Wie Du festgestellt hast bremst es Dir sonst die Performance gnadenlos aus.
Also in einer Whileschleife die Messwerte erfassen und in eine Queue reinschreiben.
Danach in der zweiten Schleife die Messwerte aus der Queue auslesen und in das Anzeigeelement schreiben.
Producer/Consumer Pattern findest Du in LabVIEW in der Beispielsuchmaschine (Hilfe-> Beispiele suchen) oder wenn Du ein neues Template anlegst (Datei-> Neu... >VI-> Aus Vorlage -> Entwurfsmuster)
Viel Erfolg
Gruss, Beat
AE NI Germany
02-01-2010 01:21 PM
Vielen Dank Felix,
vielen Dank Pixar,
ich habe das Template Erzeuger/Verbraucher Daten gefunden. Ich werde mich dann jetzt wohl mal mit dem "Queue" beschäftigen, habe da keinerlei Erfahrung mit.
Ich habe bisher die Erfassung der 15 DAQmx Kanäle in einer While Schleife und Schreibe dort die Daten in ein zuvor initialisiertes Array. Mit diesem Array werden dann noch div. Berechnungen durchgeführt bis ich dieses dann an eine Anzeige gebe und in eine tdms Datei streame. Aber wie geschrieben, ist die Performence sehr bescheiden.
Kurz zum Verständnis: Ist es richtig das ich erst eine gewisse Anzahl von Werten einlese und dann anzeige und streame? in dem Fall hätte ich ja keine Onlineanzeige der Daten. Oder muss ich das wechseln zwischen den Schleifen so schnell machen das man dies nicht merkt?
Gruß,T.Malec
02-01-2010 03:43 PM
Queues sind 'Vorrangswarteschlangen' oder FIFO-Buffer (First-In-First-Out), eigentlich recht leicht zu verstehen mit technischem Hintergrund.
Im wesentlichen würde der Erzeuger nur das 'DAQmx Daten lesen' enthalten. Damit könnt essehr schnell laufen,die Daten würden sich dann in der Queue 'stauen'. Alle anderen Prozesse würden im Verbraucher stattfinden, wenn dort sehr viel zu tun ist (Änderungen an der Anzeige) würde diese Schleife zu langsam konsumieren, aber später (wenn dort 'wenig zu tun ist') die Daten aus der Queue abarbeiten.
Beide Schleifen laufen übrigens parallel, sie werden dirket über die queue-daten miteinander syncronisiert.
Allgemein ist DAQmx auf jeden Fall schneller, wenn Du die Daten Blockweise abholst.
Ich hoffe es hilft Dir weiter, ich bin diese Woche nicht mehr online...
Felix
02-02-2010 01:58 AM
Schau Dir mal die Beispiele zu den Queues in der Beispielsuchmaschine an. Da wirst Du sehr schnell sehen wie dieser Mechanismus funktioniert.
Wenn Du dann mit dem DAQmx Read arbeitest mit mehreren Kanälen kommen die Daten ja schon als 1D Array, die kannst Du dann
direkt in die Queue schreiben und verlierst dadurch keine Performance, sprich Deine Datenerfassung läuft mit der von Dir gewünschten Taktrate.
Prinzipiell musst Du dann einfach die Queue erstellen, den zu transportierenden Datentypen angeben und dann in der Erfassungsschleife
die Werte reinladen. In der Schleife zur Visualisierung liest Du anschliessend die Werte wieder aus.
Viel Erfolg und Gruss
Beat
NI Germany