Introducción para programadores
Aunque la sintaxis del módulo Math presenta muchas características similares a las de un lenguaje de programación, es importante tener presente que el módulo Math no es un lenguaje de programación.
Se trata simplemente de una colección de fórmulas que se evalúan fórmula por fórmula en cada iteración del módulo. El foco está en la relación temporal de las distintas señales entre sí. Nunca debe darse la situación de que un valor de resultado deje de estar definido en un instante determinado. Por este motivo, ciertas construcciones no funcionan, por ejemplo:
if (someCondition)
y = 2 * x;
¿Cómo debería determinarse y si no se cumple la condición?
En consecuencia, es posible que eche en falta algunas funciones propias de los lenguajes de programación; la más llamativa es que no existen construcciones de control de flujo.
A continuación encontrará algunos ejemplos de funciones con las que se puede lograr una especie de ejecución condicional:
Ejecución condicional
Operador ternario ?
La característica que más se parece a las clásicas construcciones de control de flujo es el operador ternario, que en el módulo Math funciona igual que en los lenguajes de programación habituales.
Ejemplo
Ventil = Temperatur > 25.0 ? 20.0 : 80.0;
En un lenguaje de programación
Ventil = Temperatur > 25.0 ? 20.0 : 80.0;
// oder
if (Temperatur > 25.0)
Ventil = 20.0;
else
Ventil = 80.0;
Al utilizar el operador ternario hay que procurar no escribir construcciones propensas a errores como la siguiente:
Ergebnis = Messwert != 0.0 ? Maximum / Messwert : -1.0;
Esto puede provocar una división por cero.
En su lugar:
Ergebnis = Maximum / nonZero(Messwert);
Función select
Para seleccionar un valor concreto de un conjunto de valores disponibles, se puede utilizar la función select().
Ejemplo
Auswahl = select(Index, Wert0, Wert1, Wert2, Wert3);
En un lenguaje de programación
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;
}
Codificador de prioridad
Para seleccionar un valor en función de un conjunto de condiciones, se puede utilizar la función prioEnc().
Ejemplo
Status = prioEnc(Bedingung0, Bedingung1, Bedingung2, Bedingung3, {none: 1000, map: [10,20,30,40]});
En un lenguaje de programación
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
También aquí la parametrización de la función ofrece más opciones, por ejemplo, detectar flancos como condición o mantener y continuar con la última condición establecida cuando no hay ninguna otra activa.
Limitación del rango de valores
Para limitar un valor medido a un rango de valores determinado, se puede utilizar la función range().
Ejemplo
Begrenzt = range(Messwert, [-10.0, 10.0]);
En un lenguaje de programación
if (Messwert < -10.0)
Begrenzt = -10.0;
else if (Messwert > 10.0)
Begrenzt = 10.0;
else
Begrenzt = Messwert;
Como alternativa, se pueden especificar valores arbitrarios que se devolverán cuando se alcance el límite inferior o superior.
Ejemplo
Begrenzt = range(Messwert, [-10.0, 10.0], {lower: -99, upper: 99});
En un lenguaje de programación
if (Messwert < -10.0)
Begrenzt = lower; // = -99;
else if (Messwert > 10.0)
Begrenzt = upper; // = 99;
else
Begrenzt = Messwert;
Almacenamiento temporal de valores
Para almacenar valores entre iteraciones del módulo Math, se pueden utilizar los llamados FlipFlops.
rsFF
Para almacenar un valor booleano, se puede utilizar la función rsFF().
Ejemplo
Zustand = rsFF(BedingungReset, BedingungSet);
En un lenguaje de programación
if (BedingungReset)
Zustand = false;
else if (BedingungSet)
Zustand = true;
else
Zustand = letzter Zustand;
dLatch
Para almacenar un valor de cualquier tipo de datos, se puede utilizar la función dLatch().
Ejemplo
Merker = dLatch(BedingungHold, Messwert);
En un lenguaje de programación:
if (BedingungHold)
Merker = letzter Merker;
else
Merker = Messwert;