Introduction pour les programmeurs
Même si la syntaxe du module Math présente de nombreuses caractéristiques proches d'un langage de programmation, il est important de garder à l'esprit que le module Math n'est pas un langage de programmation.
Il s'agit simplement d'un recueil de formules, évaluées formule après formule à chaque itération du module. L'accent est mis sur la relation temporelle des différents signaux entre eux. Il ne doit jamais y avoir de situation où une valeur de résultat n'est plus définie à un instant donné. C'est pourquoi certaines constructions ne fonctionnent pas, par exemple
if (someCondition)
y = 2 * x;
Comment déterminer y si la condition n'est pas remplie ?
En conséquence, certaines fonctions des langages de programmation pourront vous manquer - le plus frappant est sans doute l'absence de structures de contrôle de flux.
Vous trouverez ici quelques exemples de fonctions permettant d'obtenir une sorte d'exécution conditionnelle :
Exécution conditionnelle
Opérateur ternaire ?
La fonctionnalité qui ressemble le plus aux structures classiques de contrôle de flux est l'opérateur ternaire, qui fonctionne dans le module Math comme dans les langages de programmation courants.
Exemple
Ventil = Temperatur > 25.0 ? 20.0 : 80.0;
En langage de programmation
Ventil = Temperatur > 25.0 ? 20.0 : 80.0;
// oder
if (Temperatur > 25.0)
Ventil = 20.0;
else
Ventil = 80.0;
Lors de l'utilisation de l'opérateur ternaire, il faut veiller à ne pas écrire les constructions suivantes, sources d'erreurs :
Ergebnis = Messwert != 0.0 ? Maximum / Messwert : -1.0;
Cela peut conduire à une division par zéro.
À la place :
Ergebnis = Maximum / nonZero(Messwert);
Fonction Select
Pour sélectionner une valeur précise parmi un ensemble de valeurs disponibles, on peut utiliser la fonction select().
Exemple
Auswahl = select(Index, Wert0, Wert1, Wert2, Wert3);
En langage de programmation
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;
}
Encodeur de priorité
Pour sélectionner une valeur sur la base d'un ensemble de conditions, on peut utiliser la fonction prioEnc().
Exemple
Status = prioEnc(Bedingung0, Bedingung1, Bedingung2, Bedingung3, {none: 1000, map: [10,20,30,40]});
En langage de programmation
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
Ici aussi, le paramétrage de la fonction offre d'autres options, par exemple la détection de fronts comme condition, ou le maintien et la poursuite de la dernière condition activée lorsqu'aucune autre n'est active.
Limitation de la plage de valeurs
Pour restreindre une valeur de mesure à une plage de valeurs donnée, on peut utiliser la fonction range().
Exemple
Begrenzt = range(Messwert, [-10.0, 10.0]);
En langage de programmation
if (Messwert < -10.0)
Begrenzt = -10.0;
else if (Messwert > 10.0)
Begrenzt = 10.0;
else
Begrenzt = Messwert;
Il est également possible de spécifier des valeurs quelconques à fournir lorsque la limite inférieure ou supérieure est atteinte.
Exemple
Begrenzt = range(Messwert, [-10.0, 10.0], {lower: -99, upper: 99});
En langage de programmation
if (Messwert < -10.0)
Begrenzt = lower; // = -99;
else if (Messwert > 10.0)
Begrenzt = upper; // = 99;
else
Begrenzt = Messwert;
Mémorisation de valeurs
Pour mémoriser des valeurs entre les itérations du module Math, on peut utiliser ce que l'on appelle des bascules (FlipFlops).
rsFF
Pour mémoriser une valeur booléenne, on peut utiliser la fonction rsFF().
Exemple
Zustand = rsFF(BedingungReset, BedingungSet);
En langage de programmation
if (BedingungReset)
Zustand = false;
else if (BedingungSet)
Zustand = true;
else
Zustand = letzter Zustand;
dLatch
Pour mémoriser une valeur de n'importe quel type de données, on peut utiliser la fonction dLatch().
Exemple
Merker = dLatch(BedingungHold, Messwert);
En langage de programmation :
if (BedingungHold)
Merker = letzter Merker;
else
Merker = Messwert;