Wie kann man eine While Schleife von außen stoppen?
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!
01.12.2006, 15:14 (Dieser Beitrag wurde zuletzt bearbeitet: 01.12.2006 15:17 von Lucki.)
Wie kann man eine While Schleife von außen stoppen?
' schrieb:Hier Beispiel
Das Sub-Vi läßt sich nicht ohne weiteres mitten im Prozess stoppen, das geht nur über eine globale Variable oder mit anderen Methoden. Beispiel, wie es auch geht:
Das Sub-Vi erfasst kontinuierlich Daten und sendet diese über einen Melder an das Haup-VI. Wenn ich zu gegebener Zeit im Haupt.VI den Melder zerstörend beende, dann funktioniert der Melder im Sub-Vi nicht mehr und erzeugt einen Fehler. Diesen benutzte ich als Abbruchbedingung für das SU-VI.
Im Übrigen ist das einzig Denkbare und Richtige, daß in einer Schleife bei Abbruch noch alles ausgeführt wird. Wer soll anderenfalls wissen, was in der Schleife noch gemacht wurde und was nicht. Es bleibt Dir aber unbenommen, den Programmablauf entsprechend zu steuern, wenn Du irgendetwas bei Abbruch in der Schleife nicht mehr ausgeführt haben willst. Du brauchst dann in der Schleife einen Case und legst die Abbruchbedingung ran. Bei Abbruch wird dann für den Teil der Schleife, den Du bei Abbruch nicht ausgeführt haben möchtest, eine leeres Case ausgeführt. Aber das ist nicht unbedingt die feinste Art des Pogrammierens.
01.12.2006, 15:30 (Dieser Beitrag wurde zuletzt bearbeitet: 01.12.2006 15:35 von chris_deus.)
Wie kann man eine While Schleife von außen stoppen?
Das hat mich noch auf folgende Idee gebracht......ist nicht so umständlich:
Die Subvis überprüfen einfach alle 5 sec welcher String in der Datei ......Stopp.txt steht.
Wenn das Hauptvi da "Stopp" reinschreibt, ist also nach 5 sec der Schleifendurchlauf quasi abgebrochen.
Gleichzeitig wird dann von einem speziellen Subvi, jede Motorenbewegung usw. gestoppt.
Bei meinem Programm würde ein voller durchlauf bis zu 10min dauern. - Da habe ich dann etwas Zeit und Nerven gespart ^^
Wie kann man eine While Schleife von außen stoppen?
<div align="left">
' schrieb:Das hat mich noch auf folgende Idee gebracht......ist nicht so umständlich:
Die Subvis überprüfen einfach alle 5 sec welcher String in der Datei ......Stopp.txt steht.
Mit der Idee liegst Du im Prinzip goldrichtig - allerdings nur im Prinzip, denn der Umweg über eine Datei und einen String ist 1000 mal zu umständlich.
Das Zauberwort, um Werte für alle VIs zwischenzuspeichern, heißt nicht Datei, sondern "nichtinitialisiertes Shift-Register". Ein solches VI wird "Global Variable VI" genannt, die entsprechende Variable ist eine "Funktionale Globale Variable". Sie ist einer echten globalen Variablen durchweg vorzuziehen. (Nicht aber einem Melder, da hat Kvasir schon recht)
Das Bild zeigt das Grundmuster eines solchen VIs. In Deinem Falle würde die Numerische Variable durch die Boolesche Variable "Abbruch" ersetzt werden, und auf die Gültigkeitsanzeige könnte auch verzichtet werden.
In der Hauptschleife wird das VI aufgerufen und gesetzt, in den Nebenschleifen aufgerufen und gelesen - fertig.</div>.
05.12.2006, 10:07 (Dieser Beitrag wurde zuletzt bearbeitet: 05.12.2006 10:09 von chris_deus.)
Wie kann man eine While Schleife von außen stoppen?
Das mit dem "nichtinitialisierten Shiftregister" ist eigentlich ganz einfach. (Obwohl ich sagen muss, dass ich den Trick noch nicht kannte. Man lernt hier immer wieder was).
Normalerweise setzt man eine Konstante an den Eingang des Shiftregisters, außerhalb der Schleife. Dadurch nimmt das Register diesen Wert an beim ersten Durchlauf.
Tut man dies nicht, so steht im Shiftregister, der Wert den das Register bei der letzten Ausführung hatte.
Erstellst du nun so ein SubVi, wie Lucki gezeigt hat und führst es einmal aus, mit SetValue auf true, so nimmt dein Shiftregister diesen Wert auf und das SubVi schließt wieder (Die Schleife läuft ja immer nur 1x).
Rufst du das SubVi erneut auf, dann hat das Shiftregister (da ja keine Konstante vorgeschalten ist) den Wert, den du vorher hineingeschrieben hast.
Damit erfüllt dieses kleine SubVi die Funktion einer globalen Variable.
A few weeks of developement and testing can save a WHOLE afternoon in the library!
05.12.2006, 17:49 (Dieser Beitrag wurde zuletzt bearbeitet: 05.12.2006 17:50 von Lucki.)
Wie kann man eine While Schleife von außen stoppen?
<div align="left">
' schrieb:Das mit dem "nichtinitialisierten Shiftregister" ist eigentlich ganz einfach. (Obwohl ich sagen muss, dass ich den Trick noch nicht kannte. Man lernt hier immer wieder was).
Ich weiß das auch noch nicht sehr lange. Das Beispiel ist nicht auf meinem Mist gewachsen, es ist aus dem Buch Johnson/Jennings "LV graphical Proramming". Am Textrand dieses Beispiels steht sogar "CLAD", d.h es gehört zum Wissensstoff, wenn man ein "Certified LabVIEW Associated Developer" werden möchte.
Es gibt auch eine Labviev-Hilfe "Funktionale globale Variablen", aber das darin verwendete Beispiel ist so blöd, weil zu speziell, daß man von der Verwendung nur abgeschreckt werden kann.
</div>
Wie kann man eine While Schleife von außen stoppen?
Doch du kannst natürlich weitere Shiftregister verwenden.
Der Wert bleibt nur erhalten, weil es ja immer genau das gleiche Shiftregister ist, das aufgerufen wird (selbes SubVi wird wiederholt aufgerufen).
Wenn du z.B.: eine Whileschleife mit einem uninitialiserten Shiftregister in einer Case Struktur hast, dann hat dieses Shiftregister, bei jedem neuen Durchlaufen der Case Struktur den letzten Wert. Dies kann zu unerwünschten Wirkungen führen, wenn z.B.: das Shiftregister als Abbruchbedingung für die Schleife gilt. Deswegen sollte man Shiftregister immer initialisieren um soetwas zu vermeiden, außer eben, man verwendet es als funktionale globale Variable.
Schau dir mal das Beispiel an, ich hoffe das erklärt was ich meine.
A few weeks of developement and testing can save a WHOLE afternoon in the library!