Seite 1 von 2

Modul "Zustandsautomat"

Verfasst: Mi Feb 26, 2020 8:50 pm
von S. Kolbinger
Es gibt ein neues Modul für die Logic-Engine: Den "Zustandsautomat" oder auch "State machine"

Dieses Modul besitzt auch einen optionalen (Timeout-)Timer.
Wobei der Timeout als zusätzliche Eingangsbedingung verwendet werden kann.

Die Syntax für den Zustandsautomat sieht folgendermassen aus:
["Statemachine", [Zustandsübergangstabelle], "$State"]
    "Statemachine" : Modulkennung
    "$State": Referenz auf einen integer Level der den aktuellen Status enthält

Die [Zustandsübergangstabelle] ist eine Liste aus mehreren Zustandsübergängen.
Jeder Zustandsübergang besteht jeweils aus einer Liste mit vier Einträgen:
[Bedingung , aktueller Zustand, nächster Zustand, Timeout]
  • Bedingung: Referenz auf einen boolschen Level
  • aktueller Zustand: Integerwert, der den Zustand repräsentiert
  • nächster Zustand: Integerwert, der den Zustand repräsentiert
  • Timeout: Referenz auf "float"
Hier ein Beispiel:

Code: Alles auswählen

{
  "Level": [
    ["$In","bool",false],
    ["$State","integer",0],
    ["$Time","float",10.0],         // Zeit für erste Leuchtdauer
    ["$Dark","float",0.2],          // Zeit für Dunkelphase vor der Restlaufzeit
    ["$Warn","float",3.0],          // Restlaufzeit
    ["$Light","bool",false],
    ["$ConstTrue","bool",true],
    ["$VAR<Inhibit?>","bool",false]
  ],
  "Module": [
    ["Break",["$VAR<Inhibit?>"]],
    ["Statemachine",
     // 0: Licht aus
     // 1: Licht ein + Timer läuft
     // 2: kurz Dunkel (als Warnung, dass nur noch Restlaufzeit kommt)
     // 3: Lich an + Restlaufzeit läuft
      [
        ["$In" , 0, 1, "$Time"],    // einschalten, Timer starten
        [  0   , 1, 2, "$Dark"],    // Zeit abgelaufen
        ["-$In", 1, 0,   0    ],    // ausschalten
        ["$In" , 1, 1, "$Time"],    // Zeit neu starten
        [  0   , 2, 3, "$Warn"],    // Dunkelzeit abgelaufen -> Warnzeit
        ["$In" , 2, 1, "$Time"],    // Zeit neu starten
        ["-$In", 2, 0,   0    ],    // ausschalten
        [  0   , 3, 0,   0    ],    // Warnzeit abgelaufen
        ["$In" , 3, 1, "$Time"],    // Zeit neu starten
        ["-$In", 3, 0,   0    ]     // ausschalten
      ],
      "$State"
    ],
    ["Multiplexer",[0,"$ConstTrue",0,"$ConstTrue"],"$Light","$State"]
  ],
  "Input": [
    ["Input","Eingang Schalter Ein/Aus","$In","a"],
    ["Dauer","Zeit [s]","$Time","c"],
    ["Reserve","Restlaufzeit [s] nach Warnung","$Warn","c"],
    ["Inhibit","INHIBIT","$VAR<Inhibit?>","u"]
  ],
  "Output": [
    ["Status","Zustand","$State","c"],
    ["Licht","Licht","$Light","c"]
  ]
}
Obiges Beispiel ist eine Schaltung, die das Kellerlicht nach einiger Zeit ausschaltet, falls es vergessen wurde.
Dabei warnt eine kurze Dunkelphase, dass das Licht nach anschließender Restlaufzeit abgeschaltet wird.

Bild

Hier noch das Diagramm:
Bild

Der Zustandsautomat funktioniert folgendermaßen:
Wird das Modul ausgeführt, liest es den aktuellen Zustand von "$State" ein und geht anschließend die Zustandsübergangstabelle der Reihe nach durch. Stimmen "Bedingung" und "aktueller Zuständ" überein, wird der "nächste Zustand" aktiv und (falls der Timeout-Wert größer 0 ist) ein Timout-Timer gestartet.
Sobald der erste Zustandsübergang zutrifft, werden die nachfolgenden Einträge ignoriert. Die Reihenfolge der Einträge ist daher entscheidend für die Funktionalität.

Besonderheit Null-Referenz bei "Bedingung":
Die 0 bedeutet hier als Bedingung: "Timout ist abgelaufen"!!!
Mit anderen Worten: Wurde beim Übergang in einen neuen Zustand ein Timeout-Timer gestartet und wurde die Logik (genauer das Modul) nicht durch einen anderen Trigger ausgeführt, bis der Timeout abläuft, so triggert der Timeout die Logik und Bedingungen mit Null-Referenz werden wahr.

Das Modul ist bereits in der aktuellen DEV-Version verfügbar. Viel Spaß beim ausprobieren :handgestures-thumbupright:

Re: Modul "Zustandsautomat"

Verfasst: Do Feb 27, 2020 7:30 am
von Dragonos2000
Endlich :romance-grouphug:

Re: Modul "Zustandsautomat"

Verfasst: Do Feb 27, 2020 7:37 am
von Robert_Mini
Dragonos2000 hat geschrieben: Do Feb 27, 2020 7:30 am Endlich :romance-grouphug:
Da bin ich aber auf ein Tutorial gespannt, denn das ist wirklich ein Thema, wo ich mich gar nicht auskenne.

Auch mit Google bin ich da nicht sofort erleuchtet...

Könnte aber für die übergeordnete Steuerung der Beschattung interessant sein!

Lg
Robert

Re: Modul "Zustandsautomat"

Verfasst: Do Feb 27, 2020 12:04 pm
von Sun1453
Da wäre ja dieser FR als erledigt zu sehen oder sehe ich das falsch: FR

Nur mal zum Verständniss:

["$In" , 0, 1, "$Time"], // einschalten, Timer starten -> neuer Zustand ist 1 und wird übernommen in die nächste Zeile an Pos 2 siehe Markierung
[ 0 , 1, 2, "$Dark"], // Zeit abgelaufen --> Wie kann hier etwas passieren ? Bedingung 0 und Aktueller Wert 1 ...
["-$In", 1, 0, 0 ], // ausschalten
["$In" , 1, 1, "$Time"], // Zeit neu starten
[ 0 , 2, 3, "$Warn"], // Dunkelzeit abgelaufen -> Warnzeit
["$In" , 2, 1, "$Time"], // Zeit neu starten
["-$In", 2, 0, 0 ], // ausschalten
[ 0 , 3, 0, 0 ], // Warnzeit abgelaufen
["$In" , 3, 1, "$Time"], // Zeit neu starten
["-$In", 3, 0, 0 ] // ausschalten

Re: Modul "Zustandsautomat"

Verfasst: Do Feb 27, 2020 12:39 pm
von MeisterLampe
Siehe hier
S. Kolbinger hat geschrieben: Mi Feb 26, 2020 8:50 pm Besonderheit Null-Referenz bei "Bedingung":
Die 0 bedeutet hier als Bedingung: "Timout ist abgelaufen"!!!
Mit anderen Worten: Wurde beim Übergang in einen neuen Zustand ein Timeout-Timer gestartet und wurde die Logik (genauer das Modul) nicht durch einen anderen Trigger ausgeführt, bis der Timeout abläuft, so triggert der Timeout die Logik und Bedingungen mit Null-Referenz werden wahr.
Verstehe es so, dass du die Bedingung auf 0 setzt, wenn du nach einer Zeit den Zustand wechseln willst.

Re: Modul "Zustandsautomat"

Verfasst: Do Feb 27, 2020 12:55 pm
von Eraser
Korrekt.

Bedingung 0 wird automatisch vom Zustandsautomaten ausgeführt falls die parametrierte Zeit abgelaufen ist.
Deswegen gibt es bei dem Beispiel 3x die 0-Bedingung, jeweils wenn in Schritt 1, 2 oder 3.
Es wird ja nicht alles nach der Reihe abgearbeitet, sondern nur nach der Reihe durchgesehen, bis die "richtige" Zeile gefunden wurde und dann ausgeführt wird.

Die Bedingungen für das Ausführen sind (wie oben beschrieben) das der Trigger stimmt (1. Wert) und dass der aktuelle Schritt gleich ist (2. Wert).

Re: Modul "Zustandsautomat"

Verfasst: Do Feb 27, 2020 1:43 pm
von jockel
Super, vielen Dank für das Modul, das eröffnet virle Möglichkeiten in der Logik!

Re: Modul "Zustandsautomat"

Verfasst: Do Feb 27, 2020 3:41 pm
von Sun1453
Eraser hat geschrieben: Do Feb 27, 2020 12:55 pm Korrekt.

Bedingung 0 wird automatisch vom Zustandsautomaten ausgeführt falls die parametrierte Zeit abgelaufen ist.
Deswegen gibt es bei dem Beispiel 3x die 0-Bedingung, jeweils wenn in Schritt 1, 2 oder 3.
Es wird ja nicht alles nach der Reihe abgearbeitet, sondern nur nach der Reihe durchgesehen, bis die "richtige" Zeile gefunden wurde und dann ausgeführt wird.

Die Bedingungen für das Ausführen sind (wie oben beschrieben) das der Trigger stimmt (1. Wert) und dass der aktuelle Schritt gleich ist (2. Wert).
Danke für die Info.

"-$In" Was hat es damit auf sich? Ist das einfach die negierung des Wertes der hinter dem Parameter steckt?

Re: Modul "Zustandsautomat"

Verfasst: Do Feb 27, 2020 3:44 pm
von Eraser
-$In bedeutet eine Negierung, d.h. es wird nicht auf ein 1-Signal geschaut, sondern auf ein 0-Signal.
In diesem Beispiel wäre es das manuelle Abschalten des Lichts oer z.B. Lichttaster.

Re: Modul "Zustandsautomat"

Verfasst: Do Feb 27, 2020 3:53 pm
von S. Kolbinger
Habe hier viewtopic.php?f=65&t=2019#p21920 noch das Diagramm eingefügt.
Damit sollte es leichter zu verstehen sein. :handgestures-fingerscrossed: