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!
Sofortiger Stop einer While-Schleife in einer SubVi durch MainVi
' schrieb: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
Hallo Lucki.
Das habe ich eben auch herausgefunden, daß IchSelbst Ansatz mir das Stopen nicht aus der Main.vi erlaubt.
Kann es sein, daß du diesen Thread meinst? SubVi abbrechen
Ich glaube, ich muss folgenden Vorschlag von Jens nehmen, zumindest probiere ich das gleich mal aus. Beitrag 8 von Jens
Sofortiger Stop einer While-Schleife in einer SubVi durch MainVi
' schrieb: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.
Klar. Der Ablauf ist so:
While-Schleife starten (i=0): 2 Sekunden warten - Timeout-Case abarbeiten mit Richtung 1
Zweiter Durchlauf (i=1) : 2 Sekunden warten - Timeout-Case abarbeiten mit Richtung 2
Dritter Durchlauf (i=2): 2 Sekunden warten - Timeout-Case abarbeiten mit Richtung 1
While-Schleife beenden.
Nach dem Ende wird die Pumpe sofort gestoppt. Dass die Pumpe in Richtung 1 geschaltet wurde, stellt du also gar nicht mehr fest.
Und das Element Metronom ist in der While-Schleife sinnlos.
' schrieb: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?
Es scheint nicht nur ein Integer, es ist ein Integer.
Eine explizite Anpassung musst du nicht unbedingt machen. Das macht der rote Punkt, in den der gelbe Draht reingeht.
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
' schrieb:Klar. Der Ablauf ist so:
While-Schleife starten (i=0): 2 Sekunden warten - Timeout-Case abarbeiten mit Richtung 1
Zweiter Durchlauf (i=1) : 2 Sekunden warten - Timeout-Case abarbeiten mit Richtung 2
Dritter Durchlauf (i=2): 2 Sekunden warten - Timeout-Case abarbeiten mit Richtung 1
While-Schleife beenden.
Nach dem Ende wird die Pumpe sofort gestoppt. Dass die Pumpe in Richtung 1 geschaltet wurde, stellt du also gar nicht mehr fest.
D.h. die Timeout-Cases werden solange abgearbeitet, bis die Warezeit von 2 Sekunden in der naechsten Iteration vergangen ist.
Eventuell muss ich dann doch wieder zu urspruenglichen Version von oben mit dem Time Delay zurueckkehren, wenn der ganze Prozess mit dem Roentgenstrahl getriggert werden soll. Mal sehen....
' schrieb:Und das Element Metronom ist in der While-Schleife sinnlos.
Warum, ich dachte, das muss in while-Schleifen gesetzt werden?
Sofortiger Stop einer While-Schleife in einer SubVi durch MainVi
' schrieb:D.h. die Timeout-Cases werden solange abgearbeitet, bis die Warezeit von 2 Sekunden in der naechsten Iteration vergangen ist.
Nein.
Der Timeoutcase wird dann genau ein einziges Mal abgearbeitet, wenn für die Dauer der Timeoutzeit kein anderer Event, der in der Eventliste eingetragen ist, eingetreten ist. Es passiert also erstmal 2 Sekunden lang gar nichts. Dann findet der Timeout-Case statt.
Zitat:Warum, ich dachte, das muss in while-Schleifen gesetzt werden?
Metronome (und WaitMS-VIs) sind nur dann notwendig, wenn While-Schleifen ansonsten unendlich schnell durchlaufen würden. Folge wäre eine Überlastung des Prozessors.
Ist in der While-Schleife aber eine Event-Sequenz mit oder ohne Timeout, braucht man diese Wartezeit nicht, da der Prozessor nicht überlast werden kann.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
14.05.2010, 16:29 (Dieser Beitrag wurde zuletzt bearbeitet: 14.05.2010 16:30 von bluesaturn.)
Sofortiger Stop einer While-Schleife in einer SubVi durch MainVi
' schrieb:Nein.
Der Timeoutcase wird dann genau ein einziges Mal abgearbeitet, wenn für die Dauer der Timeoutzeit kein anderer Event, der in der Eventliste eingetragen ist, eingetreten ist. Es passiert also erstmal 2 Sekunden lang gar nichts. Dann findet der Timeout-Case statt.
Nun die entscheidende Frage: Wie lange pumpt die Pumpe dann in eine Richtung?
Ich habe es so verstanden, dass bei der naechsten Iteration genau "Timeoutzeit" gewartet wird, bis der naechste Timeout-Case, diesmal mit umgekehrter Richtung ablaeuft. Das heisst wiederrum, der vorherige Timeout-Case laeuft solange, bis der naechste gestartet wird, naemlich nach x sec der Timeoutzeit.
Diese Start.vi in der Case-Struktur im Timeout-Case setzt die Pumpe nur unendlich lange in Bewegung. Weil aber nach der Timeoutzeit von 2 Sekunden in der naechsten Iteration ein erneuter Start-Befehl aber mit umgekehrter Richtung kommt, kehrt die Pumpe die Richtung um.
Ich muss mal sehen, ob das so gut ist fuer meine Anwendung. Es kann ja auch passieren, dass ich einmal 10 Sekunden als Timeoutzeit habe und die muss ich vorher immer warten, bis irgendetwas passiert. Ich kann noch nicht abschaetzen, ob das sinnvoll ist.
Sofortiger Stop einer While-Schleife in einer SubVi durch MainVi
' schrieb: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
Hallo Lucki, magst du dir das vielleicht bitte anschauen?
Main.vi ist Experiment_v1.vi und SubVi ist Autofill_v6_LV2009_v6.vi ().
Ich habe mich bei Jens orientiert (Beitrag8).
Der einzige Unterschied ist, dass Jens in der Main die subvi in eine Eventstruktur verlagert hat und ich nicht. Funktioniert das "Stop inner" deswegen nicht und ich kann die SubVi nicht abbrechen?
Ggf ich brauche eine Evenstruktur in der Main.vi, benoetige ich dann auch zwei Eventcases, wenn ich erst die SubVi starten will und spaeter beliebig stoppen moechte, d.h. Value change von "Jiggle M1" und value change von "Stop inner"?
Sofortiger Stop einer While-Schleife in einer SubVi durch MainVi
' schrieb:Ich habe mich bei Jens orientiert (Beitrag8).
Der einzige Unterschied ist, dass Jens in der Main die subvi in eine Eventstruktur verlagert hat und ich nicht. Funktioniert das "Stop inner" deswegen nicht und ich kann die SubVi nicht abbrechen?
Ggf ich brauche eine Evenstruktur in der Main.vi, benoetige ich dann auch zwei Eventcases, wenn ich erst die SubVi starten will und spaeter beliebig stoppen moechte, d.h. Value change von "Jiggle M1" und value change von "Stop inner"?
Ich habe das ausprobiert, aber das klappt leider auch nicht. Sorry, kann den vorherigen Beitrag nicht editieren.
Sofortiger Stop einer While-Schleife in einer SubVi durch MainVi
' schrieb:Nun die entscheidende Frage: Wie lange pumpt die Pumpe dann in eine Richtung?
Die Pumpe pumpt immer so lange in eine Richtung, wie die Timeoutzeit lang ist. Also, Antwort anders ausgedrückt: zwei Sekunden.
Zitat:Ich habe es so verstanden, dass bei der naechsten Iteration genau "Timeoutzeit" gewartet wird, bis der naechste Timeout-Case, diesmal mit umgekehrter Richtung ablaeuft. Das heisst wiederrum, der vorherige Timeout-Case laeuft solange, bis der naechste gestartet wird, naemlich nach x sec der Timeoutzeit.
Deine Ausdruckweise mit der deutschen Sprache stimmt nicht überein mit der Funktionsweise einer Event-Sequenz.
Ein Timeout-Case läuft nicht ständig ("der vorherige Timeout-Case laeuft solange, bis der naechste gestartet wird"). Ein Timeout-Case ist ein einmaliges Ereignis und dauert weniger als eine Millisekunde. Was 2 Sekunden dauert ist der Zustand, der durch den Code im Timeout-Case erzeugt wird: "Pumpe vorwärts laufen" (beachte: im Timeout wird "Pumpe vorwärts schalten" gemacht, danach heißt es "Pumpe vorwärts laufen"). Nach diesen 2 Sekunden erfolgt das nächste Timeout-Event.
Zitat:Diese Start.vi in der Case-Struktur im Timeout-Case setzt die Pumpe nur unendlich lange in Bewegung. Weil aber nach der Timeoutzeit von 2 Sekunden in der naechsten Iteration ein erneuter Start-Befehl aber mit umgekehrter Richtung kommt, kehrt die Pumpe die Richtung um.
So ist es richtig ausgedrückt.
Hinweis: Es ist in erster Linie eine Event-Struktur, dann erst eine Case-Struktur.
Zitat:Ich muss mal sehen, ob das so gut ist fuer meine Anwendung. Es kann ja auch passieren, dass ich einmal 10 Sekunden als Timeoutzeit habe und die muss ich vorher immer warten, bis irgendetwas passiert. Ich kann noch nicht abschaetzen, ob das sinnvoll ist.
Du kannst folgendes machen:
Mach ein Schieberegister, dessen Ausgang auf den Timeout-Eingang geht. Das Schieberegister belegst du außerhalb der While-Schleife mit 0 vor. Im Timeout-Event gibst du dann die "richtige" Timeout-Zeit auf das Schieberegister, sodass ab der nächsten Iteration immer die gewünschte zeitgewartet wird. Durch die 0 wird die Pumpe praktisch sofort geschaltet, wenn das SubVI gestartet wird.
Beachte weiterhin, dass mittels eines Benutzerevents (den Post dazu hast du ja schon gefunden) der Timeout praktisch umgangen werden kann.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
14.05.2010, 18:33 (Dieser Beitrag wurde zuletzt bearbeitet: 14.05.2010 18:35 von IchSelbst.)
Sofortiger Stop einer While-Schleife in einer SubVi durch MainVi
Ich habe jetzt mal - in starker Anlehenung an das Beispiel von IchSelbst und auch mehr für eigene Lernzwecke als für Euch LabVIEWer hinter euren Bildschirmen draußen auf dem Lande - für mein weiter oben gepostetes einfaches Beispiel gezeigt, wie man das freilaufende SubVI "Pumpe" vom MainVI "PumpeMain" aus mit beendet. (Bisher hatte ich für die gleiche Aufgabe immer Melder verwendet)
Vielleicht nützt es jemandem was oder es gibt Änderungsvorschläge.
lv2009
PumpeMain.vi (Größe: 7,96 KB / Downloads: 231)