Main Content

Programar las acciones del gráfico con lógica temporal

Para definir el comportamiento de un gráfico de Stateflow en términos del tiempo de simulación, incluya operadores de lógica temporal en las acciones de estado y transición del gráfico. Los operadores de lógica temporal son funciones integradas que pueden indicar la cantidad de tiempo que un estado se mantiene activo o que una condición booleana es verdadera. Con la lógica temporal, se puede controlar el tiempo de:

  • Transiciones entre estados

  • Llamadas a función

  • Cambios en valores de variables

Estos son los operadores más comunes para la lógica temporal de tiempo absoluto:

  • after: after(n,sec) devuelve true si han transcurrido n segundos de tiempo de simulación desde que se activó el estado que contiene el operador o el estado origen de la transición que contiene el operador. De lo contrario, el operador devuelve false. Este operador admite la lógica temporal basada en eventos y la lógica temporal de tiempo absoluto en segundos (sec), milisegundos (msec) y microsegundos (usec).

  • elapsed: elapsed(sec) devuelve el número de segundos de tiempo de simulación que han transcurrido desde la activación del estado asociado.

  • duration: duration(C) devuelve el número de segundos de tiempo de simulación que han transcurrido desde que la condición booleana C se ha vuelto true.

Modelar un controlador de temperatura de encendido/apagado

Este ejemplo utiliza la lógica temporal para modelar un controlador de encendido/apagado que regula la temperatura interna de una caldera.

El ejemplo consiste en un gráfico de Stateflow y un subsistema de Simulink®. El gráfico Bang-Bang Controller compara la temperatura actual de la caldera con un punto de referencia y determina si debe encender la caldera. El subsistema Boiler Plant Model modeliza la dinámica del interior de la caldera aumentando o disminuyendo su temperatura según el estado del controlador. A continuación, el gráfico utiliza la temperatura de la caldera para el siguiente paso de la simulación.

El gráfico del Bang-Bang Controller utiliza el operador de lógica temporal after para:

  • Regular el tiempo del ciclo de encendido/apagado mientras la caldera alterna entre el encendido y el apagado.

  • Controlar un LED de estado que parpadea a diferentes velocidades en función del modo de funcionamiento de la caldera.

Los temporizadores que definen el comportamiento de los subsistemas de la caldera y de los LED funcionan independientemente unos de otros sin bloquear ni interrumpir la simulación del controlador.

Tiempo del ciclo de encendido/apagado

El gráfico Bang-Bang Controller contiene un par de subestados que representan los dos modos de funcionamiento de la caldera, On y Off. El gráfico utiliza los datos de salida del estado activo boiler para indicar qué subestado está activo.

Las condiciones de las transiciones entre los subestados On y Off definen el comportamiento del controlador de encendido/apagado:

  • En la primera transición de On a Off, la condición after(20,sec) apaga la caldera después de estar encendida durante 20 segundos.

  • En la transición de Off a On, la condición after(40,sec)[cold()] enciende la caldera cuando la función gráfica cold() indica que la temperatura de la caldera está por debajo del punto de referencia durante al menos 40 segundos.

  • En la segunda transición de On a Off, la condición trivial apaga la caldera cuando la lógica de transición interna del estado On determina que la temperatura de la caldera se encuentra en el punto de referencia o por encima.

Como resultado de estas acciones de transición, el tiempo del ciclo de encendido/apagado depende de la temperatura actual de la caldera. Al inicio de la simulación, cuando la caldera está fría, el controlador pasa 40 segundos en el estado Off y 20 segundos en el estado On. En la unidad de tiempo $t = 478$ segundos, la temperatura de la caldera alcanza el punto de referencia. A partir de ese momento, la caldera tiene que compensar únicamente el calor perdido mientras está en estado Off. El controlador pasa 40 segundos en el estado Off y 4 segundos en el estado On.

Tiempo del LED de estado

El estado Off contiene un subestado Flash con una transición de autobucle activada por la acción after(5,sec). Debido a esta transición, cuando el estado Off está activo, el subestado ejecuta su acción entry y llama a la función gráfica flash_LED cada 5 segundos. La función alterna el valor del símbolo de salida LED entre 0 y 1.

El estado On llama a la función gráfica flash_LED como una acción de estado entry, during combinada. Cuando el estado On está activo, esta acción llama a la función en cada unidad de tiempo de la simulación para alternar el valor del símbolo de salida LED entre 0 y 2.

Como resultado, el tiempo del LED de estado depende del modo de funcionamiento de la caldera. Por ejemplo:

  • De $t = 0$ a $t = 40$ segundos, la caldera está apagada y la señal LED alterna entre 0 y 1 cada 5 segundos.

  • De $t = 40$ a $t = 60$ segundos, la caldera está encendida y la señal LED alterna entre 0 y 2 cada segundo.

  • De $t = 60$ a $t = 100$ segundos, la caldera está apagada y la señal LED alterna entre 0 y 1 cada 5 segundos.

Explorar el ejemplo

Utilice lógica temporal adicional para descubrir cómo cambia el tiempo del ciclo de encendido/apagado a medida que la temperatura de la caldera se acerca a punto de referencia.

1. Introduzca nuevas acciones de estado que llamen a los operadores elapsed y duration:

  • En el estado On, establezca Timer1 como la cantidad de tiempo que el estado On está activo:

  en,du,ex: Timer1 = elapsed(sec);
  • En el estado Off, establezca Timer2 como la cantidad de tiempo que la temperatura de la caldera se encuentra en el punto de referencia o por encima:

  en,du,ex: Timer2 = duration(temp>=reference);

2. En el panel Symbols, haga clic en Resolve Undefined Symbols. El editor de Stateflow resuelve los símbolos Timer1 y Timer2 como datos de salida.

3. Active el registro para Timer1 y Timer2. En el panel Symbols, seleccione cada símbolo. A continuación, en Property Inspector, en Logging, seleccione Log signal data.

4. En la pestaña Simulation, haga clic en Run.

5. En la pestaña Simulation, en Review Results, haga clic en Data Inspector.

6. En Simulation Data Inspector, visualice las señales boiler y Timer1 en el mismo conjunto de ejes. La gráfica muestra lo siguiente:

  • La fase On del ciclo de encendido/apagado suele durar 20 segundos cuando la caldera está fría y 4 segundos cuando está caliente.

  • La primera vez que la caldera alcanza la temperatura de referencia, el ciclo se interrumpe prematuramente y el controlador permanece en el estado On durante solo 18 segundos.

  • Cuando la caldera está caliente, el primer ciclo es ligeramente más corto que los siguientes, ya que el controlador permanece en el estado On durante solo 3 segundos.

7. En Simulation Data Inspector, visualice las señales boiler y Timer2 en el mismo conjunto de ejes. La gráfica muestra lo siguiente:

  • Una vez que la caldera está caliente, suele tardar 9 segundos en enfriarse en la fase Off del ciclo de encendido/apagado.

  • La primera vez que la caldera alcanza la temperatura de referencia, tarda 19 segundos en enfriarse, más del doble que los otros ciclos.

El hecho de que el ciclo sea más corto y el tiempo de enfriamiento más largo es una consecuencia de la jerarquía de subestados dentro del estado On. Cuando la caldera alcanza la temperatura de referencia por primera vez, la transición de HIGH a NORM mantiene el controlador encendido durante una unidad de tiempo adicional, lo que resulta en una caldera más caliente de lo normal. En ciclos posteriores, la intersección histórica hace que la fase On empiece con un subestado NORM activo. El controlador se apaga inmediatamente después de que la caldera alcance la temperatura de referencia, lo que resulta en una caldera más fría.

Temas relacionados