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!
Hallo,
Ich habe ein Programm mit mehreren vers. Schleifen. Um das Programm nicht immer wieder nach einem Durchlauf neu starten zu müssen, habe ich eine While-Loop um das Ganze gezogen. Somit läuft das Programm beliebig oft durch - wie erwünscht. Jetzt zu meiner Frage: wenn ich jetzt auf den Stopp-schalter der äußeren While-Loop klicke, läuft das Programm noch einmal durch und stoppt erst dann. Ich möchte aber, dass das Programm sofort, ohne weiteren Durchlauf stoppt. Was muss ich einfügen damit die While-loop sofort stoppt?
Ich hab im Forum irgendwas von einer "State Machine" gelesen, es allerdings nicht wirklich verstanden und auch in LabView selbst nicht wirklich gefunden.
Zitat:wenn ich jetzt auf den Stopp-schalter der äußeren While-Loop klicke, läuft das Programm noch einmal durch und stoppt erst dann.
THINK DATAFLOW!
Dein Stoppbutton wird sehr wahrscheinlich wesentlich früher abgefragt als du dir denkst, weil der Inhalt der Schleife einige Zeit zur Ausführung benötigt.
Deshalb wird den Buttonklick eben erst mit der nächsten Iteration bemerkt…
Lösung: Den Stoppbutton wirklich erst zum Schluß der aktuellen Iteration abfragen: eben per DATAFLOW sicherstellen, dass erst alles andere in der Schleife abgearbeitet wird, bevor du den Button liest! (Im simpelsten Fall per Sequenzrahmen.)
Hallo Martin
ich habe Dir mal zwei Möglichkeiten aufgebaut, die bei einem While Stop sofort unterbrechen.
Die Sequenz und auch die Stapelverarbeitung werden durch die IF Anweisung gestoppt.
Ich habe den Stop Schalter von Latch auf "Beim Drücken schalten" gesetzt.
Vielleicht hilft es bei Deinen Überlegungen etwas weiter.
so verhindert man mittels DATAFLOW, dass eine weitere (ungewünschte) Iteration erfolgt:
Den Button erst dann lesen, wenn der restliche Code in der Schleife abgearbeitet ist…
Theoretisch es bei Codeteilen, die nicht durch Datenfluß voneiander abhängig sind, nicht vorhersehbar, in welcher Reihenfolge die Abarbeituung erfolgt. Praktisch ist es aber zu 99.999999%, wenn nicht sogar zu 100%, so, daß erst einfache Elemente gelesen oder beschrieben werden, bevor das Programm in irgendwelche Strukturen oder SubVIs eintritt. Aus diesem Grunde wird, wenn man nichts dagegen unternimmt, unerwünschterweise praktisch immer zuerst der Stop-Knopf gelesen, bevor das Programm in der Schleife etwas anderes macht. Beim Betätigen desselben ist der längst gelesen; die Wertänderung wird erst beim nächsten Schleifendurchhlauf zur Kenntnis genommen.
Um das zu vermeiden, man muß also dafür sorgen, dass der Stop-Knopf erst gelesen wird, wenn alles andere in der Schleife abgearbeitet ist.
Freddys Programm leistet das nicht. Es funktioniert lediglich so, daß (- unter Zuhilfenahme etlicher lokalen Variablen und etlicher zusätzlicher Cases -) der zusätzliche Schleifendurchlauf nach Stop keinen Schaden mehr anrichtet, weil praktisch kein echter Code mehr ausgefüht wird. Kann man so machen, aber es ist nicht die Antwort auf die sinnvolle Frage, wie man die zusätzllche Iteration verhindert.
So verhindert man die zusätzliche Iteration in Freddys Beispiel echt:
(Der Stop-Knopf sollte wieder auf Latch gestellt werden, da keine lokalen Variablen benutzt werden).
14.02.2018, 10:14 (Dieser Beitrag wurde zuletzt bearbeitet: 14.02.2018 10:20 von MartinNewBee.)
Danke euch. Ich habe das jetzt so wie in meinem Bild gelöst, weil ich mich zwischen weiteren Durchlauf und Programm beenden entscheiden wollte.
Wenn ihr dazu noch Anregungen habt, bin ich offen für jede Kritik.
Besten Dank!
Ah was mir jetzt heute auffällt ist, dass ich zwar mein Programm wie gewünscht durchlaufen und beenden kann, wenn es aber jetzt bei der Ausführung einer Schleife ist und ich dann währenddessen "beenden" klicke, bricht es nicht einfach ab sondern führt die schleife zu Ende, was ja auch logisch ist. Jetzt zu meiner frage, wie programmiere ich einen quasi "Notaus" (ich weiß so was sollte nicht programmiert sondern gebaut werden).
Danke schon mal und beste Grüße
Martin
14.02.2018, 10:36 (Dieser Beitrag wurde zuletzt bearbeitet: 14.02.2018 10:37 von GerdW.)
Zitat:wie programmiere ich einen quasi "Notaus" (ich weiß so was sollte nicht programmiert sondern gebaut werden).
Wenn du deine Schleifen vorzeitig beenden willst, musst kannst du Freddys Vorschlag mit den lokalen Variablen umsetzen.
(Es gibt schönere Lösungen, aber das ist die schnellste.)
Zitat:Ich habe das jetzt so wie in meinem Bild gelöst
Das sieht maximal kompliziert aus - ohne erkennbaren Mehrwert!
Wozu die Event-Struktur? Die verhindert im Standardfall, dass dein UI bedienbar bleibt, nachdem du den "Programm beenden"-Button gedrückt hast…
Wozu die Case-Struktur im Eventcase? "IF true THEN true"???
Einfach den "Programm beenden"-Button im letzten Frame abfragen - und fertig…
Wie programiere ich ein schnelles Aus?
Ich kann dazu jetzt kein Beispiel machen, nur so viel:
Die Wait-Funktion (von mehreren Sekunden) sollte man vermeiden, und statt dessen die Funktion "verstrichene Zeit" abfragen, was aber eine etwas anderes Programmstruktur erfordert, mit einem einfachen Austausch ist es nicht getan. Nur in der Hauptschleife hat man dann noch ein kurzes Wait, z.B mit 50ms. Der Stop-Knopf wird dann alle 50 ms abgefragt.
Ich habe vor ca. 100 Jahren hier mal das Beispiel "Ampel" gepostet. Es ist ein Prüfungsbeispiel von NI, und NI will, dass das Programm gegebenenfalls sofort beendet wird, und nicht erst nach Beenden eines vollständigen Ampelzyklus. Vielleicht ist das noch aufzufinden.
Und: Ich habe gesehen, dass von NI in irgendwelchen Beispielen durchaus die Not-Aus Funktion verwendet wird.
Wenn Du sowieso keinen besonderen Code für den Exit-Fall abzuarbeiten hast, dann passiert eigentlich nichts Schlimmes. Hier im Forum wurde aber von einem Experten das Not-Aus mit der Beendigung einer Autofahrt durch Fahren gegen einen Baum gleichgesetzt. Das ist zwar Quatsch, aber auf jeden Fall wäre es für Dich aus Sicherheitsgründen besser, die eventuelle Verwendung dieser Funktion hier im Forum nicht an die große Glocke zu hängen.