使用条件动作控制图的执行
条件动作行为
此示例说明具有多个段的转移路径中的简单条件动作的行为。该图会隐式对出向转移进行排序(请参阅隐式排序)。
最初,图处于休眠状态。状态 A
处于激活状态。条件 C_one
和 C_two
为 false。事件 E_one
发生并唤醒图,该图沿层次结构从根向下处理该事件:
图的根检查
E_one
是否导致了有效转移。检测到从状态A
到连接结点的有效转移段。在该有效转移段上检测到条件动作A_one
,立即执行并完成了该条件动作。状态A
仍处于激活状态。由于转移段到可能目标的条件为 false,因此不存在有效的已完成转移。
状态
A
during 动作 (durA()
) 执行并完成。状态
A
保持激活状态。图重新进入休眠状态。
此序列描述了状态 A
初始为激活时由事件 E_one
驱动的整个 Stateflow® 图的执行过程。
条件和转移动作行为
此示例说明对从一个互斥 (OR) 状态到另一个互斥 (OR) 状态的转移指定的简单条件和转移动作的行为。
最初,图处于休眠状态。状态 A
处于激活状态。条件 C_one
为 true。事件 E_one
发生并唤醒图,该图沿层次结构从根向下处理该事件:
图的根检查
E_one
是否导致了有效转移。检测到从状态A
到状态B
的有效转移。条件C_one
为 true。在该有效转移上检测到条件动作A_one
,立即执行并完成了该条件动作。状态A
仍处于激活状态。状态
A
exit 动作 (ExitA()
) 执行并完成。状态
A
被标记为非激活状态。执行并完成转移动作
A_two
。状态
B
被标记为激活状态。状态
B
entry 动作 (entB()
) 执行并完成。图重新进入休眠状态。
此序列描述了状态 A
初始为激活时由事件 E_one
驱动的整个 Stateflow 图的执行过程。
使用 for 循环创建条件动作
条件动作和连接结点用于设计 for
循环构造。此示例说明如何使用条件动作和连接结点来创建 for
循环构造。该图会隐式对出向转移进行排序(请参阅隐式排序)。
请参阅For-Loop Construct以查看此示例的行为。
使用条件动作向并行 (AND) 状态广播事件
以下示例说明如何使用条件动作将事件立即广播到并行 (AND) 状态。该图使用并行状态的隐式排序(请参阅并行状态隐式排序)。
请参阅Broadcast Events in Condition Actions以查看此示例的行为。
提示
避免使用无向局部事件广播。无向局部事件广播会导致在图中产生不必要的递归行为。请改为使用有向广播发送局部事件。有关详细信息,请参阅广播局部事件以同步并行状态。
在仿真期间,Stateflow 图可以检测无向局部事件广播。要控制诊断操作的级别,请打开“配置参数”对话框,并在诊断 > Stateflow 窗格中,将无向事件广播参数设置为“无
”、“警告
”或“错误
”。默认设置为“警告
”。有关详细信息,请参阅Undirected event broadcasts (Simulink)。
避免循环行为
此示例说明在将事件广播用作条件动作时要避免的一种表示法,因为其语义会导致循环行为。
最初,图处于休眠状态。状态 On
处于激活状态。事件 E_one
发生并唤醒图,该图沿层次结构从根向下处理该事件:
图的根检查
E_one
是否导致了有效转移。检测到从状态
On
到状态Off
的有效转移。转移的条件动作广播事件
E_one
。在有效转移上检测到事件
E_one
,立即执行该事件。状态On
仍处于激活状态。事件
E_one
的广播再一次唤醒图。转至步骤 1。
继续以循环方式执行步骤 1 到 5。转移标签指示与条件动作广播事件相同的事件上存在触发行为,从而导致无法恢复的循环行为。在事件 E_one
被广播且状态 On
处于激活状态的情况下,此序列永远无法完成。
提示
避免使用无向局部事件广播。无向局部事件广播会导致在图中产生不必要的递归行为。请改为使用有向广播发送局部事件。有关详细信息,请参阅广播局部事件以同步并行状态。
在仿真期间,Stateflow 图可以检测无向局部事件广播。要控制诊断操作的级别,请打开“配置参数”对话框,并在诊断 > Stateflow 窗格中,将无向事件广播参数设置为“无
”、“警告
”或“错误
”。默认设置为“警告
”。有关详细信息,请参阅Undirected event broadcasts (Simulink)。