LabVIEWForum.de - Ereignisstruktur: Beim Drücken schalten

LabVIEWForum.de

Normale Version: Ereignisstruktur: Beim Drücken schalten
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo allerseits,

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
Hallo Georg,

kann dein VI aufgrund der LV-Version nicht anschauen, deshalb hier ein vollkommen unbeeinflusster Vorschlag:
[attachment=50434]
Den Button auf Latch setzen. In den States wird umgeschaltet, wenn ein TRUE vom Button gemeldet wird…
Hallo Gerd,

so ganz kapier ich das noch nicht, aber ich hab mein Beispiel mal auf LabVersion 8.6 konvertiert, so dass die Meissten Leute hier es öffnen können.

LG
Georg
Hallo Georg,

danke fürs Konvertieren.

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…
Hallo Gerd,

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.

LG
Georg
Hallo Georg,

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:
[attachment=50442]

*) 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)
Referenz-URLs