内存节点
页面进行中。 |
有关父态和子态的更多信息,请参阅文章状态机层次结构 。 |
内存节点只能位于状态内部。位置不正确会产生错误: |
记忆节点记录父状态中子状态的活动。当父态首次激活时,有限自动机使用default transition 来决定哪个子态成为激活状态。但是,如果父态处于非活动状态,然后又重新活跃起来,记忆节点允许绕过默认转换,返回到上一个活跃的子态。
例如,一扇自动门只有两种可能的子状态:"打开 "和 "关闭"。父状态将是 "Door_Activity"(门的活动)状态,它与子状态是共通的。我们可以得到以下有限自动机模型:
-
当有限自动机首次进入 Door_Activity 状态时,默认激活的是 Closed 状态;
-
如果门被打开("Open"),然后系统暂时关闭(过渡到 "非激活 "状态,即父 "Door_Activity "状态不再激活),则记忆节点会记住 "Open "状态;
-
当重新激活 Door_Activity 状态时,门会自动恢复到 "打开 "状态,而不是没有记忆节点时的 "关闭 "状态。
记忆节点作为内部转换
内存节点可用作内部转换。
*内部转换*是有限自动机状态层次结构中的一种机制,它允许从当前状态转到其子状态,而无需转到上一层。这种转换在父状态被激活时自动执行,可以是无条件的,也可以取决于某些条件。
从父状态框架到子状态的内部转换是创建的,但在我们的案例中,它将转到内存节点:
这种过渡对每个子状态都是一个循环(自循环)。当内部过渡条件满足时,有限自动机暂时离开活动子状态,然后立即返回。这样就可以通过执行所有相关操作(如操作符组 during
和 on
)来重新激活状态。因此,作为内部过渡的内存节点有助于管理过渡,同时保持系统的当前状态。
让我们来看看内存节点的内部转换是如何工作的。为此,我们假设下面的模型有一个父状态 A,两个子状态 A1 和 A2。模型中没有内存节点,内部转换也没有条件:
从状态 A 到 A1 的内部转换是无条件的,即每次状态 A 被激活时都会发生内部转换。因此,如果不使用记忆节点,就无法到达状态 A2。这样一个有限自动机模型将按照以下逻辑运行:
没有记忆节点和条件的模型中有限自动机的运行逻辑_。
-
激活*Chart*模块,启动模型的有限自动机:
-
Chart 和活动状态 A 醒来:
-
返回第 2 点,重复循环。
现在,让我们在内部转换上添加一个条件(时态逻辑运算符每):
添加条件后,从状态 A 到 A1 的转换只有在状态 A 每第二次唤醒时才会发生。奇数唤醒时,A1 → A2*发生转换,偶数唤醒时,*A2 → *A1*发生转换。因此,该模型将按照以下逻辑运行:
无条件记忆节点模型中有限自动机的运行逻辑_。
-
激活 Chart 块,启动模型的有限自动机:
-
图块 Chart 和活动状态 A 唤醒(状态 A 的唤醒编号 1、3、5……):
-
Chart 块和活动状态 A 唤醒(A 状态的 2 号、4 号、6 号……唤醒):
-
返回第 2 点,重复循环。
现在考虑一个内部转换上有内存节点的模型。此外,让我们添加时态逻辑运算符after 和另一个外部状态,如图所示:
回想一下,内部转换处的记忆节点的任务是记住最后一个活动的子状态,并在条件满足时 返回该状态。那么,模型将按照以下逻辑运行:
带有记忆节点和条件的模型中有限自动机的运行逻辑_。
-
激活 Chart 块,启动模型的有限自动机:
-
Chart 和活动状态 A 唤醒(状态 A 的第一次唤醒):
-
Chart 和活动状态 A 醒来(状态 A 第二次醒来):
-
*图表*醒来(状态*A*的第三次觉醒):
-
Chart 醒来:
-
图、*A*和*A2*醒来(*A*第一次醒来):
-
返回第 3 点,重复循环。
因此,向内存节点的内部转换允许暂时退出当前子状态,如果转换条件满足,则返回子状态。这将在父状态的 during
和 on
操作符组执行后立即发生。内存节点会记住上次活动的子状态,从而有助于过渡管理。
有内部转换和没有内部转换的内存节点的主要区别如下:
|