DDF-Handbuch / Anhang

Formelinterpreter-Referenz

Syntax

Element Syntax
Zuweisung ziel := ausdruck;
Anweisungsende ; Pflicht nach jeder Anweisung (siehe unten). Der Tokenizer behandelt ,, ebenfalls als ;; in DDF nicht verwenden.
Funktionsaufruf als Anweisung DEBUG(a, b);
Kommentar /* … */
String 'text' (in CSV: '' bzw. "" beachten)
Zahl 12, -3.5, 0xFF00AA
Eingangsvariablen x, y
Qualität OK = 1, NV = 0, ERROR = -1

Anweisungsende ; (MUSS-Regel)

MUSS-Regel

Jede einzelne Formel muss mit ; abgeschlossen sein.

Begründung laut Quellcode (Formula.cpp): Der Interpreter zerlegt einen Formeltext ausschließlich am ; in einzelne Anweisungen (addBlock). Zeilenumbrüche trennen nicht, denn beim Laden der CSV werden LF, CR und Tab zu Leerzeichen. Ohne ; werden zwei Zuweisungen zu einer einzigen, ungültigen Formel (a:=1 b:=2;).

Konstrukt mit ;? Beispiel
Zuweisung ja ITEM.POWER:=R.0.FLOAT;
Funktionsaufruf (DEBUG, SETVALUE, GUI.* …) ja GUI.setWindow(0,0,245,195,1.0);
IF … THEN nein IF R.Q THEN
ELSE / ELSE IF … THEN nein ELSE IF x>1 THEN
ENDIF ja ENDIF;
SWITCH x nein SWITCH CP.STATUSID
CASE n: / DEFAULT: nein, die Anweisung danach ja CASE 0: ITEM.CPS:=65;
ENDSWITCH ja ENDSWITCH;
FOR … DO nein FOR i := 1 TO 10 BY 1 DO;
ENDFOR / END_FOR; ja ENDFOR;
einzeilige Formel in einer Zelle ja, auch die letzte Anweisung "SETCUR.F:=1;";
mehrere Anweisungen in einer Zeile ja, jede red_val :=X.3 *255 / 32767; RGB.F:=1;

Ausdrucksfunktionen (LEN, CONCAT, TIME …) liefern einen Wert und stehen innerhalb einer Anweisung. Die Spalte „Beispiel“ in den folgenden Tabellen zeigt deshalb immer eine vollständige, mit ; abgeschlossene Anweisung.

Operatoren

Operator Bedeutung
+ - * / Arithmetik (+ verbindet bei Strings nicht automatisch, dafür CONCAT)
^ Potenz
> >= < <= == != Vergleich
&&, || logisch UND/ODER
&, | bitweise UND/ODER
&!, &~ bitweise UND-NICHT (Bits löschen)
>>, << Bit-Shift
( ) Klammerung

AND als Wortoperator kommt in Beispielen vor, ist im Parser aber nicht belegt (zu klären). Verwenden Sie &&. In JSONGETVALUEFROMARRAY sind AND/OR dagegen Parameterwerte.

Kontrollstrukturen

IF bedingung THEN
  …
ELSE IF bedingung2 THEN
  …
ELSE
  …
ENDIF;

SWITCH ausdruck
CASE 1:
  …
CASE 2:
  …
DEFAULT:
  …
ENDSWITCH;

FOR i := 1 TO 10 BY 1 DO
  …
ENDFOR;        /* oder END_FOR; */

Funktionen

Zeit

Funktion Beschreibung Beispiel
TIME(modus) aktuelle Zeit. 0 = Sekunden, sonst ms. t := TIME(0);
ISO8601(t, utc) Unix-Zeit → ISO-8601-String. 0 = lokal, 1 = UTC. tstart := ISO8601(CP.TIME_START,0);
TIMEFROMISO8601(s) ISO-8601 → Unix-Zeit t := TIMEFROMISO8601(ITEM.TIMESTAMP);
TIMEFROM_YEARDAY(jahr, yday) Unix-Zeit aus Jahr und Tag im Jahr t := TIMEFROM_YEARDAY(2026, 32);
TIMEFROM_DATE(j, m, t[, h, mi, s[, gmt]]) Unix-Zeit aus Datum t := TIMEFROM_DATE(2026, 1, 15, 12, 0, 0);
DATEYEAR(t), DATEMONTH(t), DATEDAY(t), DATEHOUR(t), DATEMIN(t), DATESEC(t), DATEYDAY(t), DATEWDAY(t) Datumsbestandteile j := DATEYEAR(t);
DATE(t) "dd.mm.yyyy hh:mm:ss TZ" ITEM.INFO := DATE(t);
GETNTPTIME([timeout, server…]) Zeit per NTP (nur auf bestimmten Plattformen) t := GETNTPTIME();

Mathematik

Funktion Beschreibung Beispiel
LOG(v, basis) Logarithmus y := LOG(x, 10);
MOD(v, d) laut Doku Rest. Der Code berechnet über modf den Bruchteil von v/d (zu klären). Die Visualization Library verwendet es als Spaltenindex. col := MOD(legendIndex, 2);
DEC(v[, d]) ganzzahliger Anteil (von v/d) n := DEC(x, 10);
ROUND(v[, stellen]) runden ITEM.T := ROUND(x, 1);
SINEFROMTIME(f, a[, phase]) Sinus über die Zeit (Testsignale) X.0 := SINEFROMTIME(0.1, 100);
PID(inst, soll, ist, P, I, D, N, T) PID-Regler mit Ausgang 0…100. Zustand in PID.<inst>.Y, .YP, .YI, .YD, .re, .tz. y := PID(1, soll, ist, 2, 30, 0, 10, 1);

Strings

Funktion Beschreibung Beispiel
CONCAT(a, b, …) verketten info := CONCAT(energy,' kWh');
SUBSTRING(s, start[, len]) Teilstring t := SUBSTRING(s, 0, 4);
SPLIT(s, trenner, idx) n-tes Element teil := SPLIT(s, ',', 1);
LEN(s) Länge n := LEN(ITEM.RFID_START);
ISEQUAL(a, b[, len]) 1 bei Gleichheit gleich := ISEQUAL(EFFEKT,'ON');
REPLACEWITHASCII(s, sub, code) sub durch das Zeichen code ersetzen ITEM.MSG := REPLACEWITHASCII(message,'0x22',0x22);
RANDOMSTRING(n) Zufallsstring id := RANDOMSTRING(8);
DECIMAL_TO_STRING(v), FLOAT_TO_STRING(v) Zahl → String energy := DECIMAL_TO_STRING(meter);
PRINT(FLOAT|DEC|STRING, format, var) printf-Formatierung strTemp := PRINT(FLOAT,'%.1f',valoutside);

Umwandlung & JSON

Funktion Beschreibung Beispiel
HEXSTRING_TO_NUMBER(hex, start, len, INT8|INT16|INT32|INT64|FLOAT|DOUBLE) Hexstring → Zahl v := HEXSTRING_TO_NUMBER(h, 0, 4, INT16);
STRING_TO_NUMBER(…) String → Zahl v := STRING_TO_NUMBER(s);
JSONGETVALUE(json, pfad) Wert am Pfad v := JSONGETVALUE(R.VALUE, 'data.temp');
JSONGETVALUEFROMARRAY(json, array, rückgabe, [AND|OR, STRING|NUMBER|ISO8601, name, op, wert]…) Element eines Arrays nach Bedingungen suchen und Feld rückgabe liefern v := JSONGETVALUEFROMARRAY(…);

Arrays

Funktion Beschreibung Beispiel
GETVALUE(prefix, suffix, idx) liest die Variable prefix.idx.suffix (Aufbau zu verifizieren) v := GETVALUE('SEND','',idx);
SETVALUE(prefix, suffix, idx, v1, …); schreibt Werte ab idx SETVALUE('SEND','',idx,r,g,b,w);
SETVALUES(prefix, suffix, idx, blöcke, v1, …); schreibt blöcke Wiederholungen von v1… ab idx (DMX, RGBW-Pixel) SETVALUES('SEND','',idx,n,r,g,b,w);

System

Funktion Beschreibung Beispiel
DEBUG(v1, v2, …); Debugausgabe v1=…, v2='…' DEBUG(R.Q, R.EC);
SAVE_JSON(…); Retain-Daten speichern (max. 2×/h) SAVE_JSON(…);
LOAD_CONFIG(); Konfiguration neu laden LOAD_CONFIG(0);
SYSTEMINFO(NAME|ID) Controllername/-ID name := SYSTEMINFO(NAME);
FUNCTION(slave, method, getset, master, start, len); Registerkopie zwischen Slaves (MODBUS) FUNCTION(…);

GUI

Siehe GUI-API: GUI.setWindow, GUI.setTimer, GUI.paintSvg, GUI.paintSVG, GUI.paintSvgLib, GUI.fillRect, GUI.rect, GUI.fillEllipse, GUI.ellipse, GUI.fillPie, GUI.pie, GUI.line, GUI.fillPath, GUI.path, GUI.fillSvgPathD, GUI.text, GUI.paintSysIcon, GUI.showInputDialog (Alias-Parameter, siehe GUI-API). Zur Auflösung der Argumente siehe GUI-API.