Main Content

进入图或状态

出现以下情况时,会发生进入图和状态的动作:

  • 图首次被激活。这称为图初始化。

  • 存在有效的状态转移。请参阅计算转移

进入图或状态的工作流

此流程图显示 Stateflow® 在进入某个图或状态时执行的事件进程。在该流程图中,当前状态是指其中有决策正在进行或有进程正在发生的状态。

Flow chart that shows the steps for entering a chart or state.

图的 entry 动作

您的 Stateflow 图第一次被激活时称为初始化。当您的图发生初始化时,将进入图,并且 Stateflow 将执行互斥 (OR) 状态的任何默认转移。如果图顶层的状态是并行 (AND) 状态,则它们会按其顺序编号被依次激活。

如果您需要图在时间 t = 0 之前进行任何默认转移,请在“图属性”对话框中,选中初始化时执行(进入)图复选框。此选项使 Stateflow 图的初始化与 Simulink® 的初始化同时进行。因此,图的默认转移路径会在模型初始化阶段执行。

状态的 entry 动作

当状态被标记为 entry 时,将执行状态的 entry 动作。一旦图被激活并完成初始化,顶层状态就变为激活状态。当出现以下任一情况时,状态将被标记为 entry:

  • 传入转移跨越状态边界。

  • 传入转移在状态边界处结束。

  • 状态是一个激活状态的并行状态子级。

entry 动作

entry 动作以前缀 entry(或简写为 en)开头,后跟必要的冒号 (:) 以及一个或多个动作。您可以使用回车符、分号 (;) 或逗号 (,) 分隔多个动作。如果没有为语句显式指定一种状态动作类型,则 Stateflow 图会将该语句视为一个 entry,during 动作。

进入 Stateflow

在此示例中,图第一次被激活,从而发生图初始化。

Stateflow chart with top-level states called StateA and StateB. StateA has substates StateA1 and StateA2. StateB has substates StateB1 and StateB2.

在按照进入图或状态的工作流执行动作直至图进入休眠状态的过程中,图初始化的步骤顺序如下:

  1. 执行默认转移动作,x = 0y = 0z = 0

  2. StateA 被标记为 entry。

  3. StateA 不是非激活父状态的子状态。执行 StateAentry 动作。现在 x = 1

  4. StateA 是之前被标记为 entry 的状态。

  5. StateA 不包含任何历史结点。

  6. 它有一个到子状态 StateA1 的默认转移。转至描述计算转移的流程图。

  7. 按照计算转移的流程图,将 StateA1 标记为 entry。转至描述 exit 动作的流程图。

  8. 当前状态 StateA 是目标状态 StateA1 的父状态。返回到描述 entry 动作的流程图。

  9. StateA1 不是非激活父状态的子状态。执行 StateA1entry 动作。现在 x = 3

  10. StateA1 是之前被标记为 entry 的状态。

  11. StateA1 不包含任何历史结点。

  12. StateA1 不包含任何默认转移。

  13. StateA1 不包含任何子状态。

  14. 图进入休眠状态。

步骤 1 至 14 在初始时间步中发生。这就完成了图初始化过程。

使用历史结点进入状态

如果您需要 Stateflow 图记住并返回到以前激活的子状态,而不考虑默认转移,则应使用历史结点。将历史结点置于某状态之内会覆盖指向互斥 (OR) 子状态的默认转移。在将历史结点置于某状态内后,在执行 entry 动作时,您的 Stateflow 图会记住并进入先前激活的子状态。历史结点只会应用到层次结构中其所在的层级。

在此示例中,灯可以打开或关闭。这些选项由 Power_onPower_off 状态指示。这些选项由输入事件 switch_onswitch_off 控制。灯在打开时,可以呈暗淡或明亮。这些选项由状态 LowHigh 指示,并由输入事件 switch_lowswitch_high 控制。

最初,图处于休眠状态。状态 Power_off 处于激活状态。状态 Power_on 在上次激活时,High 是之前的激活子状态。事件 switch_on 发生,状态 Power_on 被标记为 entry。此时 p = 0

Stateflow chart with top-level states called Power_off and Power_on. Power_on has a history junction and substates Low and High.

在按照进入图或状态的工作流执行动作直至图进入休眠状态的过程中,进入状态 Power_on 的执行步骤顺序如下:

  1. Power_on 不是非激活父状态的子状态。

  2. Power_on 没有 entry 动作。

  3. Power_on 是之前被标记为 entry 的状态。

  4. 有处于 Power_on 状态的历史结点。

  5. High 是之前的激活子状态。现在 p = 2

  6. High 不包含任何历史结点。

  7. High 不包含任何默认转移。

  8. High 不包含任何子状态。

  9. 图进入休眠状态。

这就完成了 Power_onHighentry 动作。

通过使用超转移进入状态

超转移是图中不同层次之间的转移。超转移可以是顶层图中的状态与其一个子图中的状态之间的转移,也可以是位于图中相同或不同层次的不同子图中的状态之间的转移。您可以创建跨图中任意层数的超转移。

当通过超转移进入某状态时,在对最终目标执行 entry 动作之前,必须将它的父状态标记为激活状态,并且必须执行其 entry 动作。在此示例中,StateB1 被标记为 entry(转移源自 StateA2)。此时,x = 5y = 5z = 1

Stateflow chart with top-level states called StateA and StateB. StateA has substates StateA1 and StateA2. StateB has substates StateB1 and StateB2.

在按照进入图或状态的工作流执行动作直至图进入休眠状态的过程中,进入状态 StateB1 的执行步骤顺序如下:

  1. StateB1 是非激活父状态 (StateB) 的子状态。

  2. StateB 被标记为激活状态。

  3. StateB 不是非激活父状态的子状态。

  4. 执行 StateB 的 entry 动作。现在 x = 4

  5. StateB 不是最初被标记为 entry 的状态。

  6. 执行 StateB1 的 entry 动作。现在 x = 3

  7. StateB1 是之前被标记为 entry 的状态。

  8. StateB1 没有历史结点。

  9. StateB1 不包含任何默认转移。

  10. StateB1 不包含任何子状态。

  11. 图进入休眠状态。

这就完成了 StateBStateB1entry 动作。

相关主题