4.6.5 Custom-Logikbausteine

Beschreibung: Beschreibung zu benutzerdefinierten Logiken

Kategorie: Logiken

Link zu diesem Beitrag: Alles auswählen

[url=https://forum.timberwolf.io/app.php/kb/viewarticle?a=84&sid=345723059e1bc9735acee42a47e13bca]Knowledge Base - 4.6.5 Custom-Logikbausteine[/url]

Nachstehend werden die Grundlagen zu Custom Logiiken anhand eines Beispiels erklärt.
  1. Aufgabenstellung:

    Folgende Schaltung soll mittels Custom Logik abgebildet werden:
    Bild
    • Custom Logik anlegen und ändern
      Zum erstmaligen Anlegen einer Custom Logik im Logikeditor wählt man "Add Logic" und "Benutzerdefiniert Logik" und trägt dort den Code ein. Um diesen nachträglich anzupassen oder zu ändern, muss die Logikzelle zunächst z.B. durch Klicken auf das Symbol der Zelle erweitert werden und anschließend klickt man auf den Zellennamen, so als solle Dieser geändert werden.

      Code: Alles auswählen

      {
          "Level":[
              ["$In","bool",false],
              ["$dT_ON","float",0],
              ["$dT_OFF","float",0],
              ["$Out","bool",false],
              ["$Limit_ON","bool",false],
              ["$Delayed_ON","bool",false],
              ["$Extend_ON","bool",false],
              ["$VAR<Inhibit?>","bool",false]
          ],
          "Module":[
              ["Break",["$VAR<Inhibit?>"]],
              ["Monoflop","$In","-$In","$Limit_ON","$dT_ON",2],
              ["And",["$In","-$Limit_ON"],"$Delayed_ON"],
              ["Monoflop","$Delayed_ON","$Delayed_ON","$Extend_ON","$dT_OFF",4],
              ["Or",["$Delayed_ON","$Extend_ON"],"$Out"]
          ],
          "Input":[
              ["In","Eingang","$In","c"],
              ["dT_Ein","Einschaltverzögerung[s]","$dT_ON","c"],
              ["dT_Aus","Ausschaltverzögerung[s]","$dT_OFF","c"],
              ["Inhibit","INHIBIT","$VAR<Inhibit?>","u"]
          ],
          "Output":[
              ["Out","Ausgang","$Out","c"]
          ]
      }
      
    • Logik-Zelle mit Objekten verknüpfen:

      Damit erhält man folgende Logikzelle, deren Ein- und Ausgänge noch mit Objekten verbunden werden müssen:

      Bild
      • Erklärungen zur Custom Logik:

        Das Grundgerüst jeder Logik-Definition ist ein JSON-Objekt mit den Schlüsseln Level,Module, InputundOutput.
        Jeweils mit einem Array als Wert: { "Level": [] , "Module": [], "Input": [], "Output": [] }
        1. Level-Array:
          Der Level-Abschnitt ist die Deklaration von Variablen, über die Informationen zwischen Modulen, In- und Outputs ausgetauscht werden können.

          Es gilt folgende Syntax:
          "Level": [ [<Variablenname>, <Typ>, <Init value>], ... ]

          Der Variablenname ist ein String, beginnend mit einem "$". Darauf kann man sich später in Module, InputundOutput beziehen.
          Mögliche Typen: "bool", "float", "integer" oder "string"
          Mit dem Init value kann für die Variable ein Default-Wert gesetzt werden, der bis zum ersten Beschreiben der Variable gültig ist. Der Wert muss dabei zum <Typ> passen!

          Spezialfall einer Variable ist: $VAR<name?>
          Diese Variable kann später in der GUI mit Klick auf + (mehrfach) hinzugefügt werden.
          • $VAR<name?> : Mehrfache (optionale) Verwendung, d.h. kann auch weggelassen werden. Also 0 .. n
          • $VAR<name!> : Mehrfache Verwendung, aber mindestens einmal. Also 1 .. n
        2. Modul-Array:
          Im Modul-Abschnitt werden die Variablen mit den Ein-und Ausgängen der Basis-Module verknüpft.

          Es gilt folgende Syntax:
          "Modul": [ [<Basis-Modul>, <spezifische Parameter des Basis-Moduls> ], ... ]

          Die Basis-Module sind vorgegebene (kompilierte) Funktionen . Die Auswähl hängt von der Software-Version des TWS ab.
          Die genaue Beschreibung jedes einzelnen Basis-Moduls und dessen Parameter erfolgen in einem eigenen Abschnitt.

          Unter: app.php/kb/viewarticle?a=115 sind die wichtigsten Standardbausteine mit einer exemplarischen Modul-Definition aufgeführt.

          Variablen können vorangestellten Minus bei der Übergabe in ein Modul direkt invertiert werden. Beim Typ boolean verhält sich das Minuszeichen wie ein NOT, und bei float und integer wie ein *(-1).
          Achtung: Diese Syntax ist nur bei den Referenzen im "Modul"-Block erlaubt (nicht bei "Input" oder "Output)!

          Code: Alles auswählen

              "Module":[  
                   ["And",["$In","-$Limit_ON"],"$Delayed_ON"],  
              ],
          
          Hinweis:
          In den Funktionen sind aktuell nur Variablen, die im Abschnitt Level definiert wurden erlaubt. Es können keine Parameter als Zahl eingeben werden!
          Ausnahme ist, wenn ein Ausgangswert nicht weiter verwendet wird. Dann kann anstelle eines Verweises (String beginnend mit $) auf den Level auch der Zahlenwert 0 eingesetzt werden; man spart sich so eine Definition in den Levels. Beispiel:
          Statt: ["Statistic",["$VAR<Helligkeit!>"],"$Stat_Min","$Stat_Max","$Stat_Mean","$Stat_Median"]
          So: ["Statistic",["$VAR<Helligkeit!>"],0,"$Stat_Max","$Stat_Mean","$Stat_Median"]

          Alle Module (mit Ausnahme des Moduls "Break") werden in der Reihenfolge, wie sie in der Liste stehen, ausgeführt.

          Das Modul "Break" nimmt eine Sonderstellung ein. Es wertet seine 0..n Eingänge aus und bricht die weitere Abarbeitung der Logikzelle ab, falls einer der Eingänge true ist. Auch das Senden der Outputs wird unterdrückt. Break ist daher nicht geeignet, wenn beim Sperren ein definierter Zustand zB schließen eines Ventils gewünscht ist!

          • Input-Array:
            Im Abschnitt Input werden die Variablen mit den Eingängen der Custom-Logikzelle verknüft.

            Es gilt folgende Syntax:
            "Input": [ [<Name>, <Beschreibung>, <Variablenname>, <Trigger-Option> ], ... ]

            Der Name ist ein String, mit dem der Eingang in der GUI angezeigt wird.
            Die Beschreibung wird bei "Mouse over" angezeigt.
            Der Variablenname bestimmt, welche Variable mit den Eingang verknüpft ist.
            Die Trigger-Optionen bestimmen, wann ein Signal am Eingang die Berechnung der Logikzelle anstößt. Mögliche Optionen:
            • "a": jedesmal (always)
            • "c": nur bei Wertänderung (on change)
            • "u": kein Trigger, nur Wertübernahme nach Level (update only)
            Das Startverhalten ist dabei ohne weitere Angabe quasi als "x" mit im Level-Array definierten Defaultwert bestimmt. Optional kann der Triggeroption auch ein "i" hinzugefügt werden um das Startverhalten auf " Logik sperren bis Input verfügbar ist" umzustellen:
            • "ai"
            • "ci"
            • "ui"
          • Output-Array:
            Im Abschnitt Output werden die Variablen mit den Ausgängen der Custom-Logikzelle verknüft.

            Es gilt folgende Syntax:
            "Output": [ [<Name>, <Beschreibung>, <Variablenname>, <Sende-Option> ], ... ]

            Der Name ist ein String, mit dem der Ausgang in der GUI angzeigt wird.
            Die Beschreibung wird bei "Mouse over" angezeigt.
            Der Variablenname bestimmt, welcher Variable mit den Ausgang verknüpft ist.
            Die Sende-Optionen bestimmen, wann ein Wert am Ausgang gesendet wird. Mögliche Optionen:
            • "a": jedesmal (always)
            • "c": nur bei Wertänderung (on change)
            • "t": wenn ein Timer abgelaufen ist (on timer)
          • Visualisierung in Grafana:

            Wer sich die Signalverläufe in Grafana anschauen will, muss den Debug-Modus aktivieren und kann folgende modifizierte URL verwenden:
            (Bitte anpassen: timberwolfxxx.<eure domain> und LS_34 auf die ID eurer Logik ändern)

            Code: Alles auswählen

            https://timberwolf236.fritz.box/proxy/grafana/dashboard/script/view_ls.js?ls=LS_34&title=Ein-%2FAusschaltverz%C3%B6gerung&from=now-1m&to=now&orgId=1&refresh=2s&panels=%5B%5B0,%22Inputs%22%5D,%5B1,%22In%22,%22%2300B3E6%22,%22b%22%5D,%5B2,%22dT_Ein%22,%22%23FF33FF%22,%22f%22%5D,%5B3,%22dT_Aus%22,%22%23FF33FF%22,%22f%22%5D,%5B0,%22Outputs%22%5D,%5B4,%22Out%22,%22%23FFB399%22,%22b%22%5D,%5B-1,%22Internals%22%5D,%5B5,%22Limit_ON%22,%22%22,%22b%22%5D,%5B6,%22Delayed_ON%22,%22%22,%22b%22%5D,%5B7,%22Extend_ON%22,%22%22,%22b%22%5D%5D
            das könnte dann etwa so aussehen:
            Bild