Sofortiger Stop einer While-Schleife in einer SubVi durch MainVi
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!
11.05.2010, 17:49 (Dieser Beitrag wurde zuletzt bearbeitet: 11.05.2010 17:49 von bluesaturn.)
Sofortiger Stop einer While-Schleife in einer SubVi durch MainVi
Guten Abend, Forum.
Ich versuche gerade ein SubVi "Autofill_v6_LV2009.vi" in mein Main.Vi "Experiment_v1.vi" einzubinden.
Autofill_v6_LV2009.vi beinhaltet eine While-Schleife, die meine Pumpe oszillieren laesst. Ich habe mich fuer eine While-Schleife mit hochzaehlendem i entschieden, weil ich hier in einem Thread gelesen habe, dass man for loops nicht abbrechen kann bzw. aus ihnen fruehzeitig herausspringen kann.
Ich habe mich also erstmal an dieser SubVi versucht und eine Stop eingebaut. Ziel war es, die Pumpe zuverlaessig sofort anzuhalten und schnellstens den while-loop zu beenden.
Das klappt aber nur bedingt. So wie das Autofill_v6_LV2009.vi jetzt ist, passiert folgendes:
Ich druecke den Stop-Button und mind. ein oder sogar zwei Durchlaeufe der while-Schleife werden erst noch absolviert, bevor die Pumpe stoppt. Ich weiss nicht, wie ich das in einen sofortigen Stop der while-Schleife abaenden kann.
Die Stop.vi ist notwendig, der Pumpe mitzuteilen, dass sie anhalten soll. Wenn man diese vi nicht drin hat, dann hoeren die Richtungswechsel auf, aber die Pumpe faehrt einfach weiter in dieselbe Richtung, was verhindert werden muss.
Zweites Problem:
Ich habe verucht, "Autofill_v6_LV_2009.vi" in meine Main.vi einzubauen. Autofill_v6_LV2009.vi ist in einer Eventstruktur innerhalb der Main eingebettet, weil sie nur nach Druecken des KNopfes "Jiggle M1" ausgeloest werden soll.
Naiv dachte ich, ich kann einen Stop-Button (Stop inner, z.B.) einfach in die SubVi uebertragen. Man verdrahtet einen Stop-Button mit dem Eingang der SubVi und dann wird das Signal in der SubVi an die richtige Stelle geleitet.
Das klappt leider gar nicht.
Folgendes passiert: Druecke "Jiggle M1", Pumpe wackelt. Will ich vorher den Stop-Button druecken, reagiert das Programm gar nicht darauf. Jiggle-Mode wird beendet und ich kann nicht mal mehr erneut auf "Jiggle M1" druecken.
Wie im letzten Thread wollte ich nicht 10 Stop-Buttons, wenn ich 10 verschiedene Bewegungen mit der Pumpe ausfuehren muss.
Letzte Frage, aber erstmal nicht so wichtig: Da ich bis vor kurzem keinen Zugang zur Evenstruktur hatte, musste ich diese ersatzweise aus einer while-loop und case-Strukturen zusammenbauen. Ich habe die Eventstruktur fuer die Jiggle-Methode jetzt in die innere Schleife gesetzt, damit ich die Verdrahtung fuer ressource und error beibehalte, aber muss das wirklich sein? Kann diese Evenstruktur auch ausserhalb der inneren while-Schleife sein?
Ich bedanke mich fuer jegliche Hineweise und entschuldige mich, dass ich es nicht besser verstehe.
Gruss
Blue
Anzeige
11.05.2010, 18:34 (Dieser Beitrag wurde zuletzt bearbeitet: 11.05.2010 18:38 von IchSelbst.)
Sofortiger Stop einer While-Schleife in einer SubVi durch MainVi
' schrieb:Ich druecke den Stop-Button und mind. ein oder sogar zwei Durchlaeufe der while-Schleife werden erst noch absolviert, bevor die Pumpe stoppt.
Das kann ich nachvollziehen.
Die erste Operation, die in der While-Schleife gemacht wird, ist das Auslesen des Stopp-Buttons ("Stop Jiggle M1" im SubVI "Autofill_v6_LV_2009.vi"). Danach wird der Rest der While-Schleife bearbeitet. Am Ende der While-Schleife wird der Wert des Stopp-Buttons überprüft => ggf. Ende.
Wenn du den Button genau zu dem Zeitpunkt anklickst, nachdem der Button ausgelesen wurde - läuft die While-Schleife noch genau zweimal durch. Du kannst folgendes probieren: Genau zu dem Zeitpunkt, wenn der Button ausgewertet werden soll, wird er auch auslesen. Also: Erst wenn die While-Schleife (fast) komplett abgearbeitet ist, wird der Stopp-Button ausgelesen. Das kann man durch eine Sequenzierung (notfalls mittels einer Sequenzstruktur) erreichen.
Zitat:Die Stop.vi ist notwendig, der Pumpe mitzuteilen, dass sie anhalten soll.
Klar.
Aber den Aufruf dieses SubVIs kann man außerhalb der While-Schleife machen. Das spart den IF-Case in der Schleife.
Zitat:Ich habe verucht, "Autofill_v6_LV_2009.vi" in meine Main.vi einzubauen.
Ich glaube, so wird das nix.
Zwei Event-Strukturen in einem VI soll man nicht machen.
Zitat:Man verdrahtet einen Stop-Button mit dem Eingang der SubVi und dann wird das Signal in der SubVi an die richtige Stelle geleitet.
Das klappt leider gar nicht. Du darfst nicht den Button verdrahten, sondern musst eine Referenz auf den Button übergeben.
Warum setzt du das SubVI "Autofill_v6_LV_2009.vi" nicht auch in einen IF-Case wie "Withdraw Control" auch?
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Sofortiger Stop einer While-Schleife in einer SubVi durch MainVi
Wie man die Schleife sofort beendet und wie man sie vom Haupt-VI aus beendet sind 2 verschiedene Fragen. Ich gebe hier nur mal einen Tip zur ersten Frage:
Ereignisstruktur verwenden mit 2 Cases: Timeout und Stop.
Im Timout-Case befindet sich eine Zustandmaschine mit 2 Zuständen, entsprechend den beiden Zuständen der Pumpe.
Im Stop-Case findet wird die Pumpe gestoppt.
Ich habe mit dem VI nur das Gerüst skizziert.
Der Hauptgedanke ist, daß die Wartezeiten als Timeouts realsiert sind und nicht als Waits. Nur so wirkt der Stop sofort.
lv2009
Pumpe.vi (Größe: 9,53 KB / Downloads: 489)
Sofortiger Stop einer While-Schleife in einer SubVi durch MainVi
Hallo IchSelbst und Lucki,
danke zunächst für Eure Antworten und Hinweise.
Da habe ich mich ja wieder schön in die Nesseln gesetzt. Ich dachte, das wäre einfacher :-) Weit gefehlt.
Vorabbitte: Ich kann es zuhause gerade nicht testen, erst wieder am Freitag.
' schrieb:Das kann ich nachvollziehen.
Die erste Operation, die in der While-Schleife gemacht wird, ist das Auslesen des Stopp-Buttons ("Stop Jiggle M1" im SubVI "Autofill_v6_LV_2009.vi"). Danach wird der Rest der While-Schleife bearbeitet. Am Ende der While-Schleife wird der Wert des Stopp-Buttons überprüft => ggf. Ende.
Wenn du den Button genau zu dem Zeitpunkt anklickst, nachdem der Button ausgelesen wurde - läuft die While-Schleife noch genau zweimal durch. Du kannst folgendes probieren: Genau zu dem Zeitpunkt, wenn der Button ausgewertet werden soll, wird er auch auslesen. Also: Erst wenn die While-Schleife (fast) komplett abgearbeitet ist, wird der Stopp-Button ausgelesen. Das kann man durch eine Sequenzierung (notfalls mittels einer Sequenzstruktur) erreichen.
Ich verstehe jetzt besser, wie die while-Schleife abläuft.
Besteht trotzdem nicht die Möglichkeit, die while-Schleife an jeder beliebigen Stelle sofort zu unterbrechen? Edit: Das sehe ich dann wohl bei Lucki.
Wenn ich das richtig sehe, schlägst du vor, daß die while-Schleife mindestens einmal fast komplett abgearbeitet wird?
' schrieb:.
Aber den Aufruf dieses Stop-SubVIs kann man außerhalb der While-Schleife machen. Das spart den IF-Case in der Schleife.
Wäre das in etwa eine Bedingung wie "Die Schleife bricht ab, als fuehre die Stop.vi aus?"
Ich glaube sogar, daß diese Stop.vi vielleicht nicht mal in der Autofill_v6_LV_2009.vi sitzen muss. In der Experiment.vi gibt es ja schon einen Stop-Button, der dort die innere Schleife abbricht und somit die Pumpe anhält. (Ich wollte ja viele Stop-Buttons vermeiden). Nur muß ich noch herausfinden, wie ich das Signal von der SubVi in die Main.vi übertrage.
Edit: Ah, ich sehe es gerade in deinem Bild. Die Schleife bricht ab und wegen Datenfluß wird die Pump via Stop.vi angehalten. Ist das korrekt?
Außerdem könnte ich ja diese Referenz vielleicht mit dem anderen Stop-Button aus der Main.vi verknüpfen. Wie du sagst, von außen abbrechen ...
Grundsätzliche Frage: Ich dachte, ich kann Sub.Vis mehr oder weniger unabhängig von Main.vis bauen und diese dann in die Main.vi einfügen. Das erscheint mir jedoch nun eine schlechte Idee, weil man viel zu viel ändern muss. Richtig?
' schrieb:.
Warum setzt du das SubVI "Autofill_v6_LV_2009.vi" nicht auch in einen IF-Case wie "Withdraw Control" auch?
Das hatte ich zuvor auch gemacht, aber dann dachte ich mir, ich könnte ja mal die event structure benutzen
Zum Bild:
IchSelbst, ich habe mir das Bild gerade angeschaut und werde es dann nachbauen. Ich glaube, der grüne error-Draht ist für die Sequenzierung verantwortlich. Wäre das eigentlich auch mit diesen "Filmstreifen" aka Sequenz gegangen?
Warum hast du diese error-case struktur aus der Autofill.vi herausgenommen? Wann sollte man diese besser einsetzen?
Danke für deine Antwort! Bringt schon mal wieder mehr Licht in LabVIEW.
' schrieb:Wie man die Schleife sofort beendet und wie man sie vom Haupt-VI aus beendet sind 2 verschiedene Fragen. Ich gebe hier nur mal einen Tip zur ersten Frage:
Ereignisstruktur verwenden mit 2 Cases: Timeout und Stop.
Im Timout-Case befindet sich eine Zustandmaschine mit 2 Zuständen, entsprechend den beiden Zuständen der Pumpe.
Im Stop-Case findet wird die Pumpe gestoppt.
Ich habe mit dem VI nur das Gerüst skizziert.
Der Hauptgedanke ist, daß die Wartezeiten als Timeouts realsiert sind und nicht als Waits. Nur so wirkt der Stop sofort.
lv2009 [attachment=55010:Pumpe.vi]
Vielen Dank. Ich hoffe, ich kapiere das am Freitag. :-)
Ich kann leider deine vi an diesem Rechner nicht sehen, aber welche Wartezeiten meinst du bitte?
Zur zweiten Frage: Ich glaube, daß man mit Referenzen arbeiten muss.
Nochmals danke schön und ich werde am Freitag weiter knobeln.
Sofortiger Stop einer While-Schleife in einer SubVi durch MainVi
' schrieb:Besteht trotzdem nicht die Möglichkeit, die while-Schleife an jeder beliebigen Stelle sofort zu unterbrechen?
Natürlich.
Der Inhalt deiner While-Schleife ist ja ein Ablauf in dem Sinne, dass "mehrere Sachen nacheinander gemacht werden". Diese Sachen kann man eben in eine Statemachine (<= wichtiges Programmier-Konzept, das ist eine Case-Sequenz mit Enumerator-Selector in einer While-Schleife). Nach jedem State kann man z.B. was machen, nämlich auf Abbruch testen. Also: S1:Pumpe links, testen, S2:Warten, testen, S3:Pumpe rechts, testen ....
Zitat:Wenn ich das richtig sehe, schlägst du vor, daß die while-Schleife mindestens einmal fast komplett abgearbeitet wird?
Wann du auf Abbruch testet, hängt von der Applikation ab. Wenn mehrere Sachen hintereinander gemacht werden müssen, kann man das auch genau so programmieren.
Zitat:Ich glaube sogar, daß diese Stop.vi vielleicht nicht mal in der Autofill_v6_LV_2009.vi sitzen muss.
Von LabVIEW aus gesehen bist du da völlig frei. Wie's sein sollte, gibt lediglich die Applikation vor.
Zitat:In der Experiment.vi gibt es ja schon einen Stop-Button, der dort die innere Schleife abbricht und somit die Pumpe anhält. (Ich wollte ja viele Stop-Buttons vermeiden).
Richtig. Doppelt vorhanden sollte nichts sein. Funktioniert zwar, gibt aber Probleme.
Zitat:Die Schleife bricht ab und wegen Datenfluß wird die Pump via Stop.vi angehalten. Ist das korrekt?
Hm.
Die Pumpe wird nicht wegen Datenfluß angehalten. Die Pumpe wird angehalten, weil es der Algorithmus so will. Das hat mit dem Datenfluß als solches nichts zu tun. Wegen des Datenflusses wird die Pumpe erst nach der While-Schleife angehalten. (Hinweis: In "Datenfluss" steckt immer auch ein zeitlicher Aspekt.)
Zitat:Außerdem könnte ich ja diese Referenz vielleicht mit dem anderen Stop-Button aus der Main.vi verknüpfen. Wie du sagst, von außen abbrechen ...
Das ist eben eine Möglichkeit.
Zitat:Grundsätzliche Frage: Ich dachte, ich kann Sub.Vis mehr oder weniger unabhängig von Main.vis bauen und diese dann in die Main.vi einfügen. Das erscheint mir jedoch nun eine schlechte Idee, weil man viel zu viel ändern muss. Richtig?
Nein, nein. Die Idee ist sogar sehr gut. Sie fördert nämlich die Modularisierung.
Problem ist nur, wie bekommst du dann Daten in das SubVI. Das SubVI selbst ist ja nicht mehr in einen expliziten Datenfluss eingebunden. Lösung: Queues, Melder, Benutzerereignisse.
Zitat:Das hatte ich zuvor auch gemacht, aber dann dachte ich mir, ich könnte ja mal die event structure benutzen
Der Gedanke war richtig. Für die Ausführung musst du dann aber Benutzerereignisse (das ist was anderes als der Knoten Wert(signalisierend)) nehmen.
Zitat:Wäre das eigentlich auch mit diesen "Filmstreifen" aka Sequenz gegangen?
Ja.
Zitat:Warum hast du diese error-case struktur aus der Autofill.vi herausgenommen? Wann sollte man diese besser einsetzen?
Welche Error-Case-Struktur? Meinst du den IF-Case? Der war einfach nicht notwendig.
[Zitat]aber welche Wartezeiten meinst du bitte?[/Zitat]
Im Prinzip die Wartezeit zwischen Pumpe umschalten.
********************************************************************
Blöder Computer, wegen dem einen Zitat.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
14.05.2010, 13:33 (Dieser Beitrag wurde zuletzt bearbeitet: 14.05.2010 13:34 von bluesaturn.)
Sofortiger Stop einer While-Schleife in einer SubVi durch MainVi
Hallo IchSelbst und Lucki.
Ich habe mir zunaechst einmal Luckis vi vorgenommen und an mein Programm angepasst.
Es klappt ganz gut bis auf einige Kleinigkeiten:
1. i ist die Nummer der Halbzyklen und weil es eine while-Schleife ist, startet sie ja mit 0.
Ich dachte daher, ich muss meine "No of Cycles" mit 2 multiplizieren und 1 abziehen und dann einen Vergleich mit i machen.
Die jetzige Kombination wie in "Autofill_v6_LV2009_v5.vi verhaelt sich im Gluehbirnenmodus komplett anders als ohne Gluehbirne.
Im Gluehbirnenmodus faehrt die Pumpe einmal links, einmal rechts. Ohne Gluehbirne einmal links und stoppt.
Ich muss sie aber dazu bringen verlaesslich komplette Zyklen zu fahren. Ist die Anzahl totaler Zyklen 1, dann ist die Zahl der Halbzyklen 2 und das i in der while-Schleife sollte 0,1 durchlaufen. Ist 2 erreicht, sollte die Schleife stoppen.
Ich habe irgendwie das Gefuehl, dass die 0-te Iteration nichts macht, oder der i-Zaehler laeuft schneller hoch als der Datenfluss durch die Eventstruktur und die Cases. Ich versuche das mit den Probe-Fenstern zu verifizieren, aber es hapert.
2.Frage ist zum Timeout der Evenstruktur.
Laut LabVIEW gilt:
Occurs when the Event structure times out. Wire a value to the Timeout terminal at the top left of the Event structure to specify the number of milliseconds the Event structure should wait for an event to occur before generating a Timeout event.
The time stamp is a millisecond counter you can use to compute the time elapsed between two events or to determine the order of occurrence.
Ich habe jetzt z.b. 2s=2000ms an die Sanduhr angebunden. Es scheint mir aber, dass nicht erst 2s gewartet wird, und dann wird die Pumpenbewegung ausgefuehrt, sondern die Pumpenbewegung wird fuer 2s ausgefuehrt. Letzteres ist genau das, was ich haben moechte, aber ich frage mich dann, warum das geht, wenn in der Hilfe doch steht "to specify the number of milliseconds the Event structure should wait for an event to occur before generating a Timeout event." Koenntet ihr mir das bitte erklaeren?
Danke schoen. Nun muss ich nur noch Autofill von der Main.vi stoppen. Da probiere ich mal IchSelbsts Ansatz.
Danke.
Blue
14.05.2010, 13:51 (Dieser Beitrag wurde zuletzt bearbeitet: 14.05.2010 13:52 von bluesaturn.)
Sofortiger Stop einer While-Schleife in einer SubVi durch MainVi
Nachtrag: Wenn ich in Autofill_v6_LV2009_v5.vi -1 durch -0 und die beiden Zahlen mit einem Gleichheitszeichen vergleiche, klappt das Durchfahren eines ganzen Zyklus, also einmal links, einmal rechts. Nur zaehlt das i dann bis 2 hoch. Es gibt also mindestens fuer die Werte 0,1,2.
Sofortiger Stop einer While-Schleife in einer SubVi durch MainVi
Verzeihung, aber ich habe vorhin eine Frage vergessen. Die Sanduhr bei der Eventstructure ist in blau. Es scheint auf eine Integer hinzudeuten. Meine Zeit ist im Format einer Double. Ich konnte die Zeit an die Sanduhr binden, doch ist das richtig, wenn dort zwei verschiedene Datentypen aufeinandertreffen oder muss ich die Zeit als Double noch vorher umwandeln?
Danke schoen. Blue
14.05.2010, 15:21 (Dieser Beitrag wurde zuletzt bearbeitet: 14.05.2010 15:22 von Lucki.)
Sofortiger Stop einer While-Schleife in einer SubVi durch MainVi
' schrieb:Nun muss ich nur noch Autofill von der Main.vi stoppen. Da probiere ich mal IchSelbsts Ansatz.
Der Ansatz müßte modifiziert werden, wenn das Sub-VI den Stop als Ereignis behandeln soll, welches dann zum sofortigen Stop führt.
Das Thema: "Wie löst man im Haupt-VI auf Knopfdruck ein Ereignis (Stop) im Sub-VI aus?" hatten wir hier schon, gaube ich. Im Moment fällt mir die Lösung nicht ein, aber vielleicht liest das hier jemand, der das auf der Palette hat