广播局部事件以同步并行状态
局部事件是发生在 Stateflow® 图中的事件,仅在图中可见。这种类型的事件使同一图中的并行 (AND) 状态能够相互同步,以便一种状态下的动作触发另一种状态下的动作。一个 Stateflow 图中的动作无法将局部事件广播到另一个 Stateflow 图中的状态。要定义局部事件,请执行以下操作:
向 Stateflow 图添加一个事件,如定义图中的事件中所述。
将事件的作用域属性设置为局部。
MATLAB® 中的独立 Stateflow 图不支持局部事件。有关详细信息,请参阅通过广播事件同步模型组件。
广播局部事件
有向事件广播使用运算符 send
将局部事件从一个状态直接发送到另一个状态:
send(event_name,state_name)
event_name
是局部事件,state_name
是接收状态。局部事件直接广播到接收状态及其任何子状态。局部事件必须对发送状态和接收状态都可见。接收状态在事件广播期间必须处于激活状态。例如,此图包含两个并行 (AND) 状态 A
和 B
。局部事件 E_one
属于该图且对这两个状态都可见。在状态 A
中,从子状态 A1
到子状态 A2
的转移使用 send(E_one,B)
形式的有向事件广播,以将局部事件 E_one
发送到状态 B
。在 B
中,该事件触发从子状态 B1
到子状态 B2
的转移。因此,A
和 B
中的激活子状态是同步的。有关此示例的语义的详细信息,请参阅Directed Event Broadcast Using Send。
state_name
参量可以包含该状态的完整层次结构路径。例如,如果状态 A
包含状态 A1
,您可以通过此广播向状态 A1
发送事件 E
:
send(E,A.A1)
提示
请不要在状态的完整层次结构路径中包含 Stateflow 图名称。
在事件广播中使用限定事件名称
要广播对发送状态不可见的局部事件,请结合使用限定事件名称和运算符 send
:
send(state_name.event_name)
event_name
是接收状态 state_name
拥有的局部事件。局部事件直接广播到接收状态及其任何子状态。局部事件对接收状态可见,但对发送状态不可见。接收状态在事件广播期间必须处于激活状态。例如,此图包含两个并行 (AND) 状态 A
和 B
。局部事件 E_one
属于状态 B
,且只对该状态可见。在状态 A
中,从子状态 A1
到子状态 A2
的转移使用 send(B.E_one)
形式的有向事件广播,以将局部事件 E_one
发送到状态 B
。在 B
中,该事件触发从子状态 B1
到子状态 B2
的转移。因此,A
和 B
中的激活子状态是同步的。有关此示例的语义的详细信息,请参阅Directed Event Broadcast Using Qualified Event Name。
参量可以包含接收状态的完整层次结构路径。请不要在状态的完整路径名中包含 Stateflow 图名称。例如,假设状态 state_name
A
包含状态 A1
,并且 A1
拥有局部事件 E
。您可以通过此广播将事件 E
发送到状态 A1
:
send(A.A1.E)
无向事件广播
无向事件广播将局部事件发送到它在其中可见的所有状态,其实现方式有两种,一是通过使用事件名称作为条件动作来实现:
event_name;
二是通过调用运算符 send
而不指定接收状态来实现:
send(event_name)
event_name
是对发送状态可见的局部事件。如有可能,请尽量使用有向事件广播来代替无向事件广播。有向事件广播可防止仿真期间发生不必要的递归并提高生成代码的效率。有关详细信息,请参阅Avoid Unwanted Recursion in a Chart。
检测无向局部事件广播时所用的诊断
在仿真期间,Stateflow 图可以检测无向局部事件广播。要控制诊断操作的级别,请打开“配置参数”对话框,并在诊断 > Stateflow 窗格中,将无向事件广播参数设置为无、警告或错误。默认设置为警告。有关详细信息,请参阅Undirected event broadcasts (Simulink)。