UPGRADE IP 9 verfügbar!
Timberwolf VISU jetzt mit NEUEM Layout Editor
Freie Anordnung, Reihenfolge und Größe der Widgets - viele weitere Verbesserungen
Infos im Wiki: https://elabnet.atlassian.net/l/cp/06SeuHRJ

NEU! Insider & Leistungsmerkmale FÜR ALLE freigeschaltet
Damit kann nun jeder das Upgrade vornehmen und VISU & IFTTT testen. Alle Info hier: viewtopic.php?f=8&t=5074

[DISKUSSION] Fragen zur State Machine

Informationen und Diskussionen über Logik-Engine und Logik-Editor
Forumsregeln
  • Denke bitte an aussagekräftige Titel und gebe dort auch die [Firmware] an. Wenn ETS oder CometVisu beteiligt sind, dann auch deren Version
  • Bitte mache vollständige Angaben zu Deinem Server, dessen ID und dem Online-Status in Deiner Signatur. Hilfreich ist oft auch die Beschreibung der angeschlossener Hardware sowie die verwendeten Protokolle
  • Beschreibe Dein Projekt und Dein Problem bitte vollständig. Achte bitte darauf, dass auf Screenshots die Statusleiste sichtbar ist
  • Bitte sei stets freundlich und wohlwollend, bleibe beim Thema und unterschreibe mit deinem Vornamen. Bitte lese alle Regeln, die Du hier findest: https://wiki.timberwolf.io/Forenregeln

Ersteller
Robert_Mini
Reactions:
Beiträge: 3741
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1164 Mal
Danksagung erhalten: 2058 Mal

Fragen zur State Machine

#1

Beitrag 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
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

Ersteller
Robert_Mini
Reactions:
Beiträge: 3741
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1164 Mal
Danksagung erhalten: 2058 Mal

#2

Beitrag 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
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

MiniMaxV2
Reactions:
Beiträge: 274
Registriert: Sa Jan 12, 2019 8:41 pm
Wohnort: Bremen
Hat sich bedankt: 342 Mal
Danksagung erhalten: 151 Mal

#3

Beitrag 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.
LG
Hans Martin
timberwolf413 (950Q) - VPN offen - reboot erlaubt / timberwolf610 (950Q) - VPN offen - reboot erlaubt

Ersteller
Robert_Mini
Reactions:
Beiträge: 3741
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1164 Mal
Danksagung erhalten: 2058 Mal

#4

Beitrag 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
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

MiniMaxV2
Reactions:
Beiträge: 274
Registriert: Sa Jan 12, 2019 8:41 pm
Wohnort: Bremen
Hat sich bedankt: 342 Mal
Danksagung erhalten: 151 Mal

#5

Beitrag 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.
LG
Hans Martin
timberwolf413 (950Q) - VPN offen - reboot erlaubt / timberwolf610 (950Q) - VPN offen - reboot erlaubt

Ersteller
Robert_Mini
Reactions:
Beiträge: 3741
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1164 Mal
Danksagung erhalten: 2058 Mal

#6

Beitrag 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
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

MiniMaxV2
Reactions:
Beiträge: 274
Registriert: Sa Jan 12, 2019 8:41 pm
Wohnort: Bremen
Hat sich bedankt: 342 Mal
Danksagung erhalten: 151 Mal

#7

Beitrag 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"
        ],
Zuletzt geändert von MiniMaxV2 am So Mai 03, 2020 4:25 pm, insgesamt 1-mal geändert.
LG
Hans Martin
timberwolf413 (950Q) - VPN offen - reboot erlaubt / timberwolf610 (950Q) - VPN offen - reboot erlaubt

Ersteller
Robert_Mini
Reactions:
Beiträge: 3741
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1164 Mal
Danksagung erhalten: 2058 Mal

#8

Beitrag 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
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

MiniMaxV2
Reactions:
Beiträge: 274
Registriert: Sa Jan 12, 2019 8:41 pm
Wohnort: Bremen
Hat sich bedankt: 342 Mal
Danksagung erhalten: 151 Mal

#9

Beitrag 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:
LG
Hans Martin
timberwolf413 (950Q) - VPN offen - reboot erlaubt / timberwolf610 (950Q) - VPN offen - reboot erlaubt
Benutzeravatar

Eraser
Reactions:
Beiträge: 646
Registriert: So Aug 12, 2018 1:51 pm
Wohnort: Amstetten, Österreich
Hat sich bedankt: 205 Mal
Danksagung erhalten: 275 Mal

#10

Beitrag von Eraser »

Aus meiner Sicht meint ihr beide das gleiche, nur jeder mit anderen Worten :D
mfg
Wolfgang

Timberwolf 2500 #151 / VPN offen / Reboot nach Rücksprache
+ PBM #938
Antworten

Zurück zu „Logikengine & Logik-Editor“