5.2.6.1 Mathematische Funktionen
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) |
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 |
time_counter |
float |
time_counter(arg,restart) |
zählt die Sekunden, in denen 'arg' aktiv (high) ist. 'arg' und 'restart' müssen boolesche Variablen oder Ausdrücke sein. Mit 'restart' wird der Wert zurückgesetzt. |
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 |