Statemachine (Modulbaustein)

Zustandsautomat

Inhalt dieser Seite
richtet sich an
Experten

 

Syntax

["Statemachine", [Zustandsübergangstabelle], "$State"]

Funktion

Der Modulbaustein simuliert einen Automaten, der eine bestimmte Anzahl von vordefinierten Zuständen hat und definiert, was bei einem Wechsel zwischen zwei Zuständen dieses Automaten zu erfolgen hat.
Näheres zum Thema: https://www.mikrocontroller.net/articles/Statemachine

Konkret: Wird der Modulbaustein ausgeführt, liest er den aktuellen Zustand von "$State" ein und prüft anschließend die Zustandsübergangstabelle der Reihe nach durch. Stimmen "Bedingung" und "aktueller Zustand" überein, wird der "nächste Zustand" aktiv und - falls der Timeout-Wert größer 0 ist - ein Timout-Timer gestartet. In diesem Fall wird die Überprüfung abgebrochen, und alle weiteren Zustandsübergänge ignoriert; daher ist die Reihenfolge der Zustandsübergänge entscheidend für die Funktionalität des Modulbausteins.

Zur Darstellung der Funktionalität werden in der Regel Diagramme gezeichnet, ein Beispiel findet sich unten.

Eingänge

  • "$State"(integer): Variable, die den aktuellen Zustand enthält (dient auch als Ausgang)

  • Zustandübergangstabelle: Array von mehreren Zustandsübergängen. Ein Zustandsübergang ist ein Array mit folgenden Feldern:

    • Bedingung: Variable vom Typ boolean (bspw. $Bedingung); siehe auch unten unter “Besonderheiten”

    • aktueller Zustand: Integerzahl (bspw. 5) [--- oder Variable vom Typ integer ? ----]

    • nächster Zustand: Integerzahl (bspw. 2) [--- oder Variable vom Typ integer ? ----]

    • Timeout: Variable vom Typ float (bspw. $Timeout1), wobei 0 kein Timeout bedeutet.

Ausgänge

  • "$State"(integer): Variable, die den aktuellen Zustand enthält (dient auch als Eingang)

Hinweise

  • neu ab Softwareversion V1.6

  • Die Reihenfolge der Zustandsübergänge ist entscheidend für die Funktionalität, weil die Überprüfung abgebrochen wird, sobald ein erster Zustandsübergang die Anforderungen erfüllt.

  • Eine Bedingung mit Wert 0 bedeutet "Timeout ist abgelaufen"; d.h. die Bedingung dieses Zustandsübergang ist erfüllt, wenn der Timeout-Trigger abgelaufen ist.
    Mit anderen Worten: Wurde beim Übergang in einen neuen Zustand ein Timeout-Timer gestartet und wurde der Modulbaustein nicht durch einen anderen Trigger ausgeführt, bis der Timeout abläuft, so triggert der Timeout den Modulbaustein und Bedingungen mit Null-Referenz werden wahr.

  • Die Lesbarkeit der Zustandstabelle kann durch Kommentare verbessert werden. Hier ein Beispiel für die Kommentierung der beiden Zustände in einem Zustandsübergang: ["$In" , 0 /* AUS */, 1 /* AN */, "$Time"],(zur Erinnerung Text zwischen /* und */ wird als Kommentar behandelt).

Praktische Anwendungsbeispiele

  • Einsatz im Rahmen einer Bewässerungsautomatik: https://forum.timberwolf.io/viewtopic.php?f=65&t=2118&p=23255

  • Schaltung, die das Kellerlicht nach einiger Zeit ausschaltet, falls es vergessen wurde: https://forum.timberwolf.io/viewtopic.php?f=65&t=2019

  • Beispielhaft formulierte Beschreibungen von möglichen Anwendungsfällen (stammt aus einem Forumsbeitrag)

    • Beschattungssteuerung:
      Wenn eine Reihe von Bedingungen erfüllt sind, dann wird der Behang in eine bestimmte Position gefahren (Eintreten Zustand 1)
      In dieser Position bleibt der Behang solange bis einige Bedingungen nicht mehr oder andere Bedingungen erfüllt sind (Verlassen Zustand 1)
      Danach kann auf dieselbe Art und Weise eine andere Position angefahren und verlassen werden (Zustand 2)
      Bedingungen könnten sein: Helligkeit, Sonnenwinkel, Uhrzeit, Temperatur, Terrassentür wird geöffnet,...

    • Szenensteuerung:
      Wenn Du zu Hause bist, der Fernseher eingeschaltet ist und es Tag ist, wird eine bestimmte Lichtszene gestartet und der Behang in eine bestimmte Position gefahren (um Blendeffekte zu reduzieren).
      Wird es Nacht, wechseln Lichtszene und Behang.

    • Bewässerungssteuerung:
      Abhängig von Jahreszeit, gemessener Feuchtigkeit und Wetterprognose kannst Du anders steuern.

    • Lichtsteuerung:
      Wenn der PM mehrmals direkt hintereinander (sagen wir 3 mal) aus und wieder einschaltet, verlängerst Du die Nachlaufzeit. Geht dann recht easy, indem jedes Auslösen dabei ein Wechsel in einen neuen Zustand bedeutet.

Entsprechendes Logik-Modul

 Das Modul state-machine ist nur in Custom Logiken verfügbar.

Diagramm für eine Kellerlichtschaltung (Details siehe: https://forum.timberwolf.io/viewtopic.php?f=65&t=2019#p21920)

Weitere Details und Infos hier: Ankündigung Modul Statemachine

2019 - 2023 by Elaborated Networks GmbH / Impressum / Datenschutzerklärung