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!
anbei findet Ihr einen Zustandsautomaten den ich, in ähnlicher Form, zum mitschreiben von Messdaten einsetzten wollte. Seine Funktion sollte wie folgt sein: im Ausgangszustand (standby) wird auf ein Ereignis (Taste "mach was" Wertänderung) gewartet. Wenn dieses auftritt wird weitergeschaltet in den Zustand "etwas tun". Nun möchte ich den Zustand "etwas tun" erst verlassen wenn die Taste "mach was" wieder auf FALSE geschaltet wird. Dies habe ich erreicht indem ich das Schaltverhalten der Taste auf "Beim Drücken schalten" belassen habe. Für die korrekte Funktion der Ereignisstruktur muss das Schaltverhalten aber ein Latch beim Loslassen sein. Was passiert ist nun folgendes, deaktiviere ich die Taste "mach was" im Zustand "etwas tun" durchläuft der Automat nacheinander die Zustände
standby -> mach was -> standby
Welchen Weg würdet Ihr gehen um dies zu lösen, habe ich gar einen falschen Ansatz gewählt wie ich den Zustand "etwas tun" verlasse?
LG
Georg
14.08.2014, 07:50 (Dieser Beitrag wurde zuletzt bearbeitet: 14.08.2014 07:50 von GerdW.)
kann dein VI aufgrund der LV-Version nicht anschauen, deshalb hier ein vollkommen unbeeinflusster Vorschlag:
Den Button auf Latch setzen. In den States wird umgeschaltet, wenn ein TRUE vom Button gemeldet wird…
Zwei Probleme:
1. Eventstrukturen sollte man nicht in irgendwelchen Case-Strukturen verstecken. Das führt schnell zu Problemen - wie bei dir.
2. Wenn du schon deinen Button im Event auswertest, dann bitte richtig! Du prüfst auf (allgemeine) Wertänderung , bist aber nur an positiven Flanken interessiert. Also: Im Event fehlt eine Abfrage, welchen Zustand der Button hat, bevor man den nächsten State ausgibt…
Wenn du das erste Problem löst (z.B. wie in meinem Beispiel), wird das zweite nahezu hinfällig…
mein Gedanke, die Eventstruktur in den "standby" Case zu stecken, hat den Grund, dass ich nicht wollte, dass die Schleife die ganze Zeit in diesem Zustand läuft. Sonst hätte ich ganz einfach eine Timed While Loop genommen und einen ganz normalen Schalter mit dem "beim Drücken schalten" benutzt. In deinem Beispiel läuft die Schleife, indem sich die Eventstruktur direkt befindet, ja aufgrund des Timeouts.
dann spiel doch einfach mit dem Timeout herum! Im Standby-Modus das TimeOut auf -1 setzen, sonst auf sehr kleine Werte…
Nochmal hierzu:
Zitat:1. Eventstrukturen sollte man nicht in irgendwelchen Case-Strukturen verstecken. Das führt schnell zu Problemen - wie bei dir.
Das Problem ist, dass die Event-Struktur sich die Events in einer Queue merkt und abarbeitet, wenn "Zeit" dafür ist. Auch wenn die Event-Struktur im Case versteckt wird, merkt sie sich die Events. Und bei deinem Button führt das dazu, dass jede Wertänderung hinterher auch abgearbeitet werden muss, was in Verbindung mit Punkt 2 oben zu diesem Hin- und Herschalten der States führt…
Zwar ließen sich die Mängel in Deinem VI mit geringen Änderungen beheben, aber der "Mercedes unter den state machines" *) ist nun einmal die "Queue driven state-machine" (QSM, googeln). Deine reale Anwendung wird sicherlich komplexer sein als das Beispiel, und da lohnt es sich dann echt.
Hier das Beispiel als QSM:
*) off toppic: Bezeichnung ist von mir, bekannt war mir bereits der "Mercedes unter den Teebeuteln" (Kneipp-Werke Bad Wörrishofen) und der "Mercedes unter den Rollatoren" (In Orthopödie-Fachgeschäften erhältlich)