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 bin neu bei der LabVIEW-Programmierung. Dabei ist folgendes (eher grundsätzliches) Problem aufgetreten:
Ich möchte gerne in einem Hauptprogramm mehrere Unterprogramme (gleichzeitig) aufrufen. Leider musste ich feststellen, dass die Ausführung des Hauptprogramms so lange unterbrochen wird, bis das aufgerufene SubVI wieder geschlossen wird. Wie kann man das Programm dazu bringen, direkt nach dem Aufruf des SubVIs weiterzuarbeiten, unabhängig vom SubVI. Lassen sich auch mehrere gleichzeitig öffnen?
Viele Grüße
Thomas
P.S.: Ich hab leider auf die Schnelle keinen Beitrag gefunden, der so ein Problem beschreibt. Falls es so einen schon gibt, sag ich gleich sorry für die schlechte Suche...
Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN
71083
Deutschland
Hauptprogramm weiter ausführen bei SubVI-Aufruf
Parallele Schleifen in Deinem MainVI sollten helfen.
Gruß Markus
-------------------------------------------------------------------------- Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
' schrieb:Leider musste ich feststellen, dass die Ausführung des Hauptprogramms so lange unterbrochen wird, bis das aufgerufene SubVI wieder geschlossen wird.
Und das ist auch gut so, denn das ist das Datenflussprinzip. Wenn du Applikationen mit LabVIEW erstellen möchtest rate ich dir, dich ersteinmal mit den Basics zu beschäftigen (was ist das Datenflussprinzip, wie werden Daten übergeben...).
Zu deiner Frage: die hat Y-P schon beantwortet.
26.07.2010, 11:04 (Dieser Beitrag wurde zuletzt bearbeitet: 26.07.2010 11:05 von Falk.)
' schrieb:Und das ist auch gut so, denn das ist das Datenflussprinzip. Wenn du Applikationen mit LabVIEW erstellen möchtest rate ich dir, dich ersteinmal mit den Basics zu beschäftigen (was ist das Datenflussprinzip, wie werden Daten übergeben...).
Zu deiner Frage: die hat Y-P schon beantwortet.
Manchmal kommt es aber auch darauf an, was man genau möchte. Es gibt Situationen da brauch man das Datenflussprinzip in der Form gar nicht. Spontan fällt mir da die Gerätesteuerung eines unabhängigen Gerätes ein. Über die Hauptapplikation soll nur das zugehörige Steuerungsprogramm aufgerufen werden. Dieses und die Hauptapplikation laufen dann parallel einfach vor sich hin und müssen dann eventuell nicht einmal Daten miteinander austauschen.
@Thomas
Alternativ kannst du deine SubVIs auch mittels VI-Referenz und "Invoke Node" aufrufen. Dort kannst du bestimmen, ob deine Hauptapplikation bis zur Beendigung deines Unterprogramms wartet oder mit der Ausführung weiter macht. Vorausgesetzt du hast keinen direkten Datenfluss zwischen beiden Schichten.
Es gibt dazu 2 Möglichkeiten. Die erste hat Markus schon genannt, allerdings braucht man dazu nicht mehrere Schleifen. Das betreffende SUB-VI braucht keine Schleife, man platziert es einfach frei im Raum neben der Hauptausführungsschleife. Am Ausgang sollte nichts angeschlossen sein. Es wird dann bei Start das Programms ausgeführt, Beenden über Melder oder globale Variable.
Wesentlich flexibler ist der Aufruf des SUB-VI über Referenzen, hier mal ein Beispiel wie das aussieht:
Es wird das SubVI "Skalieren" ausgeführt.
Hierbei gibt es durchaus die Möglichkeit, das VI aufzurufen ohne daß anschließend gewartet wird bis das VI beendet ist (Siehe rechts die Methode "VI ausführen, Warten bis beendet = false). Es gibt da sogar noch mehr an Zauberei: Man kann vom Haupt-VI aus jedes Bedienelement betätigen und jede Anzeige lesen, und zwar ohne daß im Sub-VI diese Elemente überhaupt am Connektor-Ikon angeschlossen sind.
' schrieb:Manchmal kommt es aber auch darauf an, was man genau möchte. Es gibt Situationen da brauch man das Datenflussprinzip in der Form gar nicht. Spontan fällt mir da die Gerätesteuerung eines unabhängigen Gerätes ein. Über die Hauptapplikation soll nur das zugehörige Steuerungsprogramm aufgerufen werden. Dieses und die Hauptapplikation laufen dann parallel einfach vor sich hin und müssen dann eventuell nicht einmal Daten miteinander austauschen.
Man sollte trotzdem die Basics kennen. Nur dann weiss ich auch in welcher Situation welcher Lösungsanatz der bessere ist. Außerdem sollten auch parallel laufende Threads wieder Datenflusskonform programmiert sein, sonst sollte man es lassen LabVIEW zu verwenden.
Nochmal zur Konkretiesierung des Problems. Ich habe eine Hauptapplikation, bei der immer bestimmte Werte von Messgeräten ausgelesen werden müssen. Diese werden allerdings nur angezeigt und werden von den SubVIs nicht benötigt. Daher kann der Datenfluss vernachlässigt werden.
Ich möchte SubVIs starten, damit das Programm übersichtlicher wird. Wenn man einzelne Programme verwendet, muss man sie jeweils immer einzeln starten. Hat man das ganze in einem Programm mit einer Oberfläche, wird es sehr schnell unübersichtlich.
@ Lucki:
Was ist das für ein VI? Ist das bei den Beispielen dabei? Oder könntest du es bitte hochladen?
' schrieb:Nochmal zur Konkretiesierung des Problems. Ich habe eine Hauptapplikation, bei der immer bestimmte Werte von Messgeräten ausgelesen werden müssen. Diese werden allerdings nur angezeigt und werden von den SubVIs nicht benötigt. Daher kann der Datenfluss vernachlässigt werden.
Falsch. Selbst wenn man Daten anzeigt, fliessen diese von einer Quelle zu einer Senke. Der Datenfluss ist allgegenwärtig, da LabVIEW diesen als Programmparadigma vorgibt.
' schrieb:Ich möchte SubVIs starten, damit das Programm übersichtlicher wird. Wenn man einzelne Programme verwendet, muss man sie jeweils immer einzeln starten. Hat man das ganze in einem Programm mit einer Oberfläche, wird es sehr schnell unübersichtlich.
Das ist durchaus löblich, aber ich denke Luckis Vorschlag ist für deine Erfahrung eventuell noch nicht zu empfehlen. Versuche es doch mit parallelen Schleifen oder SubVIs. Denn genau das was du machen willst ist eine große Stärke von LabVIEW - Abeistabläufe zu parallelisieren.
26.07.2010, 14:55 (Dieser Beitrag wurde zuletzt bearbeitet: 26.07.2010 15:43 von Y-P.)
' schrieb:@ Lucki:
Was ist das für ein VI? Ist das bei den Beispielen dabei? Oder könntest du es bitte hochladen?
Das tut eigentlich nichts zur Sache. Die Ereignisstrkuktur befindet sich im recht umfangreichen Hauptprogramm, und was das für ein Sub-VI ist, ist doch völlig egal. Ich mache Dir umgekehrt den Vorschlag, daß Du Dein (möglichst vereinfachtes) Sub-Vi mal postest und wir zeigen Dir, wie man das vom Haupt-VI aus startet und stoppt, ohne daß in der Zwischenzeit das Haupt-VI pausiert.
Die Referenzmethode habe ich glaube ich mal von Jens gelernt, es müßte da ein Beispiel von ihm geben. (Mit der Forums-Suchmaschine tue ich mich schwer, suche mal selbst. Man ist da auch von der Super-Intelligenz von Goggle in dieser Hinsicht zu sehr verwöhnt)
Eine ganz klassische Anwendnung für das gleichzeituge Laufen von 2 VIs ist ja die Erzeuger-Verbraucher-Struktur. Meist will man am Verbraucher etrwas sehen und bedienen, der Erzeuger läuft im Hintergrund. Hier Beispiel: Der Erzeuger ist das Sub-VI, es wird außerhalb der Haupschleife des Haup-VI gestartet. Daß es nicht beendet wird, stört nicht, die Hauptscheife funktioniert trotzdem. Die Datenübertragung erfolgt über eine Melder vom SubVI zum HauptVI.
Gestoppt wird das SUB-VI bei Beenden das Haupt-VIs so: Es wird im Haup-VI der Melder zerstört. Das erzeugt einen Fehler im Sub-VI, der Fehler stoppt das Sub-VI. (Das ist nicht die allereleganteste Methode, aber es funktioniert)
LV-Version: Was 2008 aktuell war.
Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN
71083
Deutschland
Hauptprogramm weiter ausführen bei SubVI-Aufruf
Hab' Dir die VI-Version hinzugefügt.
Die findest Du übrigens mit "VI Properties" -> "List unsaved changes" heraus.
Gruß Markus
-------------------------------------------------------------------------- Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------