LabVIEWForum.de
Zustandsautomat aktiv/inaktiv - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Zustandsautomat aktiv/inaktiv (/Thread-Zustandsautomat-aktiv-inaktiv)



Zustandsautomat aktiv/inaktiv - Hasenfuss - 02.04.2013 12:16

Ich habe in einer while-Schleife einen Zustandsautomaten mit mehreren case-Fällen. Einer der Case-Fälle heisst Auswahlmenü. Dort befindet sich eine Eventstruktur, die beispielsweise Tastenzustände abfragt und entsprechende andere Zustände des Automaten auslöst. Ist der Zustand eine Funktion fertig - z.B. Gerät einschalten, dann springt der Zustandsautomat wieder in das Auwahlmenü.

Wenn ich mich in dem anderen Modus befinde und eine Taste drücke, dann reagiert der Zustandsautomat sofort, sobald der Case-Auswahlmenü wieder ausgelöst wurde.

Meine Frage dazu - wird, wenn ich einmal eine Eventstruktur gesetzt habe - dieser inaktiv, wenn ich aus dem Zustandsautomaten rausgehe? Vom Gefühl her würde ich sagen - nein, geht nicht - aber dann dürfte die Eventstruktur im Zustand Auswahlmenue nicht sofort ausgelöst werden, wenn ich noch während des Zustands "Gerät einschalten" einen Button auf dem Frontpanel anklicke.

Oder sollte man alle möglichen Tasten "deaktivieren", wenn der Zustandsautomat den Zustand Auswahlmenü verlässt und dann wieder aktivieren?


RE: Zustandsautomat aktiv/inaktiv - GerdW - 02.04.2013 12:23

Hallo Hasenfuss,

eine Eventstruktur reagiert auf alle konfigurierten Events. Wenn die Eventstruktur gerade nicht ausgeführt wird (weil sie z.B. in einem Case versteckt ist), dann werden die Events in einer Queue zwischengespeichert und abgearbeitet, wenn die Eventstruktur mal wieder aktiv wird. Dies ist dir passiert: "Wenn ich mich in dem anderen Modus befinde und eine Taste drücke, dann reagiert der Zustandsautomat sofort, sobald der Case-Auswahlmenü wieder ausgelöst wurde."

- Nein, die Eventstruktur wird nicht plötzlich/ohne dein Zutun inaktiv...
- Tasten deaktivieren könnte eine (mMn unsaubere) Lösung sein.
- Bessere Lösung: Hilfe zur Eventstruktur lesen, da sind "Regeln" genannt. Eine Eventstruktur sollte man nicht in einer Casestruktru verstecken. Eine Eventstruktur sollte immer sofort auf ein Event reagieren! Deshalb: Parallele Schleife mit Eventstruktur nutzen und Producer-Consumer-Schema verwenden, um "Befehle" an deine Statemachine zu schicken...


RE: Zustandsautomat aktiv/inaktiv - Hasenfuss - 02.04.2013 15:00

Hallo GerdW!

Vielen Dank für Deine Antwort.

Den Ansatz mit der separaten Ereignisstruktur hatte ich auch schon mal verwendet und dann die Ereignisse mittels Queue hinausgeführt.

Ich habe es jetzt so gelöst, dass ich die Queue im Zustand Auswahlmenue auslese. Und wenn ich eine Weile auf Ereignisse nicht reagieren will, dann kann ich einfach die Operation durchführen - Queue leeren, bevor ich in den Zustand Auswahlmenue zurückgehe.

Meinst Du, dass ist so akzeptabel gelöst? Oder hättest Du noch Verbesserungsvorschläge?

Das Beispielprogramm ist in LV 9.0 abgespeichert.