Seite 1 von 3

Fragen zur State Machine

Verfasst: So Mai 03, 2020 11:22 am
von Robert_Mini
Hallo zusammen!

Da einige auf die State Machine schwören und damit auch schöne Dinge zaubern (zB Bewässerung von @MiniMaxV2), bin ich grad dabei, mir das Thema auch anzusehen.

Ich habe eine Logik am Laufen, die den Status des Automowers auf Basis eines Reed-Kontaktes an der Ladestation überwacht. Reicht für Berechnung der täglichen Mähdauer und Fehleranzeige aus.

Da ich in den verschachtelten Und/Oder + Timer etc. noch einen kleinen, hartnäckigen Bug habe, überlege ich dieses Thema mittels State Machine umzusetzen.

Gehe ich richtig in der Annahme, dass man als Übergangsbedingungen keine Und/Oder einbauen sollte und stattdessen einen weiteren State?

Beispiel: Die Logik meldet Fehler, wenn:
- 90min Mähzeit überschritten wird ODER
- die Spannungsversorgung ausgeschaltet wird und der Mäher nicht in der Ladestation ist

Ich könnte also jetzt ein AND/ODER verwenden um in den State "Fehler" zu wechseln oder eben 2 States anlegen:
- Fehler1 (Mähzeit überschritten)
- Fehler2 (SV aus und Mäher nicht in der Ladestation)

Mein Gefühl sagt mir, dass mehrere Zustände und als Übergangsbedingung nur 1 Bedingung der richtige Weg ist.
Wie seht ihr das?

Danke und lg
Robert

Re: Fragen zur State Machine

Verfasst: So Mai 03, 2020 12:35 pm
von Robert_Mini
Kleiner Nachtrag - Hab das ganze mal skizziert, die Kommentare dienen der Umsetzung für die laufende Anzeige der Dauer Maehzeit/Ladezeit...

Jetzt fehlt nur mehr das Update auf die Insider2 morgen Früh ;)

lg
Robert

Automower_Statemachine.png

Re: Fragen zur State Machine

Verfasst: So Mai 03, 2020 2:43 pm
von MiniMaxV2
Hi Robert,
ich verstehe deine Grafik noch nicht so ganz. SV soll vermutlich die Spannungsversorgung sein? Du hast die aber als Übergangsbedingung und als Ausgangs-Mapping eingetragen. Das ist so merkwürdig :think:

Ich bin der Meinung, dass Und/Oder als vorgeschaltete Bedingung möglich sind und auch Sinn machen. Zwei Zustände brauchts nur, wenn man unterschiedliche Ausgangsmappings haben möchte. Wenn du mit mehreren States arbeitest, musst du höllisch aufpassen, in welcher Reihenfolge die Übergangstabelle aufgebaut ist. Sonst wunderst du dich später warum der Zustand X statt Y angesprungen wurde in einem Edge-Case.

Re: Fragen zur State Machine

Verfasst: So Mai 03, 2020 3:33 pm
von Robert_Mini
Hallo Hans-Martin!

Ich habe 2 Parameter, von denen das Verhalten abhängt.
Was passiert mit der Spannungsversorgung SV und was liefert der Reedkontakt (IN).

Die Anmerkungen an den Pfeilen sind immer die Änderung von SV oder IN (=Reedkontakt) um in den nächsten State zu gelangen.

d.h. von Zustand Warten mit SV kommt man nach Mähen, wenn der Automower die Ladestation verlässt (IN wechselt von 1 auf 0).
Von Mähen geht es entweder:
- nach Laden, wenn der Mäher zurückkehrt (IN wieder auf 1)
- nach Fehler Mähzeit, denn der Mäher länger als 60min im draußen ist
- nach Fehler SV, wenn während dem Mähen die SV von 1 auf 0 wechselt

Ich dachte, das ist genau das, was eine State Machine macht??

lg
Robert

Re: Fragen zur State Machine

Verfasst: So Mai 03, 2020 3:55 pm
von MiniMaxV2
Hi Robert,
ok dann verstehe ich - in den Boxen das "In=1 SV=1" sind keine Ausgangsmappings bei dir sondern die Werte die zu diesem Zustand geführt haben.
Man kann die Werte, die aus dem Eingabealphabet für den Übergang Irrelevant sind, mit einem * an den Übergang schreiben. Würde vermutlich zumindest bei den beiden SV und IN Sinn machen.

Re: Fragen zur State Machine

Verfasst: So Mai 03, 2020 4:03 pm
von Robert_Mini
Richtig.
Was meinst du mit dem "*"?

Ich bin nicht sicher, ob dieser Fall überhaupt mit der StateMachine abdeckbar ist.
Im Bsp. von S. Kolbinger und auch deiner Pumpensteuerung gibt es immer nur eine Bedingung als Bool Eingangsvariable, die den State weiterschaltet.

Danke
Robert

Re: Fragen zur State Machine

Verfasst: So Mai 03, 2020 4:18 pm
von MiniMaxV2
Du hast bei Statemachines ein sog. Eingabealphabet. Das sind bei dir streng genommen "{IN, SV, Timeout Mähen, Timeout Laden}". Man beschreibt jetzt einen Zustandsübergang mit einem "Zustand" des Eingabealphabets. Für State 2 nach 3 z.B. {1, 1, 0, *} oder von 4 nach 2 {0, 1, *, *}. Die "*" stehen dabei für "egal" und werden in der Evaluierung ignoriert bzw. haben einen beliebigen Zustand. Dieser Satz bildet jetzt eine Kombination ab, die entweder wahr oder falsch werden kann. Das ist dann der Wert, der in die Statemachine vom Wolf geht. Wie der gebildet wird, ist nebensache. Hast du Kombinationen wie {1,*,*,*}, gilt

Code: Alles auswählen

$Transition = $IN & ($SV | -$SV) & ($Timeout Mähen | -$Timeout Mähen) &  ($Timeout Laden | -$Timeout Laden) = $IN  
und damit kannst du IN direkt in der Statemachine nutzen. Hast du aber z.B. obiges erstes Beispiel gilt

Code: Alles auswählen

$Transisiton = $IN & $SV & -$Timeout
und du musst vorher dir eine "Zwischenvariable" bauen.

Die Zustandsübergangstabellen werden immer von Oben nach unten abgearbeitet. Zunächst wird verglichen, ob der aktuelle Zustand mit dem "Von" Zustand in der Tabelle übereinstimmt und dann wird die Transition-Bedingung auf wahrheit geprüft. Passt beides, wird dieser Übergang genommen und die Evaluierung beendet. Es gilt damit der erste Übergang. Damit kann man recht komplexe Spielchen machen.

Übrigens, hab ich nicht nur einfache "direkte" Übergangsbedingungen verwendet. Meistens vereinfachen sich die Ausdrücke, das stimmt, da ich auch gerne die vorgenannten "Spielchen" ausnutze und somit mit vielen "*" arbeite.

Code: Alles auswählen

// build state
        ["And", ["$ShouldRun", "$SystemOk"], "$ShouldRunAndSysOk"], //bypass to skip state 1
        ["And", ["$AutomaticModeActiveOrRequested", "$Cancel"], "$CancelAndAutoActive"], // bypass to only announce finished on cancel from state 0, 1 or 2 when automatic mode was active

        ["Statemachine",
            // 0: Circuit Off
            // 1: Requesting for SystemOK
            // 2: Circuit On
            // 3: Finishing
            [
                // [condition , current state, next state, timeout]
                // cancel state transitions
                ["$CancelAndAutoActive", 0, 3, "$Konst1"],
                ["$CancelAndAutoActive", 1, 3, "$Konst1"],
                ["$CancelAndAutoActive", 2, 3, "$Konst1"],

                ["$Cancel", 1, 0, 0],
                ["$Cancel", 2, 0, 0],        

                // normal operation state transitions
                ["$ShouldRunAndSysOk", 0, 2, 0], // bypass to skip state 1
                ["$ShouldRun", 0, 1, 0], // new request
                ["-$ShouldRun", 1, 0, 0], // cancel request
                ["$SystemOk", 1, 2, 0], // system reported ok
                ["$ShouldRun", 2, 2, 0], // running
                ["-$ShouldRun", 2, 3, "$Konst1"], // finishing
                [0, 3, 0, 0] // end
            ],
            "$State"
        ],

Re: Fragen zur State Machine

Verfasst: So Mai 03, 2020 5:16 pm
von Robert_Mini
Hallo Hans-Martin!

Danke für deine ausführliche Erklärung. Ich hab ein wenig gebraucht, um da durchzublicken... :oops:
Ich hab's so verstanden, dass am Beginn für jede Transition die Bedingung mit AND/OR in eine Bool-Variable geschrieben wird, die dann im aktuellen State für den nächsten State gilt [$Transition , aktueller State, nächster State, Timeout]

Ich werde nun meinen Fall zusammenbasteln und hoffe, dass du dann noch ein wenig Geduld für mich hast :bow-yellow: .

Danke und lg
Robert

Re: Fragen zur State Machine

Verfasst: So Mai 03, 2020 6:17 pm
von MiniMaxV2
Hi Robert,
ja Automaten sind kein einfaches Thema. Im Studium hatten wir damals ein ganzes Semester nur Moore bzw. Mealy Automaten behandelt und dann in den Folgenden Semestern immer wieder benutzt. Inklusive Design, Vereinfachung der Schaltkreise (KV-Diagramme) und und und :angelic-halo:

Was ich nicht verstehe in deiner Aussage
die dann im aktuellen State für den nächsten State gilt
Wie meinst du das? Die Variable wird vor der Evaluierung geschrieben und gilt, bis der Logikblock verlassen wird. Sobald das Modul "Statemachine" durch ist, bist du im "nächsten Zustand". Du hast aber ja dennoch alle Variablen aus deiner Logik zur Verfügung. Damit sind deine Variablen nicht State-gebunden!

Und klar - immer her mit den Fragen :angelic-blueglow:

Re: Fragen zur State Machine

Verfasst: So Mai 03, 2020 7:48 pm
von Eraser
Aus meiner Sicht meint ihr beide das gleiche, nur jeder mit anderen Worten :D