Engee 文档

状态机层次结构

使用具有嵌套状态的状态机(SM)在模型中创建层次结构:

  • 父状态*是包含一个或多个子状态(称为子状态)的状态。当父状态被激活时,子状态会发生默认转换。然后,子状态按照通常的逻辑 运行,直到父状态不再激活为止;

  • 子状态*是位于父状态内部的状态。

embedded state 1 1

状态可以相互嵌套,但不能重叠。如果重叠,就会产生错误(红色感叹号),说明状态不能重叠:

chart error 1

所有嵌套状态都遵守以下规则:

  • 每个嵌套层级都可能有一个默认转换,但这不是强制性条件。如果状态是单一的,则可能没有默认转换。顶层状态和嵌套状态都是如此。

  • 状态没有嵌套深度限制。进入一个状态时,Engee 会自动检测它是否嵌套:

    • 有嵌套状态—​默认为子状态。然后,只要父状态处于活动状态,状态机逻辑就会应用于子状态。

    • 无嵌套状态—​应用状态机逻辑。

并行状态

*并行状态*是有限自动机的一组状态stateflow state ,它们之间没有父子兄弟关系,可以在自动机的一个时钟周期内同步激活、保持激活或停用。

然而,为了理解这些状态如何在单个自动机中并行运行(没有父系-同胞关系),必须考虑分解的概念。对一个状态进行分解后,我们就可以指定激活、执行和停用其子状态的策略:

  • 排除(OR)--默认情况下使用,用状态边界实线表示。在这种模式下,同一时刻(自动机时钟)只能有一个子状态处于激活状态。例如

    parallel state 2

    在这里,状态 A 激活后,其子状态 B 自动变为激活状态。与此同时,C 状态仍处于非激活状态。如果自动机从 B 切换到 C,则 B 被停用,C 进入激活状态。这种机制便于模拟相互排斥的运行模式,例如 "开"/"关 "或 "加热"/"冷却"。


  • Parallel (AND) (并联)-- 用虚线表示子状态,允许在一个自动机周期内激活所有嵌套状态。在这种情况下,各状态按编号顺序依次执行动作。例如

    parallel state 3

    当状态 A 被激活时,其子状态 BC 也会在一个自动机周期内被激活,并按照编号顺序(B 第一,C 第二)依次执行动作。它们各自独立运行,便于模拟并行过程,例如系统的一部分控制温度,另一部分控制压力。这种方法不需要默认过渡到子状态,因为系统会按照编号顺序激活并行状态。


什么情况下应使用*平行状态*?在以下情况下可以使用并行状态

  • 有限自动机模型需要同时执行多个独立进程;

  • 需要将模型结构简化为独立的逻辑部分。

要更改分解类型,请右键单击状态并选择 分解 → 并行/排除

parallel states 1

分解程度

如果在同一状态下同时使用并发子状态和排他子状态,它们会形成不同的分解级别。举个例子

decomposition levels 1

  1. 在启动时,有限自动机进入具有并行分解的状态 A。这意味着其子状态 BC 也被激活。

  2. 然而,状态 C 本身是状态 C1C2 的父级,并形成了一个新的分解层。在这个层次上,状态 C 已经具有排他性(OR)分解,因此在任何给定时间内,其子状态(C1C2)中只能有一个处于激活状态。

  3. 子状态 C1C2 反过来再次使用并行分解,因此它们的嵌套状态在同一时间处于活动或非活动状态(自动机时钟的精度)。

只要符合有限自动机的逻辑,这种层级交替可以重复多次。

同一层级的所有子级状态必须与父级状态的分解相对应。分解层由 "父态-子态 "连接在一个层次上的一次迭代定义。

并行状态的编号

有限自动机中的每个并行状态都有一个优先级编号,该编号决定了其执行顺序。编号越小,状态执行的时间越早。优先级编号显示在每个并行状态的右上角:

parallel state num

如果模型是从零开始创建的,或者还没有并行状态,系统会按照添加并行状态的顺序自 动分配优先级编号。编号从父状态中的第一个可用编号开始。

要更改并行状态的执行顺序,请执行以下操作

  1. 右键单击并行状态。

  2. 单击 "执行顺序 "并选择新的优先级编号。

parallel state num 1

限制条件

虽然并行状态非常有用,但也有一些限制:

  • 没有入站或出站转换 - 你不能直接从平行状态或向平行状态创建转换;

  • 无默认转换或超级转换 - 平行状态中不使用[默认转换]。 默认过渡不用于并行状态。此外,也不能创建超级过渡脚注:[超级过渡 - 跨越块状态边界的过渡。例如,它可以连接互不相关的不同父状态的嵌套状态]。

  • 禁止使用内存节点内存结点stateflow history junction (历史结点)不能直接放在并行分解(AND)状态内。这是因为它们是独立运行的,恢复它们之前的状态需要各自单独的机制。

有用链接