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!
Habe ein Sub VI gebaut, indem eine While Schleife abgearbeitet wird.
Diese Sub VI binde ich nun in mein Haupt VI ein.
Welche Möglichkeiten gibt es, dieses Sub VI zu beeinflussen. Mein Problem ist ja, dass die While Schleife im SubVI erst bis zur Abbruchbedingung durchgeführt wird, bevor etwas anderes geschehen kann.
Ich würde gerne aktuelle Werte aus diesem Sub VI ins Haupt VI übernehmen und auch z.B. von außen eine Stopanweisung schicken können.
Der Antwort von Achim füge ich noch die Referenzen hinzu!
Ist noch nicht allzulange her, da haben wir einen ähnliche Frage hier gehabt!
Such mal danach!
<div align="left">Hallo, danke für die Hinweise, ich habe es mit den von Euch genannten Möglichkeiten versucht, leider verstehe ich nur die Verwendung von globalen Variablen.
Ich habe mal ein SubVI und ein MainVI angefügt.
Könnt Ihr bitte mal so nett sein und diese VIs so umschreiben, dass ich im MainVI bei laufendem Programm die I32 Werte aus dem SubVI sehen kann. Des Weiteren soll der Stop Button aus dem MainVI die Schleife im SubVI stoppen. (mittels Notifier, Occurence und Reference)
Vielleicht verstehe ich es endlich anhand eines Beispiels.
was hast du denn eigentlich vor? Wie du schon richtig gesagt hast, läuft das übergeordnete VI nicht, wenn erst mal ins SubVI gesprungen wurde. Da wird auch kein Abbruchbefehl mehr akzeptiert, es sei denn, dieser wird direkt im SubVI gegeben. Da geht allerdings nur wenn
1. ...das Frontpanel des SubVIs geöffnet ist und dort z.B. ein Stop-Button verfügbar ist
oder
2. ....das SubVI in einer parallel zur Hauptschleife liegenden While-Schleife abgearbeitet wird. Dann kann man aus der Hauptschleife heraus z.B. einen Befehl über ein globale Variable oder über eine Queue etc. verschicken!
Alternativ könntest du die Abarbeitung des SubVI auch in einem immer wiederkehrenden Schritt einer State Machine abarbeiten.
Gruss
Achim
"Is there some mightier sage, of whom we have yet to learn?"
"Opportunity is missed by most people because it is dressed in overalls and looks like work." (Thomas Edison)
<div align="left">Mein Vorhaben ist folgendes. Ich habe einige Regelalgorithmen entwickelt, die ich jeweils in ein SubVI verpackt habe. Diese würden auch autonom laufen. (Diese Algorithmen direkt ins Hauptprogramm zu packen würde eine übles Durcheinander verursachen) Jetzt möchte ich ein Hauptprogramm erstellen, in dem einer der von mir erstellten Regelalgortihmen angewählt werden kann.
Die Werte des jeweiligen Reglers, sprich ISTwerte etc. möchte ich gerne in meinem MainVI angezeigt bekommen. Und durch ein Stopbutton soll der jeweilige Regelalgorithmus gestoppt werden. Das ist eingentlich schon alles.</div>
26.09.2006, 12:13 (Dieser Beitrag wurde zuletzt bearbeitet: 26.09.2006 12:24 von Achim.)
Irgendwie hab ich's nicht geblickt! Was bringt die Verdrahtung ins SubVÌ? Wenn im SubVI die Schleife läuft, wird das HauptVI, welches das SubVI enthält, auf jeden Fall so lange angehalten, bis das SubVI beendet ist. D.h. es werden vom HauptVI keine Eingaben ins SubVI übernommen!
Kleiner Tip: Wenn du die Referenz des "stop from mainVI" mit gedrückter Strg-Taste vom Blockdiagramm des HauptVI aufs Frontpanel des SubIV ziehst, erhälst du eine "strict refnum" (sichtbar am Sternchen auf dem FP) und du kannst dir die "Variant to Data"-Wandlung sparen!
So ne ähnliche State Machine könntest du auch aufbauen, und in nem State "regeln" könntest du die VIs immer wieder ablaufen lassen...dazu könntest du z.B. die While-Schleife im jeweiligen Regler-VI nur genau 1x pro "Durchgang" laufen lassen (ne F-Konstante an den "Continue if true"-Anschluss der Schleife), und Parameter, die du von Regelzyklus zu Regelzyklus in deinem VI benötigst über nicht initialisierte Schieberegister durchschleifen. Wenn von außen "Regelung aus" betätigt wird, springst du den Fall "regeln" einfach nicht mehr an.
"Is there some mightier sage, of whom we have yet to learn?"
"Opportunity is missed by most people because it is dressed in overalls and looks like work." (Thomas Edison)
<div align="left">Also die Variante von StefanHH funktioniert soweit erstmal, danke dafür.
@Achim
natürlich interessiert mich, wie Du das genau realisieren willst, mit dem Beispiel im Link komme ich nicht ganz klar.
Angenommen in meiner While Schleife im SubVI habe ich eine Variable XX. Diese wird in jedem Schleifendurchgang um 1 Inkremetiert. Durch ein Shiftregister wird der Wert in den nächsten Schleifendurchgang überführt. Wie meinst Du das, dass die Schleife nur einmal durchlaufen werden soll (im SubVI). Demnach müsste ich (wenn ich das richtig verstanden habe) dieses SubVI dann im MainVI wieder in eine While Schleife packen. Wie aber übergebe ich dann die "alten" Werte des SubVI Schleifedurchlaufs an den nächsten ohne das diese verloren gehen?
Kannst Du mir bitte ein simples Beispiel dafür geben?</div>
Ich habe wie Du gesagt hast, im SubVI nur einen Schleifendurchlauf. Alle Parameter die in den folgenden Schleifendurchlauf müssen habe ich gebundled und als Ausgang definiert. Diese Bundle kommt auch wieder als Eingang ins SubVI rein.
Im MainVI habe ich jetzt eine while-Schleife um mein SubVI gelegt mit Shiftregistern durch das, das Bundle durchgeführt wird. So kann ich jederzeit via unbundle by name die gewünschten Werte rausziehen, die ich angezeigt bekommen möchte.
Manchmal braucht man halt für ein einfaches Problem ein paar einfache Denkanstöße.