Aller au contenu principal

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;

Interrupteur commandé

attention

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

Limitation de la plage de valeurs

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;