Introduzione per programmatori
Anche se la sintassi del modulo Math presenta molte caratteristiche simili a quelle di un linguaggio di programmazione, è importante tenere presente che il modulo Math non è un linguaggio di programmazione.
Si tratta semplicemente di una raccolta di formule, valutate formula per formula a ogni iterazione del modulo. In primo piano è il riferimento temporale dei singoli segnali tra loro. Non deve mai verificarsi la situazione in cui un valore risultante non sia più definito a un determinato istante. Per questo motivo alcuni costrutti non funzionano, ad es.
if (someCondition)
y = 2 * x;
Come dovrebbe essere determinato y se la condizione non è soddisfatta?
Di conseguenza potrebbero mancare alcune funzioni tipiche dei linguaggi di programmazione - la più evidente è l'assenza di costrutti di controllo del flusso.
Alcuni esempi di funzioni con cui è possibile ottenere una sorta di esecuzione condizionale sono riportati di seguito:
Esecuzione condizionale
Ternary Operator ?
La funzionalità che più si avvicina ai classici costrutti di controllo del flusso è il Ternary Operator, che nel modulo Math funziona come nei comuni linguaggi di programmazione.
Esempio
Ventil = Temperatur > 25.0 ? 20.0 : 80.0;
In un linguaggio di programmazione
Ventil = Temperatur > 25.0 ? 20.0 : 80.0;
// oder
if (Temperatur > 25.0)
Ventil = 20.0;
else
Ventil = 80.0;
Quando si utilizza il Ternary Operator occorre fare attenzione a non scrivere costrutti soggetti a errori come il seguente:
Ergebnis = Messwert != 0.0 ? Maximum / Messwert : -1.0;
Ciò può portare a una divisione per zero.
Utilizzare invece:
Ergebnis = Maximum / nonZero(Messwert);
Funzione select
Per scegliere un valore specifico da un insieme di valori disponibili è possibile utilizzare la funzione select().
Esempio
Auswahl = select(Index, Wert0, Wert1, Wert2, Wert3);
In un linguaggio di programmazione
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;
}
Codificatore di priorità
Per scegliere un valore in base a un insieme di condizioni è possibile utilizzare la funzione prioEnc().
Esempio
Status = prioEnc(Bedingung0, Bedingung1, Bedingung2, Bedingung3, {none: 1000, map: [10,20,30,40]});
In un linguaggio di programmazione
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
Anche in questo caso la parametrizzazione della funzione offre ulteriori opzioni, ad es. il rilevamento dei fronti come condizione oppure il mantenimento e la prosecuzione dell'ultima condizione impostata quando non ne è impostata nessun'altra.
Limitazione dell'intervallo di valori
Per limitare un valore di misura a un determinato intervallo è possibile utilizzare la funzione range().
Esempio
Begrenzt = range(Messwert, [-10.0, 10.0]);
In un linguaggio di programmazione
if (Messwert < -10.0)
Begrenzt = -10.0;
else if (Messwert > 10.0)
Begrenzt = 10.0;
else
Begrenzt = Messwert;
In alternativa è possibile specificare valori arbitrari da restituire quando viene raggiunto il limite inferiore o superiore.
Esempio
Begrenzt = range(Messwert, [-10.0, 10.0], {lower: -99, upper: 99});
In un linguaggio di programmazione
if (Messwert < -10.0)
Begrenzt = lower; // = -99;
else if (Messwert > 10.0)
Begrenzt = upper; // = 99;
else
Begrenzt = Messwert;
Memorizzazione temporanea di valori
Per memorizzare valori tra le iterazioni del modulo Math è possibile utilizzare i cosiddetti FlipFlop.
rsFF
Per memorizzare un valore booleano è possibile utilizzare la funzione rsFF().
Esempio
Zustand = rsFF(BedingungReset, BedingungSet);
In un linguaggio di programmazione
if (BedingungReset)
Zustand = false;
else if (BedingungSet)
Zustand = true;
else
Zustand = letzter Zustand;
dLatch
Per memorizzare un valore di qualsiasi tipo di dati è possibile utilizzare la funzione dLatch().
Esempio
Merker = dLatch(BedingungHold, Messwert);
In un linguaggio di programmazione:
if (BedingungHold)
Merker = letzter Merker;
else
Merker = Messwert;