Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

使用条件动作控制图的执行

条件动作行为

此示例说明具有多个段的转移路径中的简单条件动作的行为。该图会隐式对出向转移进行排序(请参阅隐式排序)。

Stateflow chart with states called A, B, and C.

最初,图处于休眠状态。状态 A 处于激活状态。条件 C_oneC_two 为 false。事件 E_one 发生并唤醒图,该图沿层次结构从根向下处理该事件:

  1. 图的根检查 E_one 是否导致了有效转移。检测到从状态 A 到连接结点的有效转移段。在该有效转移段上检测到条件动作 A_one,立即执行并完成了该条件动作。状态 A 仍处于激活状态。

  2. 由于转移段到可能目标的条件为 false,因此不存在有效的已完成转移。

  3. 状态 A during 动作 (durA()) 执行并完成。

    状态 A 保持激活状态。

  4. 图重新进入休眠状态。

此序列描述了状态 A 初始为激活时由事件 E_one 驱动的整个 Stateflow® 图的执行过程。

条件和转移动作行为

此示例说明对从一个互斥 (OR) 状态到另一个互斥 (OR) 状态的转移指定的简单条件和转移动作的行为。

Stateflow chart with states called A and B.

最初,图处于休眠状态。状态 A 处于激活状态。条件 C_one 为 true。事件 E_one 发生并唤醒图,该图沿层次结构从根向下处理该事件:

  1. 图的根检查 E_one 是否导致了有效转移。检测到从状态 A 到状态 B 的有效转移。条件 C_one 为 true。在该有效转移上检测到条件动作 A_one,立即执行并完成了该条件动作。状态 A 仍处于激活状态。

  2. 状态 A exit 动作 (ExitA()) 执行并完成。

  3. 状态 A 被标记为非激活状态。

  4. 执行并完成转移动作 A_two

  5. 状态 B 被标记为激活状态。

  6. 状态 B entry 动作 (entB()) 执行并完成。

  7. 图重新进入休眠状态。

此序列描述了状态 A 初始为激活时由事件 E_one 驱动的整个 Stateflow 图的执行过程。

使用 for 循环创建条件动作

条件动作和连接结点用于设计 for 循环构造。此示例说明如何使用条件动作和连接结点来创建 for 循环构造。该图会隐式对出向转移进行排序(请参阅隐式排序)。

Stateflow chart with states called A and B.

请参阅For-Loop Construct以查看此示例的行为。

使用条件动作向并行 (AND) 状态广播事件

以下示例说明如何使用条件动作将事件立即广播到并行 (AND) 状态。该图使用并行状态的隐式排序(请参阅并行状态隐式排序)。

Stateflow chart with a top-level state called A. A has two parallel substates called A1 and A2. A1 has substates A1a and A1B. A2 has substates A2a and A2b.

请参阅Broadcast Events in Condition Actions以查看此示例的行为。

提示

避免使用无向局部事件广播。无向局部事件广播会导致在图中产生不必要的递归行为。请改为使用有向广播发送局部事件。有关详细信息,请参阅广播局部事件以同步并行状态

在仿真期间,Stateflow 图可以检测无向局部事件广播。要控制诊断操作的级别,请打开“配置参数”对话框,并在诊断 > Stateflow 窗格中,将无向事件广播参数设置为警告错误。默认设置为警告。有关详细信息,请参阅Undirected event broadcasts (Simulink)

避免循环行为

此示例说明在将事件广播用作条件动作时要避免的一种表示法,因为其语义会导致循环行为。

Stateflow chart with states called On and Off.

最初,图处于休眠状态。状态 On 处于激活状态。事件 E_one 发生并唤醒图,该图沿层次结构从根向下处理该事件:

  1. 图的根检查 E_one 是否导致了有效转移。

    检测到从状态 On 到状态 Off 的有效转移。

  2. 转移的条件动作广播事件 E_one

  3. 在有效转移上检测到事件 E_one,立即执行该事件。状态 On 仍处于激活状态。

  4. 事件 E_one 的广播再一次唤醒图。

  5. 转至步骤 1。

继续以循环方式执行步骤 1 到 5。转移标签指示与条件动作广播事件相同的事件上存在触发行为,从而导致无法恢复的循环行为。在事件 E_one 被广播且状态 On 处于激活状态的情况下,此序列永远无法完成。

提示

避免使用无向局部事件广播。无向局部事件广播会导致在图中产生不必要的递归行为。请改为使用有向广播发送局部事件。有关详细信息,请参阅广播局部事件以同步并行状态

在仿真期间,Stateflow 图可以检测无向局部事件广播。要控制诊断操作的级别,请打开“配置参数”对话框,并在诊断 > Stateflow 窗格中,将无向事件广播参数设置为警告错误。默认设置为警告。有关详细信息,请参阅Undirected event broadcasts (Simulink)

相关主题