进入图或状态
出现以下情况时,会发生进入图和状态的动作:
图首次被激活。这称为图初始化。
存在有效的状态转移。请参阅计算转移。
进入图或状态的工作流
此流程图显示 Stateflow® 在进入某个图或状态时执行的事件进程。在该流程图中,当前状态是指其中有决策正在进行或有进程正在发生的状态。
图的 entry 动作
您的 Stateflow 图第一次被激活时称为初始化。当您的图发生初始化时,将进入图,并且 Stateflow 将执行互斥 (OR) 状态的任何默认转移。如果图顶层的状态是并行 (AND) 状态,则它们会按其顺序编号被依次激活。
如果您需要图在时间 t = 0
之前进行任何默认转移,请在“图属性”对话框中,选中初始化时执行(进入)图复选框。此选项使 Stateflow 图的初始化与 Simulink® 的初始化同时进行。因此,图的默认转移路径会在模型初始化阶段执行。
状态的 entry 动作
当状态被标记为 entry 时,将执行状态的 entry 动作。一旦图被激活并完成初始化,顶层状态就变为激活状态。当出现以下任一情况时,状态将被标记为 entry:
传入转移跨越状态边界。
传入转移在状态边界处结束。
状态是一个激活状态的并行状态子级。
entry 动作
entry 动作以前缀 entry
(或简写为 en
)开头,后跟必要的冒号 (:
) 以及一个或多个动作。您可以使用回车符、分号 (;
) 或逗号 (,
) 分隔多个动作。如果没有为语句显式指定一种状态动作类型,则 Stateflow 图会将该语句视为一个 entry
,during
动作。
进入 Stateflow 图
在此示例中,图第一次被激活,从而发生图初始化。
在按照进入图或状态的工作流执行动作直至图进入休眠状态的过程中,图初始化的步骤顺序如下:
执行默认转移动作,
x = 0
、y = 0
和z = 0
。StateA
被标记为 entry。StateA
不是非激活父状态的子状态。执行StateA
的entry
动作。现在x = 1
。StateA
是之前被标记为 entry 的状态。StateA
不包含任何历史结点。它有一个到子状态
StateA1
的默认转移。转至描述计算转移的流程图。按照计算转移的流程图,将
StateA1
标记为entry
。转至描述 exit 动作的流程图。当前状态
StateA
是目标状态StateA1
的父状态。返回到描述 entry 动作的流程图。StateA1
不是非激活父状态的子状态。执行StateA1
的entry
动作。现在x = 3
。StateA1
是之前被标记为 entry 的状态。StateA1
不包含任何历史结点。StateA1
不包含任何默认转移。StateA1
不包含任何子状态。图进入休眠状态。
步骤 1 至 14 在初始时间步中发生。这就完成了图初始化过程。
使用历史结点进入状态
如果您需要 Stateflow 图记住并返回到以前激活的子状态,而不考虑默认转移,则应使用历史结点。将历史结点置于某状态之内会覆盖指向互斥 (OR) 子状态的默认转移。在将历史结点置于某状态内后,在执行 entry 动作时,您的 Stateflow 图会记住并进入先前激活的子状态。历史结点只会应用到层次结构中其所在的层级。
在此示例中,灯可以打开或关闭。这些选项由 Power_on
和 Power_off
状态指示。这些选项由输入事件 switch_on
和 switch_off
控制。灯在打开时,可以呈暗淡或明亮。这些选项由状态 Low
和 High
指示,并由输入事件 switch_low
和 switch_high
控制。
最初,图处于休眠状态。状态 Power_off
处于激活状态。状态 Power_on
在上次激活时,High
是之前的激活子状态。事件 switch_on
发生,状态 Power_on
被标记为 entry。此时 p = 0
。
在按照进入图或状态的工作流执行动作直至图进入休眠状态的过程中,进入状态 Power_on
的执行步骤顺序如下:
Power_on
不是非激活父状态的子状态。Power_on
没有 entry 动作。Power_on
是之前被标记为 entry 的状态。有处于
Power_on
状态的历史结点。High
是之前的激活子状态。现在p = 2
。High
不包含任何历史结点。High
不包含任何默认转移。High
不包含任何子状态。图进入休眠状态。
这就完成了 Power_on
和 High
的 entry
动作。
通过使用超转移进入状态
超转移是图中不同层次之间的转移。超转移可以是顶层图中的状态与其一个子图中的状态之间的转移,也可以是位于图中相同或不同层次的不同子图中的状态之间的转移。您可以创建跨图中任意层数的超转移。
当通过超转移进入某状态时,在对最终目标执行 entry 动作之前,必须将它的父状态标记为激活状态,并且必须执行其 entry 动作。在此示例中,StateB1
被标记为 entry(转移源自 StateA2
)。此时,x = 5
,y = 5
且 z = 1
。
在按照进入图或状态的工作流执行动作直至图进入休眠状态的过程中,进入状态 StateB1
的执行步骤顺序如下:
StateB1
是非激活父状态 (StateB
) 的子状态。StateB
被标记为激活状态。StateB
不是非激活父状态的子状态。执行
StateB
的 entry 动作。现在x = 4
。StateB
不是最初被标记为 entry 的状态。执行
StateB1
的 entry 动作。现在x = 3
。StateB1
是之前被标记为 entry 的状态。StateB1
没有历史结点。StateB1
不包含任何默认转移。StateB1
不包含任何子状态。图进入休眠状态。
这就完成了 StateB
和 StateB1
的 entry
动作。