DDF-Handbuch / Anhang
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.