Passa al contenuto principale

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;

Interruttore controllato

warning

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

Limitazione dell'intervallo di valori

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;