Für jeden Analog-Output eigene Task einrichten - Druckversion +- LabVIEWForum.de (https://www.labviewforum.de) +-- Forum: LabVIEW (/Forum-LabVIEW) +--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein) +---- Forum: Datenerfassung (DAQ) (/Forum-Datenerfassung-DAQ) +---- Thema: Für jeden Analog-Output eigene Task einrichten (/Thread-Fuer-jeden-Analog-Output-eigene-Task-einrichten) |
Für jeden Analog-Output eigene Task einrichten - Lucki - 03.07.2006 20:01 Ich möchte mit einer Multifunktionskarte mit 2 Kanälen Output die gleiche Waverform mit gleicher Abtastrate sequentiell mal auf dem einen, mal auf dem anderen Kanal ausgeben (niemals zugleich). Wenn ich von einem auf den anderen Kanal wechsle, möchte ich vermeiden, alles neu zu initialisieren. Die gleiche Aufgabenstellung funktioniert bei Analog Input tatellos, nur mit Analog Output will es nicht gehen. Schritte: 1) Initialisieren der beiden Tasks (funktioniert) 2) Starten einer der beiden Task (funktioniert) 3a) Wiederholtes Starten der gleichen Task funktioniert 3b) Starten einer Task, nachdem die andere Task schon mal gestartet war, funktioniert nicht. Es kommt die Fehlermeldung, daß die Resource schon verwendet wird. Ich habe es mit drei gängigen Karten (E und M-Serie) versucht, und wenn ich ehrlich bin, dann stochere ich schon seit Wochen an dem Problem herum, so daß ich letztlich den Verdacht haben, daß die Karten das hardwaremäßig einfach nicht können. Weiß jemand mehr darüber oder kann mir einen Tip geben? Das vi ist einen Abstrkation, um das Problem zu verdeutlichen und hat mit der tatsächlichen praktischen Anwendung wenig zu tun Für jeden Analog-Output eigene Task einrichten - Svente - 04.07.2006 07:20 Hallo Lucki, ich habe Dein Programm gar nicht so recht laufen lassen können und habe einige Sachen, die meines Erachtens nach da mit rein müßten. Probier mal ob das so läuft bei Dir und meld' Dich nochmal. Svente Für jeden Analog-Output eigene Task einrichten - Lucki - 05.07.2006 08:30 ' schrieb:ich habe Dein Programm gar nicht so recht laufen lassen könnenWas Du reingemacht hast, Fehlerbehandlung und Rücksetzen der Tasks, sollte ein ordentlicher Programmierer natürlich machen. Es lief aber bei mir aber auch so bzw. der Fehler, auf den es ankam, trat auch so auf. Trotzdem: Beim Vergleich der beiden VIs mußte ich erkennen, daß ich mich in einem wesentlichem Punkt geeirrt hatte. Der Fehler tritt nämlich nicht erst beim Starten des zweiten Tasks auf, sonderen bereits bei dessen Initialisierung. Es kommt die Fehlermeldung, daß die Ressource bereits belegt ist, obwohl das gar nicht der Fall sein dürfte. Ich habe also das Beispiel vereinfacht: Es wird nur noch initialisiert und gar nicht mehr gestartet. Das Prog. verbleibt dann in einer leeren Warteschleife, und bei Stop werden die Tasks rückgesetzt. Frage also: Kommt es zur Fehlermeldung oder nicht? Vielleicht liegt es auch an den von mir verwendeten Karten, die das vielleicht alle nicht können. Versucht habe ich es mit den Karten PCI-6052E, PCI-6221, PCI-MIO-16E4. [attachment=2506] Für jeden Analog-Output eigene Task einrichten - cb - 05.07.2006 11:58 ' schrieb:Was Du reingemacht hast, Fehlerbehandlung und Rücksetzen der Tasks, sollte ein ordentlicher Programmierer natürlich machen. Es lief aber bei mir aber auch so bzw. der Fehler, auf den es ankam, trat auch so auf. ich hab's eben mal mit einer PCI-6251 getestet und es tritt der Fehler -50103, DAQmx Write (Analog 1D DBL 1Chan NSamp).vi auf. Meines Erachtens (ich bin mir aber nur zu 90% sicher) kann man bei den einfachen Karten (M-Serie, E-Serie) jeweils nur einen AO-Task starten für alle Ausgabe-Kanäle. Ich hab mal geschaut, auf die schnelle finde ich bei NI gar keine Karte, die explizit mit simultanous AO spezifiziert ist. Vielleicht kann da NI Sales weiterhelfen? Grüße CB Für jeden Analog-Output eigene Task einrichten - Lucki - 05.07.2006 12:24 ' schrieb:ich hab's eben mal mit einer PCI-6251 getestet und es tritt der Fehler -50103, DAQmx Write (Analog 1D DBL 1Chan NSamp).vi auf. Meines Erachtens (ich bin mir aber nur zu 90% sicher) kann man bei den einfachen Karten (M-Serie, E-Serie) jeweils nur einen AO-Task starten für alle Ausgabe-Kanäle.Es hilft mir schon mal weiter, wenn als Du als erfahrener Fuchs keinen elementaren Fehler feststellen kannst. Ich werde anfragen, so wie Du es vorschlägst, und hier das Ergebnis melden. Vorher werde ich aber den gleichen Test noch mit den edlelsten und teuersten NI-Messkarten machen - natürlich nur per Simulation, was ja eine der wertvollen Neuerungen von LV8 ist. Ich muß nur noch recherchieren, welche Karten das sind Für jeden Analog-Output eigene Task einrichten - cb - 05.07.2006 18:50 ' schrieb:Es hilft mir schon mal weiter, wenn als Du als erfahrener Fuchs keinen elementaren Fehler feststellen kannst. Ich werde anfragen, so wie Du es vorschlägst, und hier das Ergebnis melden. Vorher werde ich aber den gleichen Test noch mit den edlelsten und teuersten NI-Messkarten machen - natürlich nur per Simulation, was ja eine der wertvollen Neuerungen von LV8 ist. Ich muß nur noch recherchieren, welche Karten das sind ne, der elementare Fehler wird sein, dass die Karte nur einen Task verarbeiten kann. Mann kann ja z.B. bei M-Serie und E-Serie auch nicht 2 AI Tasks auf der gleichen Ressource laufen lassen. Das liegt daran, dass nur ein ADC drauf ist, der von einem Multiplexer angesteuert wird (daher kommt z.B. auch die Summenabtastrate, die im wesentlichen von der Geschwindigkeit des Multiplexers abhängt ...). Ich denke mal, dass das bei AO dann das gleiche ist. Ich hab auch mal in den NI.COM Foren gesucht. Ich bin zwar nicht wirklich tief reingegangen, aber im Prinzip wurde meine Meinung da so bestätigt ... (Suche nach "simultanous analog output") Mit nur einem Task, mit mehreren Kanälen funktioniert das ganze natürlich. Hab ich selbst schon so programmiert und läuft einwandfrei. Wenn ich das in deinem Beispiel richtig gesehen habe, dann verwendest du für beide Kanäle sowieso die gleiche Abtastrate? dann wär es ja kein Problem, die beiden AOs in einem Task zusammenzufassen? Die simulierten Geräte haben übrigens nix mit LabVIEW 8 zu tun, das ist ein Feature seit DAQmx 7.5 oder 8.0 ... Grüße CB Für jeden Analog-Output eigene Task einrichten - Lucki - 12.07.2006 08:38 Zitat:.. der elementare Fehler wird sein, dass die Karte nur einen Task verarbeiten kann. Mann kann ja z.B. bei M-Serie und E-Serie auch nicht 2 AI Tasks auf der gleichen Ressource laufen lassen. Das liegt daran, dass nur ein ADC drauf ist, der von einem Multiplexer angesteuert wird Diesen elementeren Fehler begehe ich aber genau nicht, denn ich erstelle zwar meherer Tasks, ich lasse aber die Tasks immer nur sequentiell und nie gleichzeitig ablaufen. Also von den hardwaremäßigen Resourcen her könnte und müßte es funktionieren - und es funktioniert tatsächlich auch bestens, aber eben nur mit AI und nicht mit AO. Hier mal ein paar Einzelheiten zu dem Projekt: Es geht um eine Software für das Tunig von Spiegelgalvanometer- Scannern. Es ist einen Art Mehrkanal-Oszilloskop, aber außerdem werden in Echtzeit mittels Fourieranalyse noch Frequenzgänge dargestellt. Die Kanalzuordnung ist die: ao0/ao1 Stimulation X-Scanner/Y-Scanner, ai0:7/ai8:15 Messdaten X-Scanner/Y-Scanner Da die Phasenverhältnisse wichtig sind und um die maximal mögliche Abtastrate einer Messkarte nicht zu verringern, wird das Oszilloskop grundsätzlich im "Alternate-Modus" betrieben, d.h es wird immer nur ein ai-Kanal abgetastet. Die dadurch verringerte Update-Rate stört nicht. Das funktioniert so: jeder der 16 ai-Kanale erhält einen eigenen Task, und die Tasks werden sequentiell gestartet und gestoppt. (Nicht immer alle 16 Kanäle, die Kanäle lassen sich ein/ausschalten, außer hat man die Möglichkeit, nur X oder nur Y darzustellen.) Das funktioniert alles bestens, und jetzt bin ich dabei, das Ganze auf DAQmx umzustellen, um auch die preisgünstigen Karten der M-Serie verwenden zu können. Und da hat mich der Ergeiz gepackt, bei dieser Gelegenheit auch noch einen kleinen Mangel abzustellen. Es geht um die "gleichzeitige" Darstellung von X und Y, wobei die Reihenfolge immer so ist: eine Ein Kanal X, Ein Kanal Y, Ein Kanal X... bis alle Kanäle durch sind, dann wieder von vorn. Der kleiner Schönheitsfehler, der bislang besteht, ist der: Da es mir nicht gelang, ao so in zwei Tasks aufzuspalten, so wie das bei ai möglich ist, werden immer beide Achsen gleichzeitig stimuliert. D.H der X-Spiegel bewegt sich unötigerweise auch dann, wenn gerade der Y-Kanal dran ist mit messen. Stört nicht weiter, führt aber bei längerem Betrieb und stressigen Sprungfunktionnen zu unnötiger zusätzlicher Erwärmung des Scanners. Natürlich kann man a0 immer neu initialissieren, aber das wäre unschön, denn wenn schon sequentielle Abtastung, dann wenigsten so zügig hintereinander wie möglich. Für jeden Analog-Output eigene Task einrichten - cb - 12.07.2006 16:51 ' schrieb:[...] mal ne ganz blöde Frage: warum machst du nicht alles komplett paralell? kontinuierlicher Task für alle AIs, kontinuierlicher Task für alle AOs und du pickst dir "nur" die Häppchen raus, die du brauchst? Grüße CB Für jeden Analog-Output eigene Task einrichten - Lucki - 13.07.2006 13:06 ' schrieb:mal ne ganz blöde Frage: warum machst du nicht alles komplett paralell?Warum nicht komplett parallel? 1.) Ich brauche max. 200kHz Abtastrate pro Kanal, und ich möchte keine teuren Messkarten verwenden, die ein Vielfaches dieser Abtastrate haben müßten, wenn die Kanäle gemultiplext würden. Was ich mache, ist zwar auch ein Mutiplexing, aber eines von anderer Art: A) Normales Multiplexing: alle 1. Datenpunkt aller Kanäle, alle 2. Datenpunkte aller Kanäle.... B) Luckisches Multiplexing: alle Datenpunkte Kanal1, alle Datenpunkte Kanal 2... Vorteil von B: (i) Die max. Abtastrate wird durch das Multiplexing nicht herabgesetzt; (ii) es gibt keine Probleme mit Übersprechen zwischen den Kanälen; (iii) es gibt keine Zeitverzögerungeen (Phasenfehler) zwischen den einzelnen Kanälen. Nachteil von B: Die Gesamt-Erfassungszeit für einen Vorständigen Scan über alle Kanäle ist Einzelscanzeit * Kanalzahl. Also wenn der Scan normal 50 mal dauert, brauche ich über alle 10 Kanälen 500ms. Um diesen Nachteil nicht unnötig zu vergrößern, ist es sinnvoll, den Scan nur über die Kanäle zu machen, die man wirklich braucht. Nicht sinnvoll wäre es, immer alle Kanäle zu scannen und dann in den Diagrammen und Auswertungen nur die aktivierten Kanäle zu benutzen. Warum keine kontinuierliche Abtastung? Im Prinzip wäre es möglich, den Generator mit den Sprungfunktionen, der auch den Master-Takt für den ADC liefert, kontinuierlich durchlaufen zu lassen. Praktisch läuft es auch so, man sieht es am Test-Oszilliskop nicht, daß der Generator zwischen 2 Scans einen Pause einlegt. Es könnte aber bei kontinuierlicher Betriebsweise zu Komplikationen kommen, und zwar dann, wenn der PC langsam ist und die Fourier-Operationen und andere Auswertungen etwas länger daueren. Dann könnte es zu einem Datenstau kommen, so wie ich es jetzt mache ist das ausgeschlossen. Für jeden Analog-Output eigene Task einrichten - cb - 13.07.2006 17:04 ' schrieb:1.) Ich brauche max. 200kHz Abtastrate pro Kanal, und ich möchte keine teuren Messkarten verwenden,jut, das is ein Argument, das ich nachvollziehen kann <Schwabe=ON> ' schrieb:B) Luckisches Multiplexing:LOL, jau, okeh ... got it |