Engee 文档

内存节点

页面进行中。

历史结点*(History Junction)stateflow history junction有限状态机 *Engee*的一个元素,它捕捉父状态内子状态stateflow state 的状态,以便在重新激活时返回到上一个活动状态。

有关父态和子态的更多信息,请参阅文章状态机层次结构

内存节点只能位于状态内部。位置不正确会产生错误:

stateflow history junction 1

记忆节点记录父状态中子状态的活动。当父态首次激活时,有限自动机使用default transitionstateflow default transition 来决定哪个子态成为激活状态。但是,如果父态处于非活动状态,然后又重新活跃起来,记忆节点允许绕过默认转换,返回到上一个活跃的子态。

例如,一扇自动门只有两种可能的子状态:"打开 "和 "关闭"。父状态将是 "Door_Activity"(门的活动)状态,它与子状态是共通的。我们可以得到以下有限自动机模型:

stateflow history junction 2

  1. 当有限自动机首次进入 Door_Activity 状态时,默认激活的是 Closed 状态;

  2. 如果门被打开("Open"),然后系统暂时关闭(过渡到 "非激活 "状态,即父 "Door_Activity "状态不再激活),则记忆节点会记住 "Open "状态;

  3. 当重新激活 Door_Activity 状态时,门会自动恢复到 "打开 "状态,而不是没有记忆节点时的 "关闭 "状态。

记忆节点作为内部转换

内存节点可用作内部转换。

*内部转换*是有限自动机状态层次结构中的一种机制,它允许从当前状态转到其子状态,而无需转到上一层。这种转换在父状态被激活时自动执行,可以是无条件的,也可以取决于某些条件。

从父状态框架到子状态的内部转换是创建的,但在我们的案例中,它将转到内存节点:

internal transition sm

这种过渡对每个子状态都是一个循环(自循环)。当内部过渡条件满足时,有限自动机暂时离开活动子状态,然后立即返回。这样就可以通过执行所有相关操作(如操作符组 duringon)来重新激活状态。因此,作为内部过渡的内存节点有助于管理过渡,同时保持系统的当前状态。

让我们来看看内存节点的内部转换是如何工作的。为此,我们假设下面的模型有一个父状态 A,两个子状态 A1A2。模型中没有内存节点,内部转换也没有条件:

internal transition sm 1

从状态 AA1 的内部转换是无条件的,即每次状态 A 被激活时都会发生内部转换。因此,如果不使用记忆节点,就无法到达状态 A2。这样一个有限自动机模型将按照以下逻辑运行:

没有记忆节点和条件的模型中有限自动机的运行逻辑_。
  1. 激活*Chart*模块,启动模型的有限自动机:

  2. Chart 和活动状态 A 醒来:

  3. 返回第 2 点,重复循环。

现在,让我们在内部转换上添加一个条件(时态逻辑运算符):

internal transition sm 2

添加条件后,从状态 AA1 的转换只有在状态 A 每第二次唤醒时才会发生。奇数唤醒时,A1A2*发生转换,偶数唤醒时,*A2 → *A1*发生转换。因此,该模型将按照以下逻辑运行:

无条件记忆节点模型中有限自动机的运行逻辑_。
  1. 激活 Chart 块,启动模型的有限自动机:

  2. 图块 Chart 和活动状态 A 唤醒(状态 A 的唤醒编号 1、3、5…​…​):

  3. Chart 块和活动状态 A 唤醒(A 状态的 2 号、4 号、6 号…​…​唤醒):

  4. 返回第 2 点,重复循环。

现在考虑一个内部转换上有内存节点的模型。此外,让我们添加时态逻辑运算符after 和另一个外部状态,如图所示:

internal transition sm 3

回想一下,内部转换处的记忆节点的任务是记住最后一个活动的子状态,并在条件满足时 返回该状态。那么,模型将按照以下逻辑运行:

带有记忆节点和条件的模型中有限自动机的运行逻辑_。
  1. 激活 Chart 块,启动模型的有限自动机:

  2. Chart 和活动状态 A 唤醒(状态 A 的第一次唤醒):

  3. Chart 和活动状态 A 醒来(状态 A 第二次醒来):

  4. *图表*醒来(状态*A*的第三次觉醒):

  5. Chart 醒来:

  6. 、*A*和*A2*醒来(*A*第一次醒来):

  7. 返回第 3 点,重复循环。

因此,向内存节点的内部转换允许暂时退出当前子状态,如果转换条件满足,则返回子状态。这将在父状态的 duringon 操作符组执行后立即发生。内存节点会记住上次活动的子状态,从而有助于过渡管理。

有内部转换和没有内部转换的内存节点的主要区别如下:

  • 不带内部转换*的内存节点只是记住最后的活动状态,并在重新进入父状态时恢复该状态。

  • 有内部转换*的内存节点只有在满足转换条件时才会激活记忆中的状态,而且是在父状态的 "during "和 "on "语句组执行后立即激活。


  • 无内部转换*的存储节点是被动运行的—​只有当父状态被重新激活时,它才会恢复状态。

  • 有内部转换*的存储节点是主动的—​如果转换条件为真,它允许暂时离开当前状态并返回存储状态。


  • 无内部转换*的记忆节点可以放置在状态的任何位置(包括子状态),其运行与转换无关。

  • 有内部转换*的记忆节点与特定的转换绑定,只有在执行转换时才会被激活。

实用链接