Formeln & Ablaufzyklus
Die vollständige Sprachreferenz steht in der Formelinterpreter-Referenz. Hier geht es darum, wo Formeln stehen und wann sie laufen.
MUSS-Regel
Jede einzelne Formel muss mit ; abgeschlossen sein.
Der Formelinterpreter trennt Anweisungen ausschließlich am ;. Zeilenumbrüche werden beim Laden zu Leerzeichen. Ohne ; verschmelzen zwei Anweisungen zu einer ungültigen Formel. Ausnahmen sind nur die öffnenden Strukturteile IF … THEN, ELSE, ELSE IF … THEN, SWITCH x, CASE n:, DEFAULT: und FOR … DO. ENDIF;, ENDSWITCH; und ENDFOR; tragen wieder ein ;. Details: Formelreferenz.
Orte für Formeln
| Ort | Wann | Typischer Inhalt |
|---|---|---|
*READ … FORMULA |
nach jeder Ausführung der Lesefunktion (Phase PREPROCESS) | Rohdaten → Items |
*WRITE … FORMULA |
in der Phase ONCHANGE, wenn POLLING abgelaufen oder .F gesetzt ist |
Items → Rohdaten/Argumente |
*FUNCTION / *LISTENER … FORMULA |
bei Ereignissen (Listener-Empfang, OCPP-Ereignis) | Event-Auswertung |
*ITEM … RFORMULA |
zyklisch nach POLLING des Items |
abgeleitete Werte |
*ITEM … WFORMULA |
wenn das System einen neuen Wert auf das Item schreibt | Schreibbefehl auslösen |
*COMMAND … FORMULA |
beim Aufruf des Kommandos | Aktionen |
*OBJECT … SVGANIMATE |
bei jedem Neuzeichnen des Widgets | Zeichnen |
*OBJECT … SVGEVENT |
bei Mausereignissen | Interaktion |
Zyklus
flowchart TD
S[process_start] --> P[PREPROCESS: alle *READ-Funktionen<br/>deren POLLING abgelaufen oder .F gesetzt]
P --> I[process_datapoints:<br/>RFORMULA zyklisch, WFORMULA bei neuem Schreibwert]
I --> O[ONCHANGE: alle *WRITE-Funktionen<br/>deren POLLING abgelaufen oder .F gesetzt]
O --> P
Muster: Schreiben über Item → Write-Funktion
Auszug aus der Keba-DDF (MODBUS TCP):
*WRITE;ALIAS;FUNCTION;ADDRESS;COUNT;FORMULA;
;SetCurrent;FC6;5004;1;"""
SetCurrent.F:=0;
""";
;EnCharging;FC6;5014;1;"""
EnCharging.F:=0;
""";
*ITEM;ALIAS;NAME;VISIBILITY;ID;UNIT;TYPE;DIR;DEFAULT;WFORMULA;RFORMULA;POLLING;COMMENT;
;CURRENT_SET;Current Set;;14;A;real;OUT;;"""
SetCurrent.0.WORD:= ITEM.CURRENT_SET*1000;
EnCharging.0.WORD:= 1;
SetCurrent.F:=1;
EnCharging.F:= 1;
""";
- Das System schreibt einen neuen Wert auf
CURRENT_SET. - Die
WFORMULAsetzt die Rohdaten (SetCurrent.0.WORD) und die FlagsSetCurrent.FundEnCharging.F. - In der nächsten ONCHANGE-Phase sendet der Treiber FC6. Danach setzt die Formel der Schreibfunktion ihr Flag mit
SetCurrent.F:=0;zurück.
Strukturregeln mit ;
IF GetPower.Q THEN
ITEM.POWER:= GetPower.0.DWORD/1000000;
ELSE IF x > 1 THEN
ITEM.POWER:= 0;
ELSE
ITEM.POWER:= -1;
ENDIF;
SWITCH CP.STATUSID
CASE 0: ITEM.CPS:=65;
CASE 1: ITEM.CPS:=66;
DEFAULT: ITEM.CPS:=69;
ENDSWITCH;
FOR i := 1 TO 4 BY 1 DO
summe := summe + i;
ENDFOR;
DEBUG(ITEM.POWER, ITEM.CPS);
(Angelehnt an die Keba- und OCPP-DDF, die FOR-Schleife ist schematisch.)
Einzeilige Formeln in einer Zelle schließen ebenfalls mit ; ab: """SUBSCRIBE.F:=1;""".
Qualität
Ausdrücke haben eine Qualität: OK = 1, NV = 0 (nicht verfügbar), ERROR = -1. Fragen Sie vor der Übernahme von Rohdaten immer <ALIAS>.Q ab.