Controlar la ejecución de gráficos con lógica temporal
La lógica temporal controla la ejecución de un gráfico en términos de tiempo. En las acciones y transiciones de estado, se pueden utilizar dos tipos de lógica temporal:
La lógica temporal basada en eventos realiza el seguimiento de eventos recurrentes. Puede utilizar cualquier evento explícito o implícito como evento base.
La lógica temporal en tiempo absoluto registra el tiempo transcurrido desde que un estado se convirtió en activo. El tiempo de los operadores de lógica temporal de tiempo absoluto depende del tipo de gráfico de Stateflow®:
Los gráficos de un modelo de Simulink® definen la lógica temporal de tiempo absoluto en términos del tiempo de simulación.
Los gráficos independientes de MATLAB® definen la lógica temporal de tiempo absoluto en términos de tiempo de reloj, que está limitado a una precisión de 1 milisegundo.
Operadores de lógica temporal
Para definir el comportamiento de un gráfico de Stateflow basado en la lógica temporal, utilice los operadores enumerados en esta tabla. Estos operadores pueden aparecer en:
Acciones de estado
on
Acciones en rutas de transición que se originan en un estado
Cada operador de lógica temporal tiene un estado asociado, que es el estado en el que aparece la acción o en el que se origina la ruta de transición. El gráfico de Stateflow restablece el contador utilizado por cada operador cada vez que se reactiva el estado asociado.
Operador | Sintaxis | Descripción | Ejemplo |
---|---|---|---|
after |
| Devuelve true si el evento E ha ocurrido al menos n veces desde que el estado asociado se convirtió en activo. De lo contrario, el operador devuelve false . | Muestra un mensaje de estado cuando el gráfico procesa una transmisión del evento
|
Realiza una transición de salida del estado asociado cuando el gráfico procese una transmisión del evento after(5,E) | |||
| Devuelve El evento implícito | Realiza una transición de salida del estado asociado cuando el gráfico se active al menos por séptima vez desde que el estado se convirtió en activo, pero solo si la variable after(7,tick)[temp > 98.6] | |
| Devuelve En gráficos de un modelo de Simulink, especifique el tiempo en segundos ( En los gráficos independientes de MATLAB, especifique el tiempo en segundos ( | Establece la variable
| |
at |
| Devuelve true si el evento E se ha producido exactamente n veces desde que el estado asociado se convirtió en activo. De lo contrario, el operador devuelve false . | Muestra un mensaje de estado cuando el gráfico procesa la tercera transmisión del evento
|
Realiza una transición de salida del estado asociado cuando el gráfico procesa la quinta transmisión del evento at(5,E) | |||
| Devuelve El evento implícito | Realiza una transición de salida del estado asociado cuando el gráfico se activa por séptima vez desde que el estado se convirtió en activo, pero solo si la variable at(7,tick)[temp > 98.6] | |
| Devuelve El uso de | Establece la variable
| |
before |
| Devuelve El operador de lógica temporal | Muestra un mensaje de estado cuando el gráfico procesa la primera y la segunda transmisión del evento
|
Realiza una transición de salida del estado asociado cuando el gráfico procesa una transmisión del evento before(5,E) | |||
| Devuelve El evento implícito El operador de lógica temporal | Realiza una transición de salida del estado asociado cuando el gráfico se activa, pero solo si la variable before(7,tick)[temp > 98.6] | |
| Devuelve Especifique el tiempo en segundos ( El operador de lógica temporal | Establece la variable
| |
every |
| Devuelve | Muestra un mensaje de estado cuando el gráfico procesa cada tercera transmisión del evento
|
Realiza una transición de salida del estado asociado cuando el gráfico procesa cada quinta transmisión del evento every(5,E) | |||
| Devuelve El evento implícito | Realiza una transición de salida del estado asociado cada séptimo evento every(7,tick)[temp > 98.6] | |
| Devuelve El uso de | Se aumenta la variable
| |
temporalCount |
| Devuelve el número de ocurrencias del evento El uso de | Acceda a los elementos sucesivos del arreglo
|
temporalCount(tick) | Devuelve el número de veces que el gráfico se ha activado desde que el estado asociado se convirtió en activo. El evento implícito El uso de | Guarde el valor de los datos de entrada en,du: M(temporalCount(tick)+1) = u; | |
| Devuelve el tiempo transcurrido desde que el estado asociado se convirtió en activo. Especifique el tiempo en segundos ( | Guarde el número de milisegundos desde que el estado se convirtió en activo. en,du: y = temporalCount(msec); | |
elapsed |
| Devuelve el tiempo transcurrido desde que el estado asociado se convirtió en activo. Equivale a | Guarde el número de segundos desde que el estado se convirtió en activo. en,du: y = elapsed(sec); |
et | Una forma alternativa de ejecutar elapsed(sec) . | Cuando el gráfico procese una transmisión del evento E{disp(et);} | |
count |
| Devuelve el número de veces que el gráfico se ha activado desde que la expresión condicional El gráfico de Stateflow restablece el valor del operador En los gráficos de un modelo de Simulink, el valor de | Realice la transición de salida del estado asociado cuando la variable [count(x>=2) > 5] |
Guarde el número de ejecuciones del gráfico desde que la variable en,du: y = count(x>5); | |||
duration |
| Devuelve el tiempo transcurrido desde que la expresión condicional Especifique el tiempo en segundos ( El gráfico de Stateflow restablece el valor del operador El operador de lógica temporal | Realice la transición de salida del estado en el que la variable [duration(x>=0) > 0.1] |
Guarde el número de milisegundos desde que la variable en,du: y = duration(x>5,msec); |
Puede encerrar entre comillas las palabras clave 'tick'
, 'sec'
, 'msec'
y 'usec'
. Por ejemplo, after(5,'tick')
equivale a after(5,tick)
.
Nota
Los operadores de lógica temporal after
, at
, before
y every
comparan el umbral n
con un contador interno de tipo entero. Si n
es un número de punto fijo definido por una pendiente que no es una potencia entera de dos o un sesgo distinto de cero, la comparación puede dar resultados inesperados debido al redondeo. Para obtener más información, consulte Relational Operations for Fixed-Point Data.
Ejemplos de lógica temporal
Definir retardos de tiempo
Este ejemplo muestra cómo definir dos retardos de tiempo absoluto en un gráfico de tiempo continuo.
La ejecución del gráfico sigue estos pasos:
Cuando el gráfico se activa, el estado
Input
se activa primero.Pasados 5,33 milisegundos de tiempo de simulación, se produce la transición de
Input
aOutput
.El estado
Input
se convierte en inactivo y el estadoOutput
se convierte en activo.Pasados 10,5 segundos de tiempo de simulación, se produce la transición de
Output
aInput
.El estado
Output
se convierte en inactivo y el estadoInput
se convierte en activo.
Los pasos 2 a 5 se repiten hasta que la simulación termina.
Si un gráfico tiene un tiempo de muestreo discreto, cualquier acción en el gráfico ocurre en múltiplos enteros de este tiempo de muestreo. Por ejemplo, si el solver de Simulink® utiliza un paso fijo de 0,1 segundos, la primera transición del estado Input
al estado Output
se produce en t = 0,1 segundos. Este comportamiento se debe a que el solver no activa el gráfico exactamente a t = 5,33 milisegundos. En su lugar, el solver activa el gráfico en múltiplos enteros de 0,1 segundos, como t = 0,0 y 0,1 segundos.
Detectar el tiempo transcurrido
En este ejemplo, un bloque Step (Simulink) proporciona una entrada de escalón unitario a un gráfico de Stateflow.
El gráfico determina cuándo la entrada u
es igual a 1:
Si la entrada es igual a 1 antes de que t = 2 segundos, se produce una transición de
Start
aFast
.Si la entrada es igual a 1 antes de que t = 2 segundos y t = 5 segundos, se produce una transición de
Start
aMedium
.Si la entrada es igual a 1 antes de que t = 5 segundos, se produce una transición de
Start
aSlow
.
Usar lógica temporal en tiempo absoluto en un subsistema activado
Puede utilizar lógica temporal en tiempo absoluto en un gráfico que reside en un subsistema de ejecución condicional. Cuando se desactiva el subsistema, el gráfico queda inactivo y el operador de lógica temporal se detiene mientras el gráfico está desactivado. El operador no sigue contando el tiempo de simulación hasta que el subsistema y el gráfico se activan de nuevo.
Este modelo tiene habilitado un subsistema con el parámetro States when enabling establecido en held
.
El subsistema contiene un gráfico que utiliza el operador after
para activar una transición.
El bloque Signal Editor (Simulink) proporciona una señal de entrada con estas características:
La señal activa el subsistema en t = 0.
La señal desactiva el subsistema en t = 2.
La señal vuelve a activar el subsistema en t = 6.
Este gráfico muestra el tiempo total transcurrido en el gráfico. Cuando la señal de entrada activa el subsistema en la unidad de tiempo t = 0, el estado A
se activa. Mientras el sistema está activado, el tiempo transcurrido aumenta. Cuando el subsistema se desactiva en t = 2, el gráfico entra en reposo y el tiempo transcurrido deja de aumentar. Cuando 2 <t <6, el tiempo transcurrido permanece en 2 segundos porque el sistema está desactivado. Cuando el gráfico se vuelve a activar en t = 6, el tiempo transcurrido vuelve a aumentar.
La transición del estado A
al estado B
depende del tiempo transcurrido mientras el estado A
está activo, no del tiempo de simulación. Por lo tanto, la transición se produce en t = 9, cuando el tiempo transcurrido en el estado A
es igual a 5 segundos. Cuando se produce la transición, el valor de salida y
cambia de 0 a 1.
Este comportamiento del modelo solo se aplica a los subsistemas en los que se configura el parámetro de bloque Enable States when enabling en held
. Si se establece el parámetro en reset
, el gráfico se reinicia completamente cuando se vuelve a activar el subsistema. Las transiciones predeterminadas se ejecutan y los contadores de lógica temporal se restablece en 0.
Notación para la lógica temporal basada en eventos en las transiciones
En los gráficos de Stateflow de los modelos de Simulink, los operadores after
, at
y before
admiten dos notaciones distintas para expresar la lógica temporal basada en eventos en una transición.
La notación de activación define una transición que solo depende del evento base para el operador de lógica temporal. La notación de activación sigue esta sintaxis:
donde:temporalLogicOperator(n,E)[C]
temporalLogicOperator
es un operador de lógica temporal booleano.n
es el recuento de ocurrencias del operador.E
es el evento base del operador.C
es una expresión de condición opcional.
Cuando se utiliza la notación de activación, la transición solo puede ocurrir cuando el gráfico procesa una transmisión del evento base
E
.La notación condicional define una transición que depende de eventos base y no base. La notación condicional sigue esta sintaxis:
donde:F[temporalLogicOperator(n,E) && C]
temporalLogicOperator
es un operador de lógica temporal booleano.n
es el recuento de ocurrencias del operador.E
es el evento base del operador.F
es un evento no base opcional.C
es una expresión de condición opcional.
Cuando se utiliza la notación condicional con un evento no base
F
, la transición solo puede ocurrir cuando el gráfico procesa una transmisión deF
. Si se omite el evento no base, la transición puede ocurrir cuando el gráfico está procesando cualquier evento explícito o implícito.La notación condicional para operadores de lógica temporal no se admite con gráficos independientes en MATLAB.
Por ejemplo, esta etiqueta de transición utiliza la notación de activación para indicar una transición de salida del estado asociado cuando el gráfico procesa una transmisión del evento base E
a partir de la quinta transmisión de E
y después de que el estado se convirtió en activo.
after(5,E)
En cambio, esta etiqueta de transición utiliza una notación condicional para indicar una transición de salida del estado asociado cuando el estado se ha activado durante al menos cinco transmisiones del evento base E
, incluso si el gráfico no está procesando una transmisión de E
.
[after(5,E)]
Nota
El operador every
admite notaciones de activación y condicionales. Sin embargo, ambas notaciones son equivalentes para este operador. Las etiquetas de transición every(5,E)
y [every(5,E)]
indican una transición de salida del estado asociado cuando el gráfico procesa la k-ésima transmisión del evento base E
después de que el estado se convirtió en activo, donde k es un múltiplo de cinco.
Prácticas recomendadas para la lógica temporal
No utilice la lógica temporal en las rutas de transición sin un estado de origen
El valor de un operador de lógica temporal depende del momento en el que el estado asociado se convirtió en activo. Para asegurarse de que cada operador de lógica temporal tiene un único estado asociado, utilice solo estos operadores en:
Acciones de estado
on
Acciones en rutas de transición que se originan en un estado
No utilice operadores de lógica temporal en transiciones predeterminadas o en transiciones en funciones gráficas, porque no se originan en un estado.
Utilice la lógica temporal en tiempo absoluto en lugar de tick
en los gráficos de modelos de Simulink
En los gráficos de un modelo de Simulink, el valor de las expresiones de retardo que utilizan la lógica temporal en tiempo absoluto son semánticamente independientes del tiempo de muestreo del modelo. En cambio, las expresiones de retardo que utilizan la lógica temporal basada en el evento implícito tick
dependen del tamaño de paso que utiliza el solver de Simulink.
Además, la lógica temporal en tiempo absoluto es compatible con los gráficos que tienen eventos de entrada. El evento implícito tick
no está admitido cuando un gráfico de Stateflow de un modelo de Simulink cuenta con eventos de entrada.
No utilice at
para la lógica temporal en tiempo absoluto en los gráficos de modelos de Simulink
En los gráficos de un modelo de Simulink, no se admite el uso de at
como operador de lógica temporal en tiempo absoluto. En su lugar, utilice el operador after
. Por ejemplo, supongamos que queremos definir un retardo temporal usando la expresión at(5.33,sec)
.
Para evitar un error en tiempo de ejecución, cambie la etiqueta de transición a after(5.33,sec)
.
Resultados inesperados con grandes valores de parámetros
Una condición de lógica temporal de tiempo absoluto de Stateflow, como after(x,sec)
, podría no ser evaluada como true
en el momento esperado después de acceder a un estado con las siguientes condiciones:
El gráfico tiene un tiempo de muestreo discreto periódico.
La lógica del gráfico hace que el estado permanezca activo durante más de
2147418
unidades de tiempo. Las unidades de tiempo son las más pequeñas de cualquier expresión de lógica temporal utilizada por ese estado. Por ejemplo, si el estado tiene dos transiciones salientes, una que utilizaafter(x,sec)
y otra que utilizaafter(x,msec)
, las unidades de tiempo sonmsec (milliseconds)
.
Normalmente, los resultados inesperados se producen cuando la duración del estado es superior a 2147418
unidades de tiempo. Sin embargo, esto puede cambiar en función del tiempo de muestreo del gráfico.
No utilice every
para la lógica temporal en tiempo absoluto en los gráficos de modelos de Simulink
En los gráficos de un modelo de Simulink, no se admite el uso de every
como operador de lógica temporal en tiempo absoluto. En su lugar, puede utilizar una transición de autobucle externa con el operador after
. Por ejemplo, supongamos que se desea imprimir un mensaje de estado para un estado activo cada 2,5 segundos durante la ejecución del gráfico.
Para evitar un error en tiempo de ejecución, sustituya la acción de estado por una transición de autobucle externa.
Añada una intersección histórica en el estado para que el gráfico recuerde los ajustes de estado antes de cada transición de autobucle. Consulte Reanudar la actividad de un subestado previo con intersecciones históricas.
No utilice la lógica temporal en las rutas de transición con múltiples orígenes en los gráficos independientes de MATLAB
Los gráficos independientes de MATLAB no admiten el uso de operadores de lógica temporal en rutas de transición que tienen más de un estado de origen. Por ejemplo, este gráfico independiente produce un error en tiempo de ejecución porque la expresión de lógica temporal after(10,sec)
activa una ruta de transición que tiene más de un estado de origen.
Para resolver el problema, utilice expresiones de lógica temporal en rutas de transición separadas, cada una con un único estado de origen.
Evite mezclar la lógica temporal en tiempo absoluto y las condiciones en las rutas de transición de los gráficos independientes de MATLAB
En los gráficos independientes de MATLAB, los operadores after
, at
y every
crean objetos timer
de MATLAB que generan eventos implícitos para activar el gráfico. La combinación de estos operadores con condiciones en la misma ruta de transición puede dar lugar a un comportamiento no deseado:
Si una condición de la ruta de transición es falsa cuando el
timer
activa el gráfico, este realiza las accionesduring
yon
del estado activo.El gráfico no restablece el objeto
timer
asociado a los operadoresafter
yat
. Si la condición en la ruta de transición se vuelve verdadera en un momento posterior, la transición no tiene lugar hasta que otro evento explícito o implícito activa el gráfico.
Por ejemplo, en este gráfico, la ruta de transición del estado A
al estado B
combina el activador de lógica temporal en tiempo absoluto after(1,sec)
y la condición [guard]
. La transición del estado A
al estado C
tiene un activador de lógica temporal en tiempo absoluto after(5,sec)
. Cada transición está asociada a un objeto timer
que genera un evento implícito. Inicialmente, la variable local guard
es false
.
Cuando ejecuta el gráfico, el estado A
se activa. El gráfico realiza la acción entry
y muestra el mensaje Hello!
. Al cabo de 1 segundo, el timer
asociado a la transición de A
a B
activa el gráfico. Como la transición no es válida, el gráfico ejecuta la acción during
en el estado A
y muestra el mensaje Hello!
por segunda vez.
Supongamos que, al cabo de 2 segundos, el gráfico recibe el evento de entrada E
. El gráfico ejecuta la acción on
en el estado A
y cambia el valor guard
a true
. Dado que el gráfico no restablece el timer
asociado al operador after
, la transición de A
a B
no se produce hasta que otro evento activa el gráfico.
Al cabo de 5 segundos, el timer
asociado a la transición de A
a C
activa el gráfico. Como la transición de A
a B
es válida y tiene un orden de ejecución superior, el gráfico no realiza la transición al estado C
ni muestra el mensaje Farewell!
. En cambio, el estado B
se activa y el gráfico muestra el mensaje Good bye!
.
Utilice gráficos con tiempos de muestreo discretos para generar códigos de forma más eficiente
El código generado para los gráficos discretos que no están dentro de un subsistema activado o habilitado utiliza contadores enteros para realizar un seguimiento del tiempo proporcionado por Simulink. Este comportamiento permite generar código de forma más eficiente en términos de sobrecarga y memoria, y permite usarlo en los modos de simulación software-in-the-loop (SIL) y processor-in-the-loop (PIL). Para obtener más información, consulte SIL and PIL Simulations (Embedded Coder).
Consulte también
after
| at
| before
| every
| temporalCount
| elapsed
| count
| duration
| timer
| Signal Editor (Simulink) | Step (Simulink)