Anzeige der Unterschiede zwischen Stateflow-Nachrichten, -Ereignissen und -Daten
In diesem Beispiel wird das Verhalten von Nachrichten, Ereignissen und Daten in Stateflow® verglichen.
Senderdiagramme
Dieses Modell hat drei Senderdiagramme: DataSender
, EventSender
und MessageSender
Jedes Senderdiagramm hat einen Zustand. In der Eingabeaktion des Zustands weisen die Diagramme den Daten einen Wert zu, senden ein Funktionsaufrufereignis oder senden eine Nachricht.
Empfängerdiagramme
Für jedes der Senderdiagramme gibt es ein entsprechendes Empfängerdiagramm. Jedes Empfängerdiagramm hat ein Zustandsdiagramm mit den Zuständen A0
, A1
, A2
und A3
. Das implizite Ereignis after(3,sec)
löst den Übergang von A0
zu A1
aus. Die Daten, Ereignisse oder Nachrichten aus dem entsprechenden Senderdiagramm überwachen die Übergänge zwischen A1
, A2
und A3
.
Ausgabe im Scope-Block
Bei jedem Empfängerdiagramm ist die Ausgabe des aktiven Zustands aktiviert und mit einem Scope-Block verbunden. Der Scope-Block zeigt, welche Zustände in jedem Zeitschritt aktiv sind. Diese Ausgabe hebt den Unterschied im Verhalten zwischen Ausgabedaten, Ereignissen und Nachrichten hervor.
Datenverhalten
Das DataSender
-Diagramm weist den Ausgabedaten M
, die als Eingabe mit dem DataReceiver
-Diagramm verbunden sind, den Wert 1 zu.
Das DataReceiver
-Diagramm wird einmal bei jedem Zeitschritt ausgeführt. Zu Beginn der Simulation ist der Zustand A0
aktiv. Zum Zeitpunkt t=3
erfolgt der Übergang von A0
zu A1
. Zum Zeitpunkt t=4
wird im Diagramm geprüft, ob M
gleich 1 ist. Diese Bedingung ist wahr, sodass das Diagramm von A1
zu A2
wechselt. Zum Zeitpunkt t=5
entspricht M
immer noch 1
, sodass das Diagramm von A2
zu A3
übergeht. Im Scope-Block sehen Sie, dass DataReceiver
dreimal den Zustand wechselt.
Nachdem Daten ein Wert zugewiesen wurde, behalten sie diesen Wert während der gesamten Simulation bei. Daher geht DataReceiver
jedes Mal, wenn es den Zustand [M == 1]
bewertet, in einen neuen Zustand über.
Verhalten von Ereignissen
Das EventSender
-Diagramm sendet mit dem Befehl send(M)
ein Funktionsaufruf-Ausgangsereignis zur Aktivierung des EventReceiver
-Diagramms.
Das EventReceiver
-Diagramm wird nur ausgeführt, wenn das Eingangsereignis M
das Diagramm aktiviert. Zu Beginn der Simulation ist der Zustand A0
aktiv. Der Übergang von A0
zu A1
basiert auf der absoluten Zeitlogik und ist zum Zeitpunkt t=0
nicht gültig. A0
bleibt aktiv und das Diagramm kehrt in den Ruhezustand zurück. Da EventSender
das Ereignis M
nur einmal sendet, wird EventReceiver
nicht erneut aktiviert. Im Scope-Block sehen Sie, dass EventReceiver
nie den Zustand A0
verlässt.
Ereignisse bleiben nicht über Zeitschritte hinweg gültig, sodass das empfangende Diagramm nur eine einzige Chance hat, auf das Ereignis zu reagieren. Wenn EventSender
das Ereignis sendet, ist EventReceiver
nicht bereit, darauf zu reagieren. Die Möglichkeit für EventReceiver
, als Reaktion auf das Ereignis den Übergang zu vollziehen, ist nicht mehr vorhanden.
Verhalten von Nachrichten
Das MessageSender
-Diagramm sendet mit der Syntax send(M)
eine Nachricht über den Ausgangsnachricht-Port. Die Nachricht wird in die Warteschlange für eingehende Nachrichten des MessageReceiver
-Diagramms gestellt. Die Nachricht wartet in der Warteschlange, bis MessageReceiver
sie auswertet.
Das MessageReceiver
-Diagramm wird einmal bei jedem Zeitschritt ausgeführt. Zu Beginn der Simulation ist der Zustand A0
aktiv. Zum Zeitpunkt t=3
erfolgt der Übergang von A0
zu A1
. Zum Zeitpunkt t=4
stellt das Diagramm fest, dass M
in der Warteschlange vorhanden ist, sodass der Übergang zu A2
erfolgt. Am Ende des Zeitschritts entfernt das Diagramm M
aus der Warteschlange. Zum Zeitpunkt t=5
befindet sich keine Nachricht in der Warteschlange, sodass das Diagramm nicht zu A3
wechselt. A2
bleibt der aktive Zustand. Im Scope-Block sehen Sie, dass MessageReceiver
den Zustand nur zweimal ändert.
Im Gegensatz zu Ereignissen werden Nachrichten in eine Warteschlange gestellt. Das Empfangsdiagramm kann jederzeit nach dem Senden auf eine Nachricht antworten. Im Gegensatz zu Daten behalten Nachrichten nicht unbegrenzt ihre Gültigkeit. Die Nachricht wird am Ende des Zeitschritts zerstört.