Modul "Zustandsautomat"
Verfasst: Mi Feb 26, 2020 8:50 pm
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"]
Jeder Zustandsübergang besteht jeweils aus einer Liste mit vier Einträgen:
[Bedingung , aktueller Zustand, nächster Zustand, Timeout]
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.

Hier noch das Diagramm:

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
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ältDie [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"
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"]
]
}
Dabei warnt eine kurze Dunkelphase, dass das Licht nach anschließender Restlaufzeit abgeschaltet wird.

Hier noch das Diagramm:

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
