Funktionen und Kalkulationen

Die EA uniTFTs-Serie kann zur Laufzeit kleine mathematische Aufgaben lösen. Zusätzlich bieten logische Operatoren die Möglichkeit, Entscheidungen zu treffen (ähnlich einer if-Anweisung). Um Benutzereingaben auswerten oder das Layout optimieren zu können, sind ebenso Kalkulationsbefehle vorhanden, die Objekteigenschaften auslesen können (wie zum Beispiel Bargraphwert, letzte Touchposition oder aber Objektbreite und -position). Die meisten Funktionen sind sowohl als Integer- als auch als Fließkommaberechnung vorhanden. Es muss darauf geachtet werden im jeweiligen

Zahlenbereich zu bleiben, bzw. mit dem cast-Operator (float bzw. int) zu wandeln.

Das Modul arbeitet mit little-endian (Intel-Format), das kleinstwertige Byte wird also zuerst übertragen.

Hinweis:

Kalkulationen müssen immer innerhalb von Klammern (...) ausgeführt werden. Siehe Parameterübergaben für weitere Informationen.



signed Integer

(32 Bit)

Float

IEEE 754

(32-Bit)

Mathematische Funktionen

Arithmetische Funktionen

+, -, * , /, ()

Betrag |x|

abs(x)

Vorzeichen von x (-1, 0, 1): x<0, x==0, x>0

sign(x)

Modulo x%y

mod(x,y)

Potenz x^y

pow(x,y)

Wurzel

sqrt(var)


n-te Wurzel (ab V.1.1)

sqrt(var,n)


Kommastellen abschneiden

trunc(var)


Kommastellen runden

round(var)


Logarithmus (Basis n) (ab V1.1)

log(var,n)


Logarithmus (Basis 10)

log(var)


Natürlicher Logarithmus (ln, Basis e)

ln(var)


Exponentialfunktion mit Basis e

exp(var)


Grad in Rad

rad(deg)


Rad in Grad

deg(rad)


Sinus

sin(deg)


Kosinus

cos(deg)


Tangens

tan(deg)


Arkussinus

asin(var)


Arkuskosinus

acos(var)


Arkustangens

atan(var)


Arkustangens, Quadranten-richtig

atan(y,x)


Minimum

min(a,b,c…)

Maximum

max(a,b,c…)

Durchschnitt

avg(a,b,c…)

Zufallswert sv <= x <= ev (max 65535)

rand(sv,ev)

Zufallswert 0 <=x <= ev (max 65535)

rand(ev)

Zufallswert 0<= x<=1000

rand()

Register increment / decrement

pre-/post- increment

++Rx, Rx++

pre-/post-  decrement

--Rx, Rx--

Cast Integer Float

Integer Kalkulation ausführen, Float zurückgeben

int(Kalkulation/Funktion)


Float Kalkulation ausführen, Integer zurückgeben

float(Kalkulation/Funktion)


Bit Operatoren

Low Byte

loB(x)


High Byte

hiB(x)


Low Word

loW(x)


High Word

hiW(x)


Low Byte von High Word

hwloB(x)


High Byte von High Word

hwhiB(x)


AND

&


OR

|


NOT

~


XOR

^


Shift links / rechts

<<, >>


Bit setzen (Bit-Nr. 0..31)

bitS(Wert, Bit-Nr.)


Bit löschen (Bit-Nr. 0..31)

bitC(Wert, Bit-Nr.)


Exor Bit (Bit-Nr. 0..31)

bitX(Wert, Bit-Nr.)


Test Bit (Bit-Nr. 0..31) returns true or false

bitT(Wert, Bit-Nr.)


Logische Operatoren

UND

&&

ODER

||

NICHT

!

Gleich, Ungleich

==, !=

Kleiner, Kleiner gleich

<, <=

Größer, Größer gleich

>, >=

Entscheidung

If-Then-Else-Funktion

ifte(Bedingung, Wert true, Wert false)

Wert zwischen L1 und L2 (inklusive Grenzen) (ab V1.1)

insideE(Wert,L1,L2)

Wert zwischen L1 und L2 (ab V1.1)

insideU(Wert,L1,L2)

Objektbefehle Allgemein

Breite (ohne Transformationen)

objW(id)

Höhe (ohne Transformationen)

objH(id)

Breite des Kindes (ab V1.3)

objW(id, Child-ID)

Höhe des Kindes (ab V1.3)

objH(id, Child-ID)

Position X (Aktueller Anker, bei Gruppen: relativ zum Elternobjekt)

objX(id)

Position Y (Aktueller Anker, bei Gruppen: relativ zum Elternobjekt)

objY(id)

Screen-Position X (angegebener Anker, auch bei Gruppen: Screenkoordinaten)

objX(id, Anker)

Screen-Position Y (angegebener Anker, auch bei Gruppen: Screenkoordinaten)

objY(id, Anker)

Screen-Position X des Kindes (angegebener Anker, auch bei Gruppen: Screenkoordinaten) (ab V1.3)

objX(id, Anker, Child-ID)

Screen-Position Y des Kindes (angegebener Anker, auch bei Gruppen: Screenkoordinaten) (ab V1.3)

objY(id, Anker, Child-ID)

Skalierung Breite

objSW(id)

Skalierung Höhe

objSH(id)

Scherung X

objSX(id)

Scherung Y

objSY(id)

Rotation

objR(id)

Transparenz

objO(id)

Layer

objL(id)

Obj-ID anhand Gruppen-ID oder Screenweit (id=0) und Layer bekommen (ab V1.2)

objLI(id, layer)

Aktuellen Style auslesen

objC(id)

Aktuellen Anker auslesen

objA(id)

Testen ob Objekt existiert

objE(id)

Testen ob Objekt sichtbar

objV(id)

Erhalten der Obj-ID an Screenkoordinate

objXY(x,y)

Erhalten der Obj-ID an Screenkoordinate. Nur das Objektrechteck wird beachtet (schneller, Transparenzen werden ignoriert)

objXY(x,y, onlyrect)

Objektbefehle Menü

Letztes gültiges MenüItem auslesen

objML(id)

Aktuell angezeigtes MenüItem (0=geschlossen)

objMV(id)

Check state von MenüItem (1=checked, 0=unchecked)

objMC(id, item)

Enable state von MenüItem (1=enabled, 0=disabled)

objME(id, item)

Objektbefehle ComboBox

Letztes gültiges Item auslesen

objCL(id)

Aktuell angezeigtes Item (0=geschlossen, -1=kein item sichtbar)

objCV(id)

Enable state von Item (1=enabled, 0=disabled)

objCE(id, item)

Objektbefehle SpinBox

Letzte gültige Items auslesen

objBL(id)

Letzte gültiges Item aus Box der Spin-Gruppe auslesen

objBL(id, boxnr)

Aktuell angezeigte Items auslesen

objBV(id)

Aktuell angezeigtes Item aus Box der Spin-Gruppe auslesen

objBV(id, boxnr)

Enable state von Item (1=enabled, 0=disabled)

objBE(id, item)

Objektbefehle StringBox

Sichtbare Zeilen

objTV(id)

Absatzanzahl (=Zeilenanzahl ohne AutoWrap)

objTA(id)

Zeilenanzahl (nach AutoWrap)

objTN(id)

Stringzeilenanzahl (nach AutoWrap)

objTN(id, Absatz nr)

Sichtbare oberste Zeile

objTL(id)

Stringzeilenstart (nach AutoWrap)

objTL(id, Absatz nr)

Absatz aus Zeilennummer

objTS(id, line nr)

Objektbefehle PictureBox (ab V1.2)

Letztes gültiges Item auslesen

objPL(id)

Aktuell angezeigtes Item

objPV(id)

Enable state von Item (1=enabled, 0=disabled)

objPE(id, item)

Objekteigenschaften

Userwert Integer (#OUI) auslesen

objUI(id)

Userwert Float (#OUI) auslesen

objUF(id)

Objekteigenschaften Bargraph/Instrument

Eingestellter Wert

objIV(id)

Auf dem Screen gezeichneter Wert (bei Animationen nicht zwingend gleich mit objIV(id))

objID(id)

EndWert

objIE(id)

StartWert

objIS(id)

Objekteigenschaften Pfade

Länge

pathL(id)

X-Koordinate anhand der Länge

pathX(id,distance)

Y-Koordinate anhand der Länge

pathY(id,distance)

Tangentenwinkel eines Punktes

pathR(id,distance)

Touchfunktionen

Touchbutton / Touchtaste Zustand

=1 ungedrückt

=2 gedrückt

butS(id)

Radiogroup: Aktiver Touchswitch (id)

butR(id)

Letzte Touchtaste

butI()

Letzter Keyboard code

butC()

Anzahl der Touchpunkte (Down-Event)

touchA()

Letzte Touchposition X (Down- oder Drag-Event)

touchX()

Letzte Touchposition Y (Down- oder Drag-Event)

touchY()

Touchposition X von Punktnummer nr (Down- oder Drag-Event)

touchX(nr)

Touchposition Y von Punktnummer nr (Down- oder Drag-Event)

touchY(nr)

Zerlegungsfunktionen Menü

RootItem von Item

menR(item)

Menü von Item

menM(item)

Submenü von Item

menS(item)

Item von Root, Menü, Submenü

menRMS(r,m,s)

Zerlegungsfunktionen SpinBox

Eintrag Box 1 (8 Bit value)

spin1(item)


Eintrag Box 2 (8 Bit value)

spin2(item)


Eintrag Box 3 (8 Bit value)

spin3(item)


Eintrag Box 4 (8 Bit value)

spin4(item)


Item aus individuellen SpinBox Werten ((e4<<24) | (e3<<16) | (e2<<8) | e1)

spinE(e1,e2,e3,e4)


Item aus Dezimalzahl (nur bei Spinbox mit numerischen Einträgen 0-9) (ab V1.3)

spinD(Zahl, Dezimalstellen)


Diagramm (ab V1.3)

Diagrammfenster seit letztem Touch-Ereignis geändert

0=keine Änderung

1=Verschiebung in x-Richtung

2=Verschiebung in y-Richtung

3=Zoom in x-Richtung

4=Zoom in y-Richtung

diaWC(id)

Automatisches Scrollen (0=aus, 1=an)

diaWS(id)

x-Offset des Diagramms (aktive Fläche)

diaWX(id)

y-Offset des Diagramms (aktive Fläche)

diaWY(id)

Gesamtbreite (aktive Fläche)

diaWW(id)

Gesamthöhe (aktive Fläche)

diaWH(id)

Segmentlänge x-Richtung

diaPX(id)

Segmentlänge y-Richtung

diaPY(id)

Verschiebung in x-Richtung

diaMX(id)

Verschiebung in y-Richtung

diaMY(id)

Zoom in x-Richtung

diaZX(id)

Zoom in y-Richtung

diaZY(id)

Startwert der Achse

diaAS(id,Achsen-Nr.)

Aktueller Startwert der Achse

diaAA(id, Achsen-Nr.)

Aktueller Wert der Achse von Koordinate

diaAV(id, Achsen-Nr.,x,y)

Aktueller Achsenintervall

diaAP(id,Achsen-Nr.)

1/100 Zeitwert von Koordinate (nur Zeitformat der x-Achse)

diaAT(id,Achsen-Nr.,x)

Nächstgelegene Linien-Nr.

diaLN(id,x,y)

Nächstgelegene Linien-Nr. (begrenzt auf eine maximale Entfernung)

diaLN(id,x,y,max. Entfernung)

Nächstgelegener Array Index

diaLI(id,Linien-Nr.,x,y)

Nächstgelegener Array Index (begrenzt auf eine maximale Entfernung)

diaLI(id,Linien-Nr.,x,y,max. Entfernung)

Erster sichtbarer Array Index der x-Achse

diaLF(id,Linien-Nr.)

Letzter sichtbarer Array Index der x-Achse

diaLL(id,Linien-Nr.)

x-Koordinate von Linienindex (relativ zur aktiven Fläche)

diaIX(id,Linien-Nr.,index)

y-Koordinate von Linienindex (relativ zur aktiven Fläche)

diaIY(id,Linien-NR,index)

x-Koordinate von Linienindex (absolut)

diaSX(id,Linien-Nr.,index)

y-Koordinate von Linienindex (absolut)

diaSY(id,Linien-Nr.,index

x-Wert von Linienindex

diaVX(id,Linien-Nr.,index)

y-Wert von Linienindex

diaVY(id,Linien-Nr.,index)

1/100s Zeit Wert von Linienindex (nur Zeitformat der x-Achse)

diaVT(id,Linien-Nr.,index)

I/O Ports

Portzustand (a = Baustein 0..15)

port(a)

Portpinzustand (a = Pinnummer 0..127)

bit(a)

Analogeingang

Analogwert (a=0..3)

analog(a)

RS232 Masterschnittstelle

Anzahl empfangener Bytes

mstRA()


Timer

Startwert setzen (10 ms Timer) (ab Firmware V1.1)

timer(startvalue)


Auslesen (10 ms Timer)

timer()


Datum/ Uhrzeit

Datum und Uhrzeit wird ab dem 1.1.2000 um 00:00:00 Uhr in Sekunden mit SINT32 berechnet (=Datumszeitwert). So ist der maximale vom Modul verwendbare Zeitraum von 1932  -  2067. Das Basisdatum kann mit dem Befehl #WDY geändert werden. Um Zeiträume zu berechnen muss das Datum oder die Uhrzeit immer erst in Sekunden bzw. dem Datumszeitwert gewandelt werden, danach wird die Berechnung ausgeführt. Am Ende kann wieder in Minuten, Stunden, Tag, Monat und Jahr zurückgewandelt werden.

Aktuelles Datum in Datumszeitwert wandeln

date()


Anzahl Tage in Sekunden wandeln

date(D)


Tag + Monat + Jahr (1932 - 2067) in Datumszeitwert wandeln

date(D,M,Y)


aktuelle Uhrzeit in Sekunden wandeln (berechnet ab 0:00:00 Uhr)

time()


Anzahl Stunden in Sekunden wandeln (≙ h·3600)

time(h)


Stunden und Minuten in Sekunden wandeln (≙ h·3600 + m·60)

time(h, m)


Stunden, Minuten und Sekunden in Datumszeitwert wandeln (≙ h·3600 + m·60 + s)

time(h, m, s)


aktuelle Zeit und Datum in Datumszeitwert wandeln

datetime()


Stunde+Minute+Sekunde+Tag+Monat+Jahr in Datumszeitwert wandeln

datetime(h,m,s,D,M,Y)


aktuelles Jahr

year()


Aus dem Datumszeitwert das Jahr berechnen

year(a)


aktueller Monat

month()


Aus dem Datumszeitwert den Monat berechnen

month(a)


aktueller Tag

day()


Aus dem Datumszeitwert den Tag berechnen

day(a)


aktueller Wochentag (0-6=Sonntag..Samstag)

weekday()


Aus dem Datumszeitwert den Wochentag berechnen

weekday(a)


aktuelle Stunde

hour()


Aus dem Datumszeitwert die Stunde berechnen

hour(a)


aktuelle Minute

minute()


Aus dem Datumszeitwert die Minute berechnen

minute(a)


aktuelle Sekunde

second()


Aus dem Datumszeitwert die Sekunde berechnen

second(a)


Stringfunktionen

Länge Stringregister

strL(nr)


ASCII-Code aus Stringregister

strA(nr, offset)


Unitcode aus Stringregister

strU(nr, offset)


Nummerische Zeichenkette in SINT32 bzw. float wandeln

strV(nr)

Vergleich zweier Stringregister

=0 beide Strings sind gleich

>0 erste ungleiche Zeichen in n1 ist größer als in n2

<0 erste ungleiche Zeichen in n1 ist kleiner als in n2

strC(n1, n2)


Vergleich zweier Stringregister von Anfang bis len

strC(n1, n2, len)


Vergleich zweier Stringregister von offset mit Anzahl len Codes

strC(n1, n2, len, offset)


Vergleich zweier Stringregister von offset1 und offset 2 mit Anzahl len Codes

strC(n1, n2, len, offset1, offset2)


Von links nach einem Code suchen

=-1 nicht gefunden

>=0 Offset des ersten gefunden Codes

strFL(nr, code)


Von links nach einem Code suchen (ab offset)

strFL(nr, code, offset)


Von rechts nach einem Code suchen

strFR(nr, code)


Von rechts nach einem Code suchen (ab offset)

strFR(nr, code, offset)


Im Stringregister nach einem anderen String eines Stringregister suchen

strFS(n1, n2)


Im Stringregister nach einem anderen String eines Stringregister suchen (ab offset)

strFS(n1, n2, offset)


Prüfung ob Code ein Buchstabe ist

isAL(code)


Prüfung ob Code ein Buchstabe oder Ziffer ist

isAN(code)


Prüfung ob Code ein kleiner Buchstabe ist

isLO(code)


Prüfung ob Code ein großer Buchstabe ist

isUP(code)


Prüfung ob Code ein White-Space-Code ist

isWS(code)


Prüfung ob Code eine dezimale Ziffer ist

isDD(code)


Prüfung ob Code eine hexadezimale Ziffer ist

isDH(code)


Prüfung ob Code eine binäre Ziffer ist

isDB(code)


Regular expressions (ab V1.2)

Bei allen Befehlen, die das RegEx betreffen, wird das Ergebnis auch in zehn speziellen RegExp-Registern mit direktem Zugriff gespeichert, und zwar über X? (alle X0,Container X1..X9, siehe Befehlssyntax).


Suche nach RegEx in StringRegister; Rückgabe des Indexes des ersten Suchergebnisses (-1 nichts gefunden)

strXF(RegExp-ID, String-ID)


Suche nach RegEx in StringRegister beginnend von Offset

strXF(RegExp, String, Offset)


RegEx-Suche von StringRegister n1 bis n2; Rückgabewert ist die String-ID des ersten Treffers (-1 kein Treffer)

strXS(RegExp, String-ID n1, String-ID n2)


RegEx-Suche von StringRegister n1 bis n2, beginnend von Offset

strXS(RegExp, String-ID n1, String-ID n2, Offset)


RegEx in StringArray[index];  Rückgabe ist der ArrayIndex des ersten Ergebnisses (-1 kein Treffer)

strXI(RegExp, Array-ID, index)


RegEx in StringArray[index] Suchbeginn bei Offset;

strXI(RegExp, Array-ID, index, Offset)


RegEx in StringArray von StartIndex (si) bis zum ArrayEnde; Rückgabe ist der ArrayIndex des ersten Ergebnisses (-1 kein Treffer)

strXA(RegExp, Array-ID, si)


RegEx in StringArray von StartIndex (si) bis zum EndIndex (ei)

strXA(RegExp, Array-ID, si, ei)


RegEx in StringArray von StartIndex (si) bis zum EndIndex (ei); Suchbeginn bei Offset;

strXA(RegExp, Array-ID, si, ei, Offset)


Letzte RegEx-Suchcontainer-Stringlänge ermitteln (0=vollständig, Container 1..9)

strXL(nr)


Letzten RegEx-Suchcontainer-Startoffset ermitteln

strXP(nr)


Array-Funktionen

Maximale Elemente für neuen Array

arE(-1)

Maximale Elemente für neues StringArray mit einer Stringlänge strlen (ab V1.2)

arE(-1, strlen)

Anzahl an Array Einträge (0= Array existiert nicht)

arE(id)

Array-Eintrag Wert

arV(id, index)

Unicode-Wert aus StringArray von offset (ab V1.2)

arV(id, index, offset)

Nächsten Array-Eintrag Wert von Lese-Pointer (Inkrement Lese-Pointer)

arV(id)

Lese-Pointer Index

arR(id)

Schreib-Pointer Index

arW(id)

Höchster verwendete Schreib-Pointer Index (ab V1.5)

arW(id,1)

Erster Array Index (bei Autowrap, sonst 0) (ab V1.5)

arF(id)

Letzter Array Index (bei Autowrap, sonst arW(id,1)) (ab V1.5)

arL(id)

Anzahl an verwendeten Array Einträgen (ab V1.5)

arU(id)

Minimum aller Array Elemente (ab V1.1)

arMIN(id)

Maximum aller Array Elemente (ab V1.1)

arMAX(id)

Summe aller Array Elemente (ab V1.1)

arSUM(id)

Mittelwert aller Array Elemente (ab V1.1)

arAVG(id)

Minimum aller Array Elemente aus Bereich (ab V1.1)

arMIN(id,Start,Ende)

Maximum aller Array Elemente aus Bereich (ab V1.1)

arMAX(id,Start,Ende

Summe aller Array Elemente aus Bereich (ab V1.1)

arSUM(id,Start,Ende

Mittelwert aus Bereich (ab V1.1)

arAVG(id,Start,Ende)

Farbbefehle

Aus einem RGB 24 Bit-Farbwert den roten Kanal extrahieren

getR(x)


Aus einem RGB 24 Bit-Farbwert den grünen Kanal extrahieren

getG(x)


Aus einem RGB 24 Bit-Farbwert den blauen Kanal extrahieren

getB(x)


Aus einzelnen RGB-Bytes eine 24 Bit-Farbwert berechnen

RGB(R, G, B)


RGB 24 Bit-Farbwert aus einem  Farb-Rampen / Farbverlauf auslesen

rampRGB(nr, offset)


Opacity aus einem  Farb-Rampen / Farbverlauf auslesen

rampO(nr,offset)


RGB 24 Bit-Farbwert von einem dargestellten Pixel auf dem Display auslesen

tftRGB(x,y)


RGB 16 Bit-Farbwert (RGB565) von einem dargestellten Pixel auf dem Display

auslesen (ab V1.1)

tftRGB(x,y,1)


SD-Card (Ordner- und Dateibefehle)

Datei vorhanden? (<Pfad/Dateiname> in Stringregister nr)

fileE(nr)


Dateigröße abfragen (<Pfad/Dateiname> in Stringregister nr)

fileS(nr)


Dateiattribut abfragen (<Pfad/Dateiname> in Stringregister nr)

fileA(nr)


FatTime der Datei abfragen (<Pfad/Dateiname> in Stringregister nr)

fileT(nr)


FatDate der Datei abfragen (<Pfad/Dateiname> in Stringregister nr)

fileD(nr)


Datumszeitwert in FatTime wandeln

fatT(datetime)


Datumszeitwert in FatDate wandeln

fatD(datetime)


Fat-Zeitstempel in Datumszeitwert umrechnen

fattime(Fat-Time, Fat-Date)


Aktuellen Read-Pointer (#FRO) abfragen

fposR()


Aktuellen Read-Pointer vom Fileende aus abfragen (=negativ)

fposR(-1)


Aktuelle Filegröße des offenen Lese-Files abfragen

fposR(1)


Aktuellen Write-Pointer (#FWO) abfragen

fposW()


Aktuellen Write-Pointer vom Fileende aus abfragen (=negativ)

fposW(-1)


Aktuelle Filegröße des offenen Schreib-Files abfragen

fposW(1)


Aktuelle maximale Filegröße

fposW(2)


Maximale Filegröße des Files aus dem Stringregister nr

fileM(nr)


Gesamtspeicherplatz abfragen

memST()


Freien Gesamtspeicherplatz abfragen

memSF()


Objektramspeicherplatz abfragen

memRT()


Freien Objektramspeicherplatz abfragen

memRF()


Maximalen Block im Objektramspeicherplatz abfragen

memRB()


Modulbefehle

Firmware Version

version()


Letzte Framrate (fps) auslesen

fps()

Touchtyp abfragen (=0 kein, =1 resistiv, =2 PCAP)

touchT()

Screen Breite (#XCV)

scrW()

Screen Höhe (#XCV)

scrH()

Screen Breite der Hardware, unabhängig von (#XCV)

scrW(1)

Screen Höhe der Hardware, unabhängig von (#XCV)

scrH(1)

Video Breite

vidW()

Video Höhe

vidH()

Anzahl Video Objekte

vidC()

Aktuelle LED Helligkeit

ledB()

LED Helligkeit von Status (automatische Dimmung) (status 0..2)

ledB(status)

LED Status (automatische Dimmung) (status 0..2)

ledS()

Error-String vorhanden?

error()

Error-String vorhanden? String wird in das Stringregister nr kopiert (#VSL)

error(nr)

Error-String vorhanden? String wird in das Stringregister nr kopiert und der Error-String gelöscht

error(nr,1)



Liste der Operatoren nach Priorität

12

()

Klammern / Funktionsaufruf (höchste)

11

++

Register Inkrement


- -

Register Dekrement


+

Vorzeichen


-

Vorzeichen


!

logisches NICHT


~

bitweises NICHT

10

*

Multiplikation


/

Division

9

+

Addition


-

Subtraktion

8

<<

Linksshift


>>

Rechtsshift

7

<

kleiner


<=

kleiner gleich


>

größer


>=

größer gleich

6

==

gleich


!=

ungleich

5

&

bitweises UND

4

^

bitweises exklusives ODER

3

|

bitweises ODER

2

&&

logisches UND

1

||

logisches ODER (niedrigste)