Besonderheiten in Custom Logiken
Ergänzende Hinweise zum Bearbeitungsprozess einer Logik
Der Bearbeitungsprozess eine Logik wird unter Aufbau und Funktionsweise einer Logik erläutert. Für Entwickler können folgende Zusatzinformationen von Bedeutung sein:
Es gilt der Grundsatz “Abgerechnet wird erst am Schluss.” Das bedeutet zum einen, dass eine Variable, die mit einem Ausgang verbunden ist, auch erst am Ende der Abarbeitung auf den Ausgang übertragen wird. D.h. der Ausgang ändert sich nicht mehrfach, wenn die Variable sich im Ablauf mehrfach ändert.
Beim Abbruch einer Logik über den Logik-Baustein “Break” werden einerseits alle nachfolgenden Module im Code nicht mehr berechnet oder ausgeführt und andererseits werden auch keine Daten an die Ausgänge übergeben. Dies gilt auch für Variablen, die im Zeitpunkt des Erreichens des Breaks bereits berechnet worden sind.
Variablen behalten am Ende eines Logikdurchgangs ihren Wert. Damit kann in einem nachfolgenden Durchgang (d.h. bei der nächsten Auslösung eines Triggers) auf die im vorher erfolgten Durchgang zugewiesenen Werte zurückgegriffen werden. Dies ist beispielsweise für eine bedingte Ablaufsteuerung einer Logik oder für Zählerbausteine von Bedeutung.
Hinweis: Da bei Custom Logiken auch beliebige Zeitsteuerungen zum Einsatz kommen können, ist zu beachten, dass ablaufende Timer die Logik immer triggern und diese in der Folge mit den aktuellen Werten ausgewertet wird. Je nach Einstellung am Eingang/Ausgang werden die anliegenden Werte übernommen bzw. die neu ausgewerteten Ergebnisse am Ausgang gesendet.
Festlegung des Trigger- und Sendeverhaltensverhaltens
Diese Einstellungen werden bei jedem Speichern der Custom-Logik an die Oberfläche übertragen. Änderungen an der Logik-Zelle werden im 2. Schritt beim Speichern der Logik-Zelle aktiviert.
Hinweis: Der Entwickler können somit Default-Einstellungen festgelegt werden, die vom Benutzer an der Oberfläche ohne Kenntnis der Custom-Logik angepasst werden können.
Triggerverhalten an Eingängen
Im Input-Array wird für die Eingänge der Custom-Logikzelle das Triggerverhalten mittels Trigger-Option festgelegt.
"Input": [ [<Name>, <Beschreibung>, <Variablenname>, <Trigger-Option> ], ... ]
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 kann alternativ zum im Level-Array definierten Defaultwert bestimmt werden indem in der Triggeroption ein "i" hinzugefügt wird. Das Startverhalten entspricht dann" Logik sperren bis Input verfügbar ist":
"ai": Logik gesperrt bis erstmals getriggert, dann jedesmal (always)
"ci": Logik gesperrt bis Input mittels Wertänderung getriggert wird, dann Trigger bei Wertänderung (on change)
"ui": Logik gesperrt bis erstmals getriggert, generell nur Wertübernahme nach Level (update only)
Sendeverhalten an Ausgängen
Im Output-Array wird für die Ausgänge der Custom-Logikzelle das Sendeverhalten mittels Sende-Option festgelegt.
"Output": [ [<Name>, <Beschreibung>, <Variablenname>, <Sende-Option> ], ... ]
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)
"ct": bei Wertänderung oder wenn ein Timer abgelaufen ist (change / on timer)
“x”: explizites Senden nur wenn über den Modulbaustein SendeExplicit das Senden ausgelöst wird.
Für die Option “t” und “ct” wird das Senden auf allen Ausgängen mit dieser Einstellung immer ausgelöst, wenn ein zeitgesteuertes Element die Logik-Abarbeitung triggert (und zwar unabhängig davon, ob das zeitgesteuerte Element im Zusammenhang mit dem jeweiligen Ausgang steht).
Monoflop (single shot timer): Triggert nach Ablauf der Zeitdauer
Clock (zyklischer Timer) : Triggert jedesmal nach Wechsel des Taktzustandes
Cron und Wake-up (Uhrzeit abhängige Timer): Triggert jedesmal bei Erreichen der eingestellten Zeit(en)
Sendeverzögerung
In einer Custom-Logik kann diese Funktion im Modul-Array mit dem Modulbaustein “Monoflop” umgesetzt werden, insbesondere wenn die Verzögerungen von der Logik selbst berechnet werden.
Für das reine zeitverzögerte Senden wird in der Regel aber auch bei Custom-Logiken die Verzögerungsfunktion über Einstellungen in der GUI definiert.
Sperre einer Custom-Logik (inhibit)
In einer Logik-Zelle die auf einer Custom-Logik basiert kann ein Inhibit-Eingang nur angelegt werden, wenn dies vom Ersteller des Custom-Logik-Code vorbereitet wurde. Dazu verwendet man den Logik-Baustein → Break.
Einschränkungen in der Verwendung von Variablen:
Die gleiche Variable darf nicht mit einem Ein- [u]und[/u] Ausgang verbunden sein. Will man einen Wert durchschleifen, so muss eine zusätzliche Variable verwendet werden und zB per Latch der Variablenwert durchgereicht werden.
Damit das Hinzufügen, Umbenennen oder Entfernen von Ein- und Ausgängen uneingeschränkt funktioniert, dürfen Variablennamen, die mit Ein oder Ausgängen verknüpft sind, nicht Teil voneinander sein. Die Bezeichnung des Eingangs ist dabei egal.
d.h. $Input1 und $Input2 ist ok, aber $Input und $Input2 ist unzulässig, da Input Teil von Input2 ist.
Error-Handling
Die Error-Handling-Funktion ermöglicht das Ausgeben eines bool'schen Wertes in Abhängigkeit davon, ob die Logik aufgrund eines Errors abgebrochen wurde oder nicht. Dies ergibt vor allem im Zusammenspiel mit freien Formeln (CalcFormula), aber auch mit dem Baustein Ratio (Division durch 0 = Fehler).
Es wird kein Eintrag im Abschnitt MODULE benötigt, dafür aber ein Eintrag im Abschnitt LEVEL und ein Eintrag im Abschnitt OUTPUT.
"Level":[
...
[ "$Error?", "bool", false ]
],
...
"Output":[
...
["Err","Fehler","$Error?","ce"]
]
Der Fehlerausgang ist derjenige Ausgang, der in seiner Sendeoption die Buchstabenkombination "ce" aufweist. Das "c" steht, wie üblich für "sende bei Änderung". Das "e" weist ihn als den Ausgang aus, der den (Fehler-)Zustand der Zelle ausgibt.
Das Fragezeichen in der Variable ist optional, ohne erscheint der Ausgang sofort und muss nicht erst über das [+] in der Oberfläche aktiviert werden.
Wenn ein Fehler während der Berechnung passiert, wird die weitere Berechnung abgebrochen und lediglich der Fehlerausgang gesetzt.
Beachte: Es darf nur einen Fehlerausgang pro Logikzelle geben und die Variable (hier "$Error?") muss vom Typ "bool" sein und darf nicht anderweitig in der Logikzelle verwendet werden.