Zum Hauptinhalt springen

Einführung für Programmierer

Auch wenn der Syntax des Math-Moduls viele Eigenschaften aufweist, die einer Programmiersprache ähneln, ist es wichtig im Kopf zu behalten, dass das Math-Modul keine Programmiersprache ist.
Es handelt sich lediglich um eine Formelsammlung, die mit jeder Iteration des Moduls Formel für Formel ausgewertet wird. Dabei steht der Zeitbezug der einzelnen Signale zueinander im Fokus. Es darf niemals die Situation geben, dass ein Ergebniswert zu einem bestimmten Zeitpunkt nicht mehr definiert ist. Deshalb funktionieren bestimmte Konstrukte nicht, wie z.B.

if (someCondition)
y = 2 * x;

Wie sollte y bestimmt werden, wenn die Bedingung nicht erfüllt ist?

Dementsprechend werden Sie evtl. einige Programmiersprachfunktionen vermissen - wohl am auffälligsten ist, dass es keine Kontrollfluss-Konstrukte gibt.

Ein paar Beispiele, für Funktionen, mit denen eine Art bedingte Ausführung erzielt werden kann, finden Sie hier:

Bedingte Ausführung​

Ternary Operator ?​

Das Feature, dass klassischen Flow-Control Features wohl noch am meisten ähnelt ist der Ternary Operator, der im Math-Modul so, wie in gängigen Programmiersprachen funktioniert.

Beispiel​

Ventil = Temperatur > 25.0 ? 20.0 : 80.0;

In Programmiersprache​

Ventil = Temperatur > 25.0 ? 20.0 : 80.0;
// oder
if (Temperatur > 25.0)
Ventil = 20.0;
else
Ventil = 80.0;

Gesteuerter Schalter

warnung

Bei Verwendung des Ternary Operator muss darauf geachtet werden, nicht folgende fehleranfällige Konstrukte zu schreiben:

Ergebnis = Messwert != 0.0 ? Maximum / Messwert : -1.0;
Dies kann zu einer Division durch Null führen.

Stattdessen: Ergebnis = Maximum / nonZero(Messwert);

Select Funktion​

Um aus einer Menge verfügbarer Werte einen spezifischen auszuwählen, kann die Funktion select() verwendet werden.

Beispiel​

Auswahl = select(Index, Wert0, Wert1, Wert2, Wert3);

In Programmiersprache​

switch(index)
{
case 0: Auswahl = Wert0; break;
case 1: Auswahl = Wert1; break;
case 2: Auswahl = Wert2; break;
case 3: Auswahl = Wert3; break;
default: Auswahl = false;
}

Prioritäts-Encoder​

Um, basierend auf einer Menge an Bedingungen einen Wert auszuwählen, kann die Funktion prioEnc() verwendet werden.

Beispiel​

Status = prioEnc(Bedingung0, Bedingung1, Bedingung2, Bedingung3, {none: 1000, map: [10,20,30,40]});

In Programmiersprache​

if (Bedingung0)
Status = map[0]; // = 10
else if(Bedingung1)
Status = map[1]; // = 20
else if (Bedingung2)
Status = map[2]; // = 30
else if (Bedingung3)
Status = map[3]; // = 40
else
Status = none; // = 1000

Auch hier gibt es über die Parametrierung der Funktion weitere Optionen, z.B. das Erkennen von Flanken als Bedingung oder das Halten und Weiterführen der letzten gesetzten Bedingung, wenn keine andere gesetzt ist.

Wertebereichbegrenzung​

Um einen Messwert auf einen bestimmten Wertebereich zu beschränken, kann die Funktion range() verwendet werden.

Begrenzung Wertebereich

Beispiel​

Begrenzt = range(Messwert, [-10.0, 10.0]);

In Programmiersprache​

if (Messwert < -10.0)
Begrenzt = -10.0;
else if (Messwert > 10.0)
Begrenzt = 10.0;
else
Begrenzt = Messwert;

Alternativ können auch beliebige Werte spezifiziert werden, die ausgegeben werden sollen, falls die untere bzw. obere Grenze erreicht wurde.

Beispiel​

Begrenzt = range(Messwert, [-10.0, 10.0], {lower: -99, upper: 99});

In Programmiersprache​

if (Messwert < -10.0)
Begrenzt = lower; // = -99;
else if (Messwert > 10.0)
Begrenzt = upper; // = 99;
else
Begrenzt = Messwert;

Werte zwischenspeichern​

Um Werte zwischen Iterationen des Math-Moduls zu speichern, können sog. FlipFlops verwendet werden.

rsFF​

Um einen booleschen Wert zu speichern, kann die Funktion rsFF() verwendet werden.

Beispiel​

Zustand = rsFF(BedingungReset, BedingungSet);

In Programmiersprache​

if (BedingungReset)
Zustand = false;
else if (BedingungSet)
Zustand = true;
else
Zustand = letzter Zustand;

dLatch​

Um einen Wert eines beliebigen Datentyps zu speichern, kann die Funktion dLatch() verwendet werden.

Beispiel​

Merker = dLatch(BedingungHold, Messwert);

In Programmiersprache:​

if (BedingungHold)
Merker = letzter Merker;
else
Merker = Messwert;