Ver las diferencias entre los mensajes, eventos y datos de Stateflow
En este ejemplo se compara el comportamiento de los mensajes, eventos y datos en Stateflow®.
Gráficos emisores
Este modelo tiene tres gráficos emisores: DataSender
, EventSender
y MessageSender
. Cada gráfico emisor tiene un estado. En la acción de entrada del estado, los gráficos asignan un valor a los datos, envían un evento de llamada de función o envían un mensaje.
Gráficos receptores
Cada uno de los gráficos emisores tiene un gráfico receptor correspondiente. Cada gráfico receptor tiene un diagrama de estados con los estados A0
, A1
, A2
y A3
. El evento implícito after(3,sec)
activa la transición de A0
a A1
. Los datos, el evento o el mensaje del gráfico emisor correspondiente vigila las transiciones entre A1
, A2
y A3
.
Salida del ámbito
Cada gráfico receptor tiene una salida de estado activa habilitada y conectada con un ámbito. El ámbito muestra qué estados están activos en cada unidad de tiempo. Esta salida resalta la diferencia en el comportamiento entre datos de salida, eventos y mensajes.
Comportamiento de los datos
El gráfico DataSender
asigna un valor de 1 a los datos de salida M
, que se conectan como entrada al gráfico DataReceiver
.
El gráfico DataReceiver
solo se ejecuta una vez en cada unidad de tiempo. Al comienzo de la simulación, el estado A0
está activo. En la unidad de tiempo t=3
, se produce la transición de A0
a A1
. En la unidad de tiempo t=4
, el gráfico comprueba si M
es igual a 1. Esta condición es verdadera, por lo que el gráfico realiza la transición de A1
a A2
. En la unidad de tiempo t=5
, M
todavía es igual a 1
, por lo que el gráfico realiza la transición de A2
a A3
. En el ámbito, puede ver que DataReceiver
cambia de estado tres veces.
Una vez que se asigna un valor a los datos, se mantienen durante toda la simulación. De esta manera, cada vez que DataReceiver
evalúa la condición [M == 1]
, realiza la transición a un nuevo estado.
Comportamiento del evento
El gráfico EventSender
utiliza el comando send(M)
para enviar un evento de salida de llamada de función para activar el gráfico EventReceiver
.
El gráfico EventReceiver
solo se ejecuta cuando el evento de entrada M
activa el gráfico. Al comienzo de la simulación, el estado A0
está activo. La transición de A0
a A1
se basa en lógica temporal de tiempo absoluto y no es válida cuando t=0
. A0
permanece activo y el gráfico vuelve al estado inactivo. Dado que EventSender
envía el evento M
tan solo una vez, EventReceiver
no vuelve a activarse. En el ámbito, puede ver que EventReceiver
nunca sale de A0
.
Los eventos no se mantienen válidos en diferentes unidades de tiempo, por lo que el gráfico receptor solo tiene una oportunidad para responder al evento. Cuando EventSender
envía el evento, EventReceiver
no está preparado para responderlo. EventReceiver
pierde la oportunidad de hacer la transición en respuesta al evento.
Comportamiento del mensaje
El gráfico MessageSender
utiliza la sintaxis send(M)
para enviar un mensaje a través del puerto de mensajes de salida. El mensaje pasa a la cola de mensajes de entrada del gráfico MessageReceiver
. El mensaje espera en la cola hasta que MessageReceiver
lo evalúa.
El gráfico MessageReceiver
solo se ejecuta una vez en cada unidad de tiempo. Al comienzo de la simulación, el estado A0
está activo. En la unidad de tiempo t=3
, se produce la transición de A0
a A1
. En la unidad de tiempo t=4
, el gráfico determina que M
está presente en la cola, así que realiza la transición a A2
. Al finalizar la unidad de tiempo, el gráfico elimina M
de la cola. En la unidad de tiempo t=5
, no hay ningún mensaje presente en la cola, por lo que el gráfico no realiza la transición a A3
. A2
permanece en el estado activo. En el ámbito, puede ver que MessageReceiver
cambia de estado solo dos veces.
A diferencia de los eventos, los mensajes se ponen en la cola. El gráfico receptor puede decidir responder un mensaje en cualquier momento posterior a su envío. A diferencia de los datos, el mensaje no sigue siendo válido de forma indefinida. El mensaje se destruye al final de la unidad de tiempo.