Grundsätzlich können als Formeln die üblichen mathematischen Operationen benutzt werden, mit Zahlen und Variablen als Argumenten.

Eine Formel wird nachfolgend auch als "ein Ausdruck" bezeichnet.

Das Ergebnis von Ausdrücken und Teil-Ausdrücken kann entweder den Typ 'float' oder den Typ 'boolean' haben. Je nach Typ sind unterschiedliche Operationen möglich.


Operationen gleicher Bindungskraft werden von links nach rechts  abgearbeitet. Prioritäten wie "Punktrechnung vor Strichrechnung" ergeben sich  aus der Priorität der Operatoren.

Die Priorität der Operatoren, beginnend mit der stärksten  Bindungskraft, ist:

      • *  /
      • - (als Vorzeichen)
      • +  -
      • =  <>  <  <= >= >
      • not
      • and
      • or
      • 'if-then-else' (bedingter Ausdruck)

Ausdrücke in runden Klammern () werden zuerst ausgerechnet.


Als Operanden sind Zahlen, Konstanten und Variablen sowie Funktionsaufrufe zulässig.


Zahlen können wahlweise mit einem Vorzeichen beginnen, dann folgen eine oder mehrere Ziffern, dann wahlweise ein Punkt '.' und weitere Ziffern; dann wahlweise ein 'e' oder 'E' und danach ein optionales Vorzeichen und dann wieder eine oder mehrere Ziffern.

Beispiele für gültige Zahlen (alle vom Typ 'float') sind: 0; -1; 3.14; 2.0E5; 2e-3


Variablen-Namen starten mit einem Buchstaben von 'a' bis 'z' oder einem Buchstaben von 'A' bis 'Z' oder mit einem Unterstrich '_'.

Danach sind im Namen die gleichen Zeichen und auch Ziffern  von '0' bis '9' erlaubt.

Andere Zeichen sind in Variablen-Namen nicht erlaubt.


Kanal-Namen können wie Variablen-Namen verwendet werden, wobei die digitalen Messwerte vom Typ 'boolean', und alle anderen  Messwerte vom Typ 'float' sind.


Bei den 'float'-Werten kann jeweils eine Einheit eingestellt werden. Diese wird jedoch nur als Test-String in der Anzeige benutzt und in den Berechnungen ignoriert. Wenn also z. B. ai01 den Wert 1 und die Einheit 'V', und ai02 den Wert 1 aber die Einheit 'mV' hat, so ergibt ai01+ai02 den Wert 2, und nicht etwa 1.001. Es liegt in der Verantwortung des Users, auf die Korrektheit der Berechnungen zu achten.


Die nachfolgend aufgeführten Bezeichner sind reserviert, und können  nicht als Variablen-Namen benutzt werden:

'not', 'and', 'or', 'if', 'then', 'else', 'true', 'false', 'on', 'off'


Konstanten

Konstante

Typ

Syntax

Beschreibung

boolean

true

liefert den booleschen Wert 'true'

boolean

false

liefert den booleschen Wert 'false'

boolean

on

liefert den gleichen Wert wie die Konstante 'true'

boolean

off

liefert den gleichen Wert wie die Konstante 'true'


Operatoren

Operator

Typ

Syntax

Beschreibung

any

( expression )

erlaubt Gruppierung von Ausdrücken

float

value_1 * value_2

liefert das Produkt aus der Multiplikation von zwei float Werten

float

value_1 / value_2

liefert den Quotienten aus der Division von zwei float Werten

float

value_1 + value_2

liefert die Summe aus der Addition von zwei float Werten

float

value_1 - value_2

liefert die Differenz aus der Subtraktion von zwei float Werten *

boolean

value_1 = value_2

vergleicht zwei boolean Werte, liefert 'true', wenn die beiden Werte gleich sind, sonst 'false' **

boolean

value_1 <> value_2

vergleicht zwei boolean Werte, liefert 'true', wenn die beiden Werte verschieden sind, sonst 'false' **

boolean

value_1 < value_2

vergleicht zwei float Werte, liefert 'true', wenn value_1 kleiner ist als value_2, sonst 'false'

boolean

value_1 <= value_2

vergleicht zwei float Werte, liefert 'true', wenn value_1 kleiner oder gleich ist als value_2, sonst 'false'

boolean

value_1 >= value_2

vergleicht zwei float Werte, liefert 'true', wenn value_1 größer oder gleich ist als value_2, sonst 'false'

boolean

value_1 > value_2

vergleicht zwei float Werte, liefert 'true', wenn value_1 größer ist als value_2, sonst 'false'

boolean

not value

invertiert (negiert) einen boolean Wert, liefert 'false' wenn der Wert 'true' ist oder 'true' wenn der Wert 'false' ist

boolean

value_1 and value_2

verrechnet zwei boolean Werte, liefert 'true' wenn value_1 und value_2 'true' sind, sonst 'false'

boolean

value_1 or value_2

verrechnet zwei boolean Werte, liefert 'true' wenn value_1 oder value_2 'true' sind, sonst 'false'

any

if Bedingung then value_1 else value_2

bedingter Ausdruck, liefert value_1 wenn Bedingung 'true' ist, sonst value_2, der else Zweig kann weggelassen werden ***

any

if Bedingung then value_1 else value_2

bedingter Ausdruck, liefert value_1 wenn Bedingung 'true' ist, sonst value_2, der 'else' Zweig kann weggelassen werden ***

any

if Bedingung then value_1 else value_2

bedingter Ausdruck, liefert value_1 wenn Bedingung 'true' ist, sonst value_2, der 'else' Zweig kann weggelassen werden ***


* '-' kann Operator oder Vorzeichen sein.


** Prüfen auf gleich '=' oder ungleich '<>' ist auf 'float' Werten nicht sinnvoll, weil durch Rundungsfehler und Rauschen auf den analogen Messwerten zwei auch "fast gleiche" 'float' Werte höchst selten "exakt gleich" sind. Darum werden diese Operationen für 'float' Werte nicht unterstützt.

Anstatt Gleichheit von float-Werten mit a = b zu prüfen, sollte auf "fast gleich" mit abs(a-b) < Schwellwert geprüft werden. Entsprechend auch abs(a-b) > Schwellwert statt a <> b.


*** Für Bedingung muss eine 'boolean' Ausdruck benutzt werden, der Ergebnis-Typ von <Wert_A> und <Wert_B> muss übereinstimmen.

Beispiel: Der Ausdruck "if x >= 0 then x else -x" liefert den Wert x wenn die Bedingung "x >= 0" erfüllt ist,  und liefert andernfalls den Wert -x. Das entspricht der Funktion "abs()".

Eine Grenzwert-Überwachung mit Hysterese könnte z. B. mit folgendem Ausdruck  realisiert werden:

       if Value > UpperLimit then true else if Value < LowerLimit then false

oder mit zwei separaten Zeilen

       if Value > UpperLimit then true

       if Value < LowerLimit then false

wobei ausgenutzt wird, dass die Ergebnis-Variable ihren bisherigen Wert behält, wenn die Bedingung nicht erfüllt ist, also wenn der (eigentlich fehlende) Default-'else'-Zweig aktiv wird.


Funktionsaufrufe bestehen aus dem Namen der Funktion eine öffnenden runden Klammer '(', einer Parameter-Liste, und einer schließenden runden Klammer ')'.

Die Parameterliste kann entweder leer sein, oder aus einem oder  mehreren Parametern bestehen, wobei mehrere Parameter durch Komma ',' voneinander getrennt werden. Jeder Parameter ist selbst wieder ein (beliebig komplexer) Ausdruck.


Definieren eigener Funktionen wird nicht unterstützt, es sind daher nur die nachfolgenden vordefinierten Funktionen möglich:


Funktionen

Funktion

Rückgabetyp

Syntax

Beschreibung

 min

float

min(arg_1,...,arg_n)

liefert das Minimum, also den kleinsten Wert aus den übergebenen float Argumenten

 max

float

max(arg_1,...,arg_n)

liefert das Maximum, also den größten Wert aus den übergebenen float Argumenten

 abs

float

abs(arg)

liefert den Absolutbetrag des übergebenen float Arguments

 round

float

round(arg)

liefert den Wert des übergebenen float Arguments, gerundet auf die nächstliegende ganze Zahl

 sqrt

float

sqrt(arg)

berechnet die Quadratwurzel von arg. arg darf nicht negativ sein.

 log

float

log(arg)

berechnet den natürlichen Logarithmus von arg. arg muss positiv sein.

 exp

float

exp(arg)

berechnet die Exponentialfunktion von arg, also e hoch arg mit e=2.71828...

 pow

float

pow(arg1, arg2)

berechnet die Potzenfunktion: arg1 hoch arg2.

 rise

boolean

rise(arg)

erkennt steigende Flanken von boolean 'false' auf 'true' oder von float unter 0.8 auf über 2.0; liefert 'true' wenn eine steigende Flanke erkannt wurde, sonst 'false'

 fall

boolean

fall(arg)

erkennt fallende Flanken von boolean 'true' auf 'false' oder von float über 2.0 auf unter 0.8; liefert 'true' wenn eine fallende Flanke erkannt wurde, sonst 'false'

 changed

boolean

changed(arg)
changed(arg,arg2)

erkennt alle Änderungen in 'arg' bzw. Änderungen in 'arg' um mindesten 'arg2'; liefert 'true', wenn eine entsprechende Änderung erkannt wurde, sonst 'false'

 keep

boolean

keep(arg,num_samples)

wenn arg 'true' ist, liefert die Funktion 'true' für mindestens 'num_samples' Werte und dann noch solange arg 'true' ist

 running_mean

float

running_mean(arg,num_samples)

berechnet den zeitbezogenen gleitenden (arithmetrischen) Mittelwert von 'arg' über die letzten 'num_samples' Werte

 running_min

float

running_min(arg,num_samples)

berechnet das zeitbezogene gleitende Minimum von 'arg' über die letzten 'num_samples' Werte

 running_max

float

running_max(arg,num_samples)

berechnet das zeitbezogene gleitende Maximum von 'arg' über die letzten 'num_samples' Werte

 year

float

year(arg)

extrahiert das Jahr aus einem TimeCode und einer TimeCode-Differenz, TimeCodes werden von UtcTime() und LocalTime() zurückgegeben

 month

float

month(arg)

extrahiert den Monat aus einem TimeCode und einer TimeCode-Differenz, TimeCodes werden von UtcTime() und LocalTime() zurückgegeben

 day

float

day(arg)

extrahiert den Tag aus einem TimeCode und einer TimeCode-Differenz, TimeCodes werden von UtcTime() und LocalTime() zurückgegeben

 hour

float

hour(arg)

extrahiert die Stunde aus einem TimeCode und einer TimeCode-Differenz, TimeCodes werden von UtcTime() und LocalTime() zurückgegeben

 min

float

minute(arg)

extrahiert die Minute aus einem TimeCode und einer TimeCode-Differenz, TimeCodes werden von UtcTime() und LocalTime() zurückgegeben

 second

float

second(arg)

extrahiert die Sekunde aus einem TimeCode und einer TimeCode-Differenz, TimeCodes werden von UtcTime() und LocalTime() zurückgegeben

 millisecond

float

millisecond(arg)

extrahiert den Sekundenbruchteil in Millisekunden aus einem TimeCode und einer TimeCode-Differenz, TimeCodes werden von UtcTime() und LocalTime() zurückgegeben

 CpuTemp

float

CpuTemp()

liefert die aktuelle CPU-Temperatur in °C

 DiskUsedPercent

float

DiskUsedPercent()

liefert die aktuelle Belegung der Daten-Partition in Prozent

 IsDataDiskFull

boolean

IsDataDiskFull()

prüft, ob die Datenpartition mehr als 95% voll ist

 SamplingInterval

float

SamplingInterval()

liefert das aktuell eingestellte Mess-Intervall in Sekunden

 UtcTime

float

UtcTime()

liefert einen Zeitcode in Sekunden seit Anfang 1970 in UTC-Zeit

 LocalTime

float

LocalTime()

liefert einen Zeitcode in Sekunden seit Anfang 1970 in lokaler Zeit

 MeasTime

float

MeasTime()

liefert die Anzahl der Sekunden seit Beginn der Messung

 SysNotices

float

SysNotices()

liefert die Anzahl der erkannten Systemmitteilungen seit Einschalten des Datenloggers

 SysWarnings

float

SysWarnings()

liefert die Anzahl der erkannten Systemwarnungen seit Einschalten des Datenloggers

 SysErrors

float

SysErrors()

liefert die Anzahl der erkannten SystemFehler seit Einschalten des Datenloggers