Stoppen - Druckversion +- LabVIEWForum.de (https://www.labviewforum.de) +-- Forum: Sonstiges (/Forum-Sonstiges) +--- Forum: Tipps und Tricks (/Forum-Tipps-und-Tricks) +--- Thema: Stoppen (/Thread-Stoppen) |
Stoppen - Lucki - 21.08.2008 09:47 Ich eröffne mal diesen Tread, weil es erfahrungsgemäß nicht so einfach ist und hier viel danach gefragt wird, ein komplexes VI zu beenden. Also z.B eines mit mehreren unabhängigen Schleifen oder wenn auf Daten gewartet wird, die aber nicht kommen. Ich schlage vor, daß alle mitmachen, die eine guten Tipp auf Lager haben. Ich selbst werde nur mit 2-3 Tipps aufwarten, die ich hier als Antworten anhänge. Stoppen - Lucki - 21.08.2008 10:03 Tipp 1: Beenden von mehreren unabhängigen Schlefen. Bei Abstoppen eines VIs mit mehreren unabhängigen Schleifen hat man zwei Probleme: 1.) Es muß jede einzelne Scheife gestoppt werden 2.) Bei langen Wait-Zeiten in einer oder mehreren dieser Schleifen kann es nervend sein, bis der Stop wirksam wird. Mit dieser Struktur läßt sich das lösen: [attachment=14077] Statt der Wait-Funktion in den Schleifen wird hier die Funktion "Warten auf Occurences" verwendet. Sie ist hier weiter nichts als eine "unterbrechbare Wait-Funktion" Solange keine Occurence eintrtt, ist es eine eine normale Wait-Funktion. Tritt die Occurence ein, dann wird erstens das Warten sofort unterbrochen, und zweitens ist der boolsche Ausgang dann true, was hier zum gewünschten Schleifenabbruch führt. Die Occurrence selbst wird durch den Stopp-Knopf ausgelöst. Occurences werden allerdings von NI nicht mehr zur Verwendung in neuen VIs empfohlen. Man kann dafür selbsverständlich auch Melder verwenden, nur sieht es dann etwas komplizierter aus, da Melder (außer der reinen Meldefunktion) zusätzlich für Datentransport konzipiert sind, der hier gar nicht stattfindet. [attachment=14078] Stoppen - eg - 21.08.2008 10:07 Hier auch mein Vorschlag. Wenn die Producer Loop beendet wird, beenden sich gleich alle Consumer Loops. [attachment=14080] [attachment=14092] Stoppen - eg - 21.08.2008 10:13 Mein Vorschlag 2 ist die Benutzung von Headers in den zu übertragenden Daten. Hier wird in den Daten vom "Type 1" ein boolscher Wert übertragen. Wenn dieser Wert TRUE ist, bedeutet das für die untere Schleife, dass sie sich jetzt beenden soll. Man kann auch "Type 1" in "Exit" umbenennen, damit es verständlicher wird. [attachment=14085] [attachment=14093] Stoppen - IchSelbst - 21.08.2008 11:50 ' schrieb:Mein Vorschlag 2 ist die Benutzung von Headers in den zu übertragenden Daten.Prinzipiell mach ich das auch so. Da ich ja alles in Klassen (eine Klasse = ein SubVI) mache und die einen bestimmten Aufbau haben - habe ich das Problem mit Stoppen eigentlich nicht. Zumindest sehe ich da keine Probleme. Die Klasse läuft in einer While-Schleife mit Case-Sequenz. Hauptaufgabe der Klasse ist das Samplen von Messwerten. Das geschieht in einem Raster von 50ms. Demzufolge wird die Steuerqueue alle 50ms einmal abgefragt. Je nach Aufgabe (Exit!) gehts halt weiter. Wenn sich innerhalb eines VIs mehrere parallele While-Schleifen befinden, dann stopp ich die per lokaler Variable. Der allgemeine Ablauf ist wie folgt: Queues zum Steuern der Klassen erstellen, Klassen ausführen, MainSequenz mit den drei While-Schleifen ausführen, Programm beenden: Alle Klassen exit, Queues löschen, VI beenden. Da ich sowieso überall Wartezeiten von 250ms drinn hab, spielen die 50ms Reaktionszeit innerhalb der Klassen keine Rolle. Stoppen - rasta - 21.12.2008 18:38 Hallo zusammen, im Anhang befindet sich noch eine alternative Möglichkeit einzelne bzw. mehrere parallele Schleifen zu beenden. Falls wir uns nicht mehr wünsche Ich allen frohe Feiertage und alles Gute für´s Neue Jahr. Gruß Ralf Edit:Rube Goldberg korrigiert |