Hallo zusammen,
ich schreibe die Software für einen Prüfstand in Labview. Es gibt bis jetzt einen Task, der mehrere Spannungen einliest und zwei Tasks, die eine Spannung ausgeben. Die Tasks sind jeweils SubVis. Das funktioniert in der im letzten Bild gezeigten Programmversion sehr gut. Als nächsten Schritt möchte ich nun den Ausgabetask "Drehmoment Soll" in eine Casestruktur bringen, da es hier verschiedene Anwendungsfälle gibt. Sobald ich die Casestruktur jedoch einfüge, bekomme ich abwechselnd an allen Tasks die Fehlermeldung: "Der Task kann keine Kanäle mit dem angegebenen Kanaltyp enthalten, da der Task bereits Kanäle eines anderen Kanaltyps enthält". Der in der Casestruktur versteckte Task wurde in diesem Fall noch gar nicht aktiviert. Ich verstehe nicht, was das Problem ist. Vielleicht kann hier jemand Licht ins Dunkel bringen
Zum besseren Verständnis habe ich noch das Hauptprogramm mit Casestruktur und Fehlermeldung (erstes Bild) und die SubVis "Messen" (zweites Bild), "Drehmoment Soll" (drittes Bild) und "Durchfluss Soll" (viertes Bild) angehangen.
Würde mich freuen, wenn mir jemand weiterhelfen kann.
MfG Dron
Hallo Dron,
du willst uns hoffentlich nicht weismachen, dass du diese ganzen Tasks ständig neu anlegst, einmal Werte liest/schreibst und dann sofort wieder löscht? Dauernd?
Hast du dir mal die mit LabVIEW mitgelieferten Beispiel-VIs angeschaut, wie die sowas machen?
Zum Problem:
Die Fehlermeldung scheint doch eindeutig, da ist ein unpassender Kanal im Task. Leider hast du nicht die volle Fehlerbeschreibung gezeigt, das wäre jetzt hilfreich gewesen…
Anscheinend willst du in einem AI-Task irgendwelche AOs unterbringen (oder umgekehrt)!
Sonst so:
- Was soll es bringen, einen PID-Regler mal eben über ein Messwert-Array rennen zu lassen und dann die Stellwerte einen nach dem anderen ausgeben zu lassen? Funktioniert ein Regler üblicherweise auf diese Art?
- Warum erstellst du nicht ebenso nur einen AO-Task (mit mehreren Kanälen) wie du auch nur einen AI-Task hast?
- VIs anhängen ist meist sinnvoller als nur irgendwelche Bilder…
Hallo GerdW,
danke für deine Antwort. Damit der Task nicht ständig neu erstellt und wieder gelöscht wird, würde ich normalerweise eine while-Schleife um das Lesen/Schreiben-VI ziehen. Da ich jedoch innerhalb eines Sub-VI keine while-Schleife benutzen kann, siehe mein anderes Thema
http://www.labviewforum.de/Thread-Spannu...enausgabe, ist hier der gesamte Task innerhalb der Schleife. Ich verstehe dass das keine sehr schöne Lösung ist, habe jedoch keine bessere Idee, um eine kontinuierliche Messung zu erhalten. Was ist dein Vorschlag? Die SubVI-Struktur ist zur Übersichlichkeit wichtig, da noch ein PWM und eine digitale Ausgabe sowie eine Drehzahlmessung hinzukommen.
Zum Problem: Ich habe verstanden, dass ein unpassender Kanaltyp im Task ist. Nur, wo kommt dieser her? Meine Tasks sind doch eindeutig voneinander getrennt.
Morgen kann ich auch die VIs noch hochladen.
Zum Regler: Ich regle damit eine Drehmomentbremse, deren Kennlinie nicht linear ist. War das die Frage?
Und zum AO-Task: Meine USB-Karte hat zwei analoge Ausgänge, wovon einer immer gebraucht wird, um einen Gasdurchflussregler anzusteuern. Mit dem zweiten soll entweder die Drehmomentbremse oder eine elektrische Last gesteuert werden, deswegen auch die Case-Struktur. Zwei Tasks habe ich aus rein praktischen Gründen gemacht, um nicht bei den jeweiligen Cases immer wieder den Gasdurchflussregler dabei zu haben. Ist es nicht sehr gut, gleichzeitig zwei AO-Tasks zu haben? Leider gibt es sehr wenig Beispiele mit mehreren Tasks. Gibt es vielleicht irgendwo eine Wissenssammlung dazu?
MfG Dron
Hallo Dron,
Zitat:habe jedoch keine bessere Idee, um eine kontinuierliche Messung zu erhalten.
Dir wurde doch schon in deinem anderen Thread angeraten, sowas aufzusplitten in 3 Teile: ein subVI für's INIT, eines zum Werte lesen/schreiben, eines zum Aufräumen.
Und die While-Loop gehört um die Hauptroutine herum…
Zitat:Ich habe verstanden, dass ein unpassender Kanaltyp im Task ist. Nur, wo kommt dieser her?
Wie soll man das anhand von Bildern klären?
Zitat:Zum Regler: Ich regle damit eine Drehmomentbremse, deren Kennlinie nicht linear ist. War das die Frage?
Nein.
Es ist mir unklar, wieso man mehrere Messwerte durch einen Regleralgorithmus jagt, wenn dessen Stellwert(e) erst wesentlich später ausgegeben werden!
Zitat:Und zum AO-Task: Meine USB-Karte hat zwei analoge Ausgänge, wovon einer immer gebraucht wird, um einen Gasdurchflussregler anzusteuern. Mit dem zweiten soll entweder die Drehmomentbremse oder eine elektrische Last gesteuert werden, deswegen auch die Case-Struktur.
Ich gehe davon aus, dass beide Geräte einen eigenen Anschalter/Sicherung/Freigabe besitzen. Es sollte deshalb unproblematisch sein, ständig zwei Analogwerte auszugeben. Notfalls kannst du ja den zweiten Analogwert auf Null setzen…
Hallo,
Zitat:Wie soll man das anhand von Bildern klären? Hmm
ich habe mal meine VIs angehangen.
Ich sollte vielleicht dazu sagen, dass dies mein erstes LabVIEW-Programm. Ich überarbeite ein Programm, was ein Kollege vor 2 Jahren geschrieben hat, ohne SubVIs.
Danke soweit für die Hilfe, ich werde nun erstmal die Lösungsvorschläge abarbeiten.
Zitat:wenn dessen Stellwert(e) erst wesentlich später ausgegeben werden!
Das war mir gar nicht bewusst. Ich muss mich wohl noch mehr mit der Thematik auseinandersetzen. Kannst mir kurz erklären, warum das so ist? Das wäre sehr hilfreich für mich. Ich messe doch kontinuierlich ein Sample, und gebe kontinuierlich Samples wieder aus?
Zitat:Ich gehe davon aus, dass beide Geräte einen eigenen Anschalter/Sicherung/Freigabe besitzen. Es sollte deshalb unproblematisch sein, ständig zwei Analogwerte auszugeben. Notfalls kannst du ja den zweiten Analogwert auf Null setzen…
Darin sehe ich auch kein Problem. Aber kann ich denn in einem Task zweimal den selben Kanal haben?
Hier noch der verwendete Regler.
Hallo Dron,
Zitat:Ich messe doch kontinuierlich ein Sample, und gebe kontinuierlich Samples wieder aus?
Ja, das fiel mir jetzt auch auf. Aber warum verwendest du dann als Datentyp Waveforms, wenn es sich immer nur um Einzelwerte (pro Kanal) handelt?
Und warum verwendest du dann bei den DAQmx-Zugriffen den Modus "N Kanäle, N Samples" statt dort "N Kanäle, 1 Sample" einzustellen?
Ich habe erste Vereinfachungen an den VIs vorgenommen, siehe Attachment.
Was du noch selbst machen musst:
- Wie oben beschrieben, die ganzen DAQmx-Zugriffe aufteilen in einzelne INIT, READ/WRITE, CLOSE-subVIs. In der Hauptschleife werden dann nur READ/WRITE aufgerufen!
- Momentan wird dein AI-Lesen zweimal aufgerufen, einmal im Haupt-VI und einmal in der Regelschleife. D.h. die Regelschleife bekommt nur jeden zweiten Messwert mit!
Deshalb sollte die Regelschleife den aktuellen Messwert vom Haupt-VI mitgeteilt bekommen und diesen nicht extra abfragen!
- Ich halte es für ungünstig, im "Messen-VI" die ganzen Messwerte auf einzelne Charts aufzudröseln. Ein subVI sollte eine genau umrissenen Aufgabe haben, hier das Erfassen der Messwerte. Welcher Messwert wie und wo weiterverwendet wird, entscheidet sich an anderer Stelle im Programm und braucht das Messen-VI nicht zu interessieren. Außerdem wird das ConnectorPane dann deutlich aufgeräumter!
Zitat:Darin sehe ich auch kein Problem. Aber kann ich denn in einem Task zweimal den selben Kanal haben?
Wieso zweimal? Der Task besteht aus den Kanäle ao0 und ao1! Nur über deine externe Verdrahtung entscheidest du doch, was mit dem Wert von ao1 dann angesteuert wird…
Hallo GerdW,
Ich habe nun eine neue Programmstruktur nach deinem Vorschlag, sie gefällt mir viel besser, danke dafür! Nun gibt es jedoch ein neues Problem. Ich habe einen AO-Task mit 2 Kanälen erstellt, bekomme jedoch keinen Output. Im Anhang das Programm...
Du legst den AO Task nur mit einem Kanal an, deshalb meckert die DAQmx Write Funktion:
Error -200524 occurred at Prüfstand.vi
Possible reason(s):
Write cannot be performed, because the number of channels in the data does not match the number of channels in the task.
When writing, supply data for all channels in the task. Alternatively, modify the task to contain the same number of channels as the data written.
Number of Channels in Task: 1
Number of Channels in Data: 2
Task Name: _unnamedTask<3>
D.h. ändere dein Ini_Ausgabe analog zu Ini_Messen ab und es sollte funktionieren.
Zusätzlich:
In den beiden VIs sollten die Schieberegister an den FOR-Schleifen für Task und Fehlercluster initialisiert werden, leere Konstanten reichen.
Jetzt gehts, danke. LabVIEW erstellt die Schieberegister nicht automatisch, weshalb ich es mit dem Array indizieren probiert hatte...
Vielen Dank an dieses tolle Forum! Ich werde mein gesamtes Programm hochladen, sobald es fertig ist.