LabVIEWForum.de - Programmstop

LabVIEWForum.de

Normale Version: Programmstop
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
(14.02.2018 10:14 )MartinNewBee schrieb: [ -> ]wie programmiere ich einen quasi "Notaus" (ich weiß so was sollte nicht programmiert sondern gebaut werden).
Was willst du haben: Einen Notaus bzw. Nothalt oder nur einen ganz normalen "Ablauf sofort beenden" (es gäbe da noch "Ablauf nach Zyklus beenden").

Für beide Fälle ist es ratsam, die Ablaufsteuerung als Schrittkette zu gestalten. Arbeite die Schrittkette in einem festgelegten Raster ab, z.B. 50ms. Jeder einzelne Schritt einer Schrittkette darf nur einen Bruchteil der Rasterzeit der Schrittkette benötigen. Sollte eine definierte oder undefinierte Wartezeit benötigt werden, so muss diese Zeit eben ohne explizite Wartefunktion programmiert werden. Man könnte z.B. die Schrittkettenaufrufe zählen. Wenn du jetzt einen "Abbruch sofort" haben willst, muss du lediglich nach jedem einzelnen Schritt (also außerhalb der Case-Sequenz) die Ende-Bedingung abfragen. Ist sie eingetreten, setzt du den nächsten Schritt der Schrittkette einfach auf den Schritt "Ablauf sofort beenden".
Wenn ich wiederholte Aktionen habe, deren Ausführungszeit selbst kurz ist, aber zwischen den einzelnen Ausführungen doch eine längere Zeitspanne verstreicht (z.B. alle zwei Sekunden einen Messwert auslesen), dann verwende ich üblicherweise kein Wait (das Stückeln mit 50 ms Häppchen missfällt mir da), sondern stattdessen eine Ereignisstruktur mit Timeout um ein sofortigen Stopp zu ermöglichen.
Vorteil von der Queue-Struktur ist weiterhin, dass die Ausführung dieses VIs auch durch jedes andere VI per Queue-Befehl abgebrochen werden kann.
Ergänzung zum Beitrag von THL:
Diese Programmstruktur allein ist aber noch keine Gewähr, dass ein VI sofort beendet wird. Damit wird zwar der Stop-Knopf sofort gelesen, es wird aber nicht die Auführung eines vielleicht sekundenlangen Waits abgebrochen.
Das "Zerstückeln" eines langen Waits, wenn es im VI vorkommt, in mehrere kleinere Teile wird damit nicht überflüssig gemacht.

Vieleicht auch interessant: Die Funktionen "Occurrences" (mit Meldern ginge es auch) lassen sich als unterbrechbares "Wait" verwenden. Die Funktion "O. Warten" verhält sich exakt wie ein "Wait", läßt sich aber mit der Funktion "O. Auslösen" jederzeit abbrechen.
Falls es jemand interessiert: Hier noch ein Beispiel (der Einfachheit aufbauend auf Freddys VI), wie man, wenn ein VI Wartefunktionen mit großen Zeiten enthält, das VI augenblicklich abbrechen kann.
[attachment=58806]
(17.02.2018 09:15 )Lucki schrieb: [ -> ]Ergänzung zum Beitrag von THL:
Diese Programmstruktur allein ist aber noch keine Gewähr, dass ein VI sofort beendet wird. Damit wird zwar der Stop-Knopf sofort gelesen, es wird aber nicht die Auführung eines vielleicht sekundenlangen Waits abgebrochen.
Das "Zerstückeln" eines langen Waits, wenn es im VI vorkommt, in mehrere kleinere Teile wird damit nicht überflüssig gemacht.
Da hatte ich mich wohl missverstänlich ausgedrückt. In meinem Beispiel ersetzt das Timeout der Ereignisstruktur das Wait. Es kommt also gar kein Wait vor, auf das man warten müsste.
Mein Vorschlag ist natürlich nur für solche Fälle gedacht gewesen, wo in (langen) regelmässigen Abständen ein Ereignis ausgelöst wird (welches selbst kein Wait mehr enthält).
@THL
Ich wollte Dich nicht korrigieren, sondern nur ergänzen, denn bei andern VIs -nicht bei Deinem Beispiel - mit mehreren unterschiedlich langen Waits ist diese Struktur nicht gut ausbaufähig. Entweder man nimmt dann außerdem Wait-Funktionen - oder man verlagert das Warten nicht in den Sender der Queue, sondern in die einzelen Emfänger. (Und da aber mehrere Empfänger bei Queues nicht verwendet werden sollen, wären dann Melder - die hier gar nichts zu melden haben - zu verwenden.)
Also so:
[attachment=58819]
Seiten: 1 2
Referenz-URLs