NEU! UPGRADE IP 10 verfügbar!
Optimierte Darstellung von VISU Editor und VISU Client - sowie viele weitere Verbesserungen
Infos im Wiki: https://elabnet.atlassian.net/l/cp/8HzePCm3

Insider & Leistungsmerkmale FÜR ALLE freigeschaltet
Ab sofort kann jeder die neue VISU & IFTTT testen. Info: viewtopic.php?f=8&t=5074

Release V 4 am 15. Juni 2024
Es gibt nun einen fixen Termin. Info: viewtopic.php?f=8&t=5117

NEU! Ausführliches Video Tutorial zur IP 10
Jetzt werden alle Fragen beantwortet. Das Video: https://youtu.be/_El-zaC2Rrs

[NEUHEIT] Modul "Zustandsautomat"

Hier stellen Foristen und Kunden Ihre EIGENEN Logikbausteine vor. Diese Logikbausteine stehen jedem im Rahmen der vom Autor eingeräumten / genannten Lizenz zur Verfügung.
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
S. Kolbinger
Elaborated Networks
Reactions:
Beiträge: 588
Registriert: Mi Aug 15, 2018 11:34 am
Hat sich bedankt: 82 Mal
Danksagung erhalten: 559 Mal

Modul "Zustandsautomat"

#1

Beitrag 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:
Zuletzt geändert von Robert_Mini am Do Feb 27, 2020 4:46 pm, insgesamt 2-mal geändert.
Gruß,
Stefan K.

Dragonos2000
Reactions:
Beiträge: 2183
Registriert: So Aug 12, 2018 1:38 pm
Wohnort: Karlsruher Raum
Hat sich bedankt: 482 Mal
Danksagung erhalten: 889 Mal

#2

Beitrag von Dragonos2000 »

Endlich :romance-grouphug:
Lg
Jochen
____________________________________________________________
TW 2600 #188
VPN offen, Zugriff jederzeit, Experimente jederzeit, Reboot jederzeit

Robert_Mini
Reactions:
Beiträge: 3744
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1168 Mal
Danksagung erhalten: 2076 Mal

#3

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

Sun1453
Reactions:
Beiträge: 1855
Registriert: Do Feb 07, 2019 8:08 am
Hat sich bedankt: 1570 Mal
Danksagung erhalten: 792 Mal

#4

Beitrag 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
Zuletzt geändert von Sun1453 am Do Feb 27, 2020 12:08 pm, insgesamt 2-mal geändert.
Gruß Michael

Timberwolf 950 QL #344 | Mit Internetanbindung | VPN Offen | Reboot nach Absprache | PROD Server
Timberwolf 2500 #602 | VPN offen | TEST Server | Reboot nach Absprache |
Benutzeravatar

MeisterLampe
Reactions:
Beiträge: 81
Registriert: Di Dez 18, 2018 8:17 am
Wohnort: Braunschweig
Hat sich bedankt: 35 Mal
Danksagung erhalten: 35 Mal

#5

Beitrag 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.
Zuletzt geändert von MeisterLampe am Do Feb 27, 2020 12:42 pm, insgesamt 1-mal geändert.
Viele Grüße Philipp
Timberwolf Server 2600 | ID:246 | VPN offen
Benutzeravatar

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

#6

Beitrag 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).
mfg
Wolfgang

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

jockel
Reactions:
Beiträge: 424
Registriert: Mo Aug 13, 2018 6:31 pm
Hat sich bedankt: 193 Mal
Danksagung erhalten: 147 Mal

#7

Beitrag von jockel »

Super, vielen Dank für das Modul, das eröffnet virle Möglichkeiten in der Logik!
TWS 2500 ID: 145 + 1x TP-UART + 2x DS9490R, VPN geschlossen, Reboot nach Absprache / wiregate198 (im Ruhestand)

Sun1453
Reactions:
Beiträge: 1855
Registriert: Do Feb 07, 2019 8:08 am
Hat sich bedankt: 1570 Mal
Danksagung erhalten: 792 Mal

#8

Beitrag 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?
Gruß Michael

Timberwolf 950 QL #344 | Mit Internetanbindung | VPN Offen | Reboot nach Absprache | PROD Server
Timberwolf 2500 #602 | VPN offen | TEST Server | Reboot nach Absprache |
Benutzeravatar

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

#9

Beitrag 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.
mfg
Wolfgang

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

Ersteller
S. Kolbinger
Elaborated Networks
Reactions:
Beiträge: 588
Registriert: Mi Aug 15, 2018 11:34 am
Hat sich bedankt: 82 Mal
Danksagung erhalten: 559 Mal

#10

Beitrag 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:
Gruß,
Stefan K.
Antworten

Zurück zu „Zusätzliche Logikbausteine“