DDF-Handbuch / Teil A – Protokoll-DDF

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;
""";
  1. Das System schreibt einen neuen Wert auf CURRENT_SET.
  2. Die WFORMULA setzt die Rohdaten (SetCurrent.0.WORD) und die Flags SetCurrent.F und EnCharging.F.
  3. 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.