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)
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

 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

 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.

 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 Millisekunden, 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