5.2.7.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 |
true |
boolean |
true |
liefert den booleschen Wert 'true' |
false |
boolean |
false |
liefert den booleschen Wert 'false' |
on |
boolean |
on |
liefert den gleichen Wert wie die Konstante 'true' |
off |
boolean |
off |
liefert den gleichen Wert wie die Konstante 'false' |
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' |
not |
boolean |
not value |
invertiert (negiert) einen boolean Wert, liefert 'false' wenn der Wert 'true' ist oder 'true' wenn der Wert 'false' ist |
and |
boolean |
value_1 and value_2 |
verrechnet zwei boolean Werte, liefert 'true' wenn value_1 und value_2 'true' sind, sonst 'false' |
or |
boolean |
value_1 or value_2 |
verrechnet zwei boolean Werte, liefert 'true' wenn value_1 oder value_2 'true' sind, sonst 'false' |
if |
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 *** |
then |
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 *** |
else |
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 |
mean |
float |
mean(arg_1,...,arg_n) |
liefert den arithmetischen Mittelwert der übergebenen float Argumente |
rms |
float |
rms(arg_1,...,arg_n) |
liefert den Effektivwert (RMS) aus den übergebenen float Argumenten |
ac_rms |
float |
ac_rms(arg_1,...,arg_n) |
liefert den AC-Effektivwert(AC-RMS) aus den übergebenen float Argumenten |
freq |
float |
freq(arg) freq(arg, arg2, arg3) |
ermittelt die Signal-Frequenz aus einem Datenblock über Suche positiver Level-Durchgänge. Benötigt mindestens zwei positive Level-Durchgänge im Datenblock. Liefer 0 wenn die Frequenz nicht ermittelt werden konnte. arg2 = Level (default = mean), arg3 = Hysterese (default = ac_rms/4) |
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 falls arg positiv ist, liefert sonst 0 |
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 |
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 |
running_add |
float |
running_add(arg) |
summiert die Werte von arg fortlaufend auf |
running_sub |
float |
running_sub(arg) |
berechnet fortlaufend die Differenz von arg zum jeweils vorhergehenden Wert |
first |
Typ von arg |
first(arg) |
liefert den ersten Wert aus einem Block von Daten |
last |
Typ von arg |
last(arg) |
liefert den letzten Wert aus einem Block von Daten |
at_index |
Typ von arg |
at_index(arg, i) |
liefert aus einem Block von Daten den Wert am Index i, wobei i im Bereich zwischen 0 und last_index(arg) sein muss |
at_x_pos |
Typ von arg |
at_x_pos(arg, x) |
liefert aus einem Block von Daten den Wert bei X-Achsen-Position x, wobei x im Bereich zwischen 0 und last_x_pos(arg) sein muss |
last_index |
float |
last_index(arg) |
liefert die letzte Index-Position in einem Block von Daten |
last_x_pos |
float |
last_x_pos(arg) |
liefert die letzte X-Achsen-Position in einem Block von Daten, für Zeitachsen in Sekunden, für Frequenz-Spektren in Hz |
lowpass |
float |
lowpass(data,edge,ord[,style[,ripple]]) |
wendet einen Tiefpass-Filter der Ordnung ord bei edge Hz auf die Daten an. style und ripple sind optional. Siehe 5.2.7.2 Filter berechnen |
highpass |
float |
highpass(data,edge,ord[,style[,ripple]]) |
wendet einen Hochpass-Filter der Ordnung ord bei edge Hz auf die Daten an. style und ripple sind optional. Siehe 5.2.7.2 Filter berechnen |
bandpass |
float |
bandpass(data,lower,upper, ord[,style[,ripple]]) |
wendet einen Bandpass-Filter der Ordnung ord zwischen lower Hz und upper Hz auf die Daten an. style und ripple sind optional. Siehe 5.2.7.2 Filter berechnen |
bandstop |
float |
bandstop(data,lower,upper, ord[,style[,ripple]]) |
wendet einen Bandstop-Filter der Ordnung ord zwischen lower Hz und upper Hz auf die Daten an. style und ripple sind optional. Siehe 5.2.7.2 Filter berechnen |
envelope |
float |
envelope(data[,style[,dist]]) |
berechnet die Hüllkurve über den Daten. Siehe 5.2.7.3 Hüllkurve berechnen |
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 |
minute |
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 |
fft |
float |
fft(arg) |
berechnet ein Frequenz-Spektrum (als Magnitude) mittels Fast Fourier Transformation (FFT). Wendet die 'von Hann' FFT-Fensterfunktion mit Amplitudenkorrektur auf die Eingangsdaten an. |
order_fft |
float |
order_fft(data,freq[,max_ord[,res]]) |
berechnet ein Ordnungs-Spektrum (als Magnitude) bezüglich der Grundfrequenz freq mittels Fast-Fourier-Transformation (FFT). max_ord und res sind optional. Siehe 5.2.7.4 Ordnungsspektrum berechnen |
dB |
float |
dB(arg1,arg2) |
rechnet arg1 in dB-Skalierung bezogen auf arg2 um, mit Ergebnis=20*log10(arg1/arg2). arg2 kann weggelassen werden, das hat die gleichen Auswirkung wie arg2 auf 1 zu setzen. |
extract_freq |
float |
extract_freq(fft_data, from_freq, to_freq) |
extrahiert aus dem Frequenz-Spektrum den angegebenen Frequenzbereich, indem alle Anteile außerhalb auf Null gesetzt werden |
remove_freq |
float |
remove_freq(fft_data, from_freq, to_freq) |
entfernt aus dem Frequenz-Spektrum den angegebenen Frequenzbereich, indem alle Anteile innerhalb dieses Bereichs auf Null gesetzt werden |
max_pos |
float |
max_pos(arg) |
ermittelt für den Datenblock arg die Position mit dem höchsten Wert. Für Zeitdaten ist dies der Abstand vom Beginn des Datenblocks in Sekunden, bei Frequenz-Spektren ist dies eine Frequenz. |
CpuTemp |
float |
CpuTemp() |
liefert die aktuelle CPU-Temperatur in °C |
DiskUsedPercent |
float |
DiskUsedPercent() |
liefert die aktuelle Belegung der Daten-Partition in Prozent. |
IsDataDiskFull |
bool |
IsDataDiskFull() |
prüft, ob die Daten-Partition mehr aus 95% voll ist. |
CaptureFillPercent |
float |
CaptureFillPercent() |
liefert den aktuellen Füllstand der Puffer der Datenerfassung in Prozent (sollte 50% dauerhaft nicht überschreiten) |
SamplesPerSecond |
float |
SamplesPerSecond() |
liefert die aktuell eingestellte Abtastrate als Anzahl Messwerte pro Sekunde |
SamplesPerBlock |
float |
SamplesPerBlock() |
liefert die aktuell eingestellte Blocklänge als Anzahl Messwerte pro Block |
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 Messgeräts |
SysWarnings |
float |
SysWarnings() |
liefert die Anzahl der erkannten Systemwarnungen seit Einschalten des Messgeräts |
SysErrors |
float |
SysErrors() |
liefert die Anzahl der erkannten SystemFehler seit Einschalten des Messgeräts |
BattDischarging |
bool |
BattDischarging() |
prüft, ob die installierten Akkus gerade entladen werden, liefert true wenn das Gerät auf Akku läuft, sonst false |
BattLevel |
float |
BattLevel() |
liefert den Akku-Füllstand in Prozent, falls Akkus vorhanden sind, sonst -1 |