Versionen im Vergleich

Schlüssel

  • Diese Zeile wurde hinzugefügt.
  • Diese Zeile wurde entfernt.
  • Formatierung wurde geändert.

Einführung

...

  • ein Wertübergabeeingang (Input), sofern seine Triggerfunktion auf A (always) oder C (on Change) gesetzt ist (näheres siehe sogleich);

  • ein spezieller Triggereingang, der abhängig von einem äusseren Ereignis die Logik triggert; als solche Trigger dienen können

    • ein Zeitintervall (bspw. alle 30 Sekunden),

    • ein Zeitpunkt (bspw. 08:25 Uhr) oder

    • ein “Data Value” --------- Was ist das? ---------;

  • ein Trigger, welcher innerhalb einer Custom-Logik (bspw. über den Logikbaustein "Clocksignal") codiert wurde.

Triggerfunktionen über einen Input (Wertübergabeeingang)

...

Ein Eingang kann zwei Triggerfunktionen annehmen, oder es kann seine Triggerfunktion ausgeschaltet werden. Es ist aber auch möglich, die Triggerfunktion des Eingangs auszuschalten:

  • Einstellung “A” (always): Der Eingang funktioniert immer als Trigger ----- was bedeutet dies genau -----

  • Einstellung “C” (on change): Der Eingang funktioniert nur bei einer Wertänderung als Trigger.

  • Einstellung “U” (update): Der Eingang funktioniert nicht als Trigger, d.h. sein Wert wird einzig an die Eingangsvariable übergeben.

Hinweise: Bei der Definition im Input-Array einer Custom-Logik werden in der Regel die entsprechenden Kleinbuchstaben verwendet (also “a”, “c” oder “u”):

Codeblock
languagejson
  "Input": [
    ["Eingang 1 ","(mit Triggerfunktion always)","$In1","a" ],
    ["Eingang 2 ","(mit Triggerfunktion on change)","$In2","c" ],
    ["Eingang 3 ","(ohne Triggerfunktion)","$In3","u" ]
  ]

Triggerfunktion über einen Zeitintervall-Auslöser

Oft ist es gewünscht, eine Logik regelmässig in einem bestimmten Rhythmus durchlaufen zu lassen. In solchen Fällen muss ein Zeitintervall-Trigger angewendet werden.

In der GUI kann dies erreicht werden, indem ein Trigger-Eingang erstellt wird und diesem die Quelle “Intervall“ zugeordnet wird. Als Intervall kann eine beliebige Zahl von Sekunden eingegeben werden.

...

In einer Custom-Logik verwendet man hierfür den Logikbaustein → Clocksignal.

Will man das Zeitintervall nur zu bestimmten Zeiten (bspw. nur am Sonntag) laufen lassen, wählt man in der GUI als Source nicht “Intervall”, sondern “Zeit” und dort den Typ “Intervall”.

In einer Custom-Logik erreicht man dieses Ziel über ----------------------- ???? noch nicht versucht, ich vermute über “Cron” ---------------.

Triggerfunktion zu einem bestimmten Zeitpunkt

Will man ein Logik nur an einem bestimmten Zeitpunkt (bspw. jeden Tag um 08:15 Uhr ausführen lassen, kann ein Zeitpunkt-Trigger verwendet werden.

In der der GUI erstellt man hierfür wiederum einen Triggereingang und wählt als Quelle “Zeit”.

...

Die Eingabemaske erlaubt es, entweder eine Zeit einzugeben und über die jeweiligen Checkboxen die gewünschten Wochentage auszuwählen. Das obige Beispiel führt dazu, dass die Logik jeweils werkstags um 08:15 Uhr “getriggert wird.CRON-Syntax

Werden komplexere Lösungen erforderlich, kann dies mit Hilfe der Cron-Syntax realisiert werden. Zu diesem Zweck wählt man in der vorstehenden Eingabemaske als Typ nicht “Zeit“, sondern “Cron-Syntax”. Man erhält so ein Eingabefeld, in welches man einen String eingeben kann. Dieser String muss der Cron-Syntax entsprechen.

Dies baut auf 6 Feldern auf, welche jeweils durch eine Leerschlag voneinander getrennt sind. Die Reihenfolge der Felder ist wie folgt vorgegeben:

┌───────────── Sekunde (0 - 59)
│ ┌───────────── Minute (0 - 59)
│ │ ┌───────────── Stunde (0 - 23)
│ │ │ ┌───────────── Tag des Monats (1 - 31)
│ │ │ │ ┌───────────── Monat (1 - 12)
│ │ │ │ │ ┌───────────── Wochentag (0 - 6)
│ │ │ │ │ │

*  *  *  *  * *

Das erste Feld repräsentiert somit, die Sekunden, das zweite die Minuten, dass dritte die Stunden und so weiter.

Weil intern immer die Cron-Syntax verwendet wird, werden auch alle über die GUI-Maske eingegebenen Zeitpunkt-Trigger in der Cron-Syntax behandelt. Dies sieht man in der obigen Eingabemaske. Dort wird unten das Ergebnis der Eingabe über die Felder wie folgt dargestellt: 0 15 8 * * 1,2,3,4,5 Dieser String lässt sich nun einfach übersetzen:

Feld

Wert

Erläuterung

1 (Sekunde)

0

0 Sekunden

2 (Minute)

15

15 Minuten

3 (Stunde)

8

8 Uhr

4 (Tag des Monats)

*

Weil “*” in der Cron-Syntax für “beliebig” steht, ist der Tag des Monats unbeachtlich, oder mit anderen Worten: Der Trigger wird an jedem Tag ausgelöst

5 (Monat)

*

Siehe Feld 4

6 (Wochentag)

1,2,3,4,5

In diesem Feld findet sich eine Aufzählung; Aufzählungen werden in der Cron-Syntax durch ein Komma (jedoch ohne Leerschlag, weil dieser als Feldtrennzeichen dient) gekennzeichnet. Der Trigger wird somit am Montag (1), Dienstag (2) , …, Freitag (5) ausgelöst; nicht aber am Sonntag (0) und am Samstag (6), weil diese in der Aufzählung nicht erscheinen.

Weitere Erläuterungen zur Cron-Syntax (einer in der UNIX-Welt gebräuchlichen Notation) findet sich bspw. unter https://de.wikipedia.org/wiki/Cron

...

; zu beachten ist, dass die Cron-Syntax des TWS zusätzlich auch ein Feld Sekunden (ganz links)

...

vorsieht.

Über die Cron-Syntax können auch Intervalle definiert werden: Der String 0 0/30 0-5,21-23 * * *

...

führt dazu, dass der Trigger jeden Tag, im Zeitraum zwischen 21 Uhr bis 05 Uhr jeweils zur ganzen Stunden und dann in einem Intervall von 30 Minuten ausgelöst wird.

In der GUI ist dies in einem etwas eingeschränkterem Rahmen auch möglich, in dem man in der Eingabemaske “Source” den Typ Intervall anwendet.

Triggerfunktion über einen Wertveränderung am Eingang

[--------- Das fehlt, ich habe dies noch nicht ausprobiert ----]

Abbruchfunktionen

In bestimmten Situationen soll die Ausführung einer Logik abgebrochen werden, resp. die Logik soll schon gar nicht ausgeführt werden. Erfolgt ein Abbruch, wird nichts mehr an die Ausgänge gesendet.

In der GUI wird ein Abbruch erreicht, indem man einen Inhibit-Eingang erstellt. Sobald auf diesem ein TRUE eintrifft, wird die Ausführung der Logik abgebrochen oder umgekehrt, solange am Eingang ein FALSE anliegt, wird die Logik ausgeführt.

In einer Custom-Logik verwendet man hierfür den Logik-Baustein → Break. Sobald einer seiner Eingänge - er kann mehrere haben - auf TRUE gesetzt wird, bricht auch hier die Ausführung der Logik ab.
Beim einem Abbruch werden keine im Code nachfolgenden Logik-Bausteine mehr berechnet und ausgeführt. Es wird auch kein Ausgang gesendet, selbst wenn die eine Variable, die einem Ausgang zugeordnet ist, bereits gesetzt worden ist.
Die Verwendung von ["Break", ["$VAR<Inhibit?>"]] erlaubt es, in der GUI beliebig viele Eingänge hinzuzufügen, die den Abbruch einer Custom-Logik triggern können.

Ab hier Steinbruch (, d.h. blosse Grundlage für die weitere redaktionelle Bearbeitung)

  • Optionen für Eingänge

    • Parameter: Definiert für einen Eingang einen konstanten Wert. Achtung: Dieser wird nur beim Abspeichern in die Berechnung übernommen.

    • Innerhalb Bereich: Prüft ob der Eingangswert im Bereich liegt (wenn ja, dann bekommt der Eingang den Zustand "true", sonst "false").

    • Schwellwert unter: Wird der Schwellwert unterschritten, dann nimmt der Eingang den Zustand "true" an.

    • Schwellwert über: Wird der Schwellwert überschritten, dann nimmt der Eingang den Zustand "true" an.

    • Schwellwert mit Hysterese: Wird die obere Grenze überschritten, dann nimmt der Eingang den Zustand "true" an, beim Unterschreiten des unteren Grenze schaltet der Eingang auf "false". Dazwischen verbleibt der Eingang im bisherigen Zustand.

  • Optionen für Ausgänge

    • Mapping: Damit kann den Werten true/false ein beliebiger Wert zB Szenennummer oder Float-Zahl zugeordnet werden.

    • Einschaltverzögerung: Das Einschalten von 0 auf 1 wird um eine definierte Zeit verzögert gesendet.

    • Ausschaltverzögerung: Das Ausschalten von 1 auf 0 wird um eine definierte Zeit verzögert gesendet.

    • Ein- und Ausschaltverzögerung: Das Umschalten von 0 auf 1 und 1 auf 0 wird verzögert. Es können getrennte Verzögerungszeiten für das Ein- bzw. Ausschalten definiert werden.

    • Hinweis: Man kann einem Ausgang mehrere Ziele zuordnen! Zu diesem Zweck einfach in der Zielauswahl (DOS) eine weitere Auswahl treffen.

  • Neuberechnung, sobald

    • entweder sich ein Eingangsinal ändert

    • oder ein Triggereingang betätigt wird.

    • Nicht bei Wertänderung eines Parameters (bspw. im Doktor-Modus)

  • Trigger-Optionen an den Eingängen

    • "a" (always): Jedesmal wenn ein Telegramm am Eingang empfangen wird.

    • "c" (on change): wenn ein Telegramm mit geändertem Wert empfangen wurde

    • "u" (update only): kein Trigger der Logikzelle, aber der Wert wird in die Logik übernommen. Wird die Logik durch einen anderen Eingang oder Trigger später ausgeführt, wird der letzte an diesem Eingang empfangene Wert verwendet. "u" ist eigentlich selten notwendig, insbesondere aber, wenn ein Objekt mehrfach an eine Zelle angeschlossen ist zB. Eingang + Inhibit. Ausführlicheres siehe hier: https://forum.timberwolf.io/app.php/kb/viewarticle?a=120

  • Sende-Optionen an den Ausgängen

    • "a": jedesmal (always)

    • "c": nur bei Wertänderung

    • "t": wenn ein Timer abgelaufen ist (on timer);
      Die Option "t" ist nicht selektiv, d.h. werden mehrere Timer in einer Custom Logik verwendet, dann führt jeder abgelaufene Timer dazu, dass der Ausgang gesendet wird. Zu beachten ist, dass bei Verwendung eines Timers die Berechnungen weiterhin durchgeführt werden (abhängig von der Optionen der Eingänge), nur eben nichts gesendet wird. Mögliche Timer-Module sind:

      • Monoflop (single shot timer): Triggert nach Ablauf der Zeitdauer

      • Clock (zyklischer Timer) : Triggert jedesmal nach Wechsel des Taktzustandes

      • Cron (Uhrzeit abhängiger Timer): Triggert jedesmal bei erreichen der eingestellten Zeit(en)

  • Trigger-Definition

    • Intervall: zyklisches Senden

    • Data Value: Zusätzliches Eingangsobjekt, dass als Trigger dient.

    • Zeit: Trigger zu einem bestimmten Zeitpunkt (auswählbar Wochentage und Uhrzeit)

  • Unterschied Start / Stop (unten rechts) / Inhibit / Abkoppeln (am Ein- oder Ausgang)

    • "Stop" führt zu einem Pausieren, d.h. es werden keine Werte an den Eingängen gelesen

    • Ein Inhibit-Eingang führt dazu, dass die übrigen Eingänge zwischenzeitlich weiter aktualisiert werden

    • Abkoppeln ist vor allem für Tests mit dem Doktormodus geeignet.

...