内存节点
页面进行中。 |
在文章中阅读更多关于父和子状态的信息 状态机的层次结构. |
历史交汇点 它只能位于州内。 不正确的位置会给出错误。: |
历史交汇点 记录父状态内部子状态的活动。 当父状态首次变为活动状态时,状态机使用 默认转换 来确定哪个子状态变为活动状态。 但是,如果父状态变为非活动状态,然后重新激活,则内存节点允许您返回到最后一个活动子状态,绕过默认转换。
例如,有一个自动门,它可以只有两个子状态—打开和关闭。 父状态将是"Door_Activity"状态,这对于子状态是通用的。 我们得到以下有限自动机的模型:
-
当状态机第一次切换到Door_Activity状态时,默认情况下会激活Closed状态;
-
如果门打开,然后系统暂时关闭(切换到"非活动"状态,即Door_Activity的父状态将停止为活动状态),则内存节点记住打开状态。;
-
当Door_Activity状态被重新激活时,门自动返回到Open状态,而不是Closed,就像没有memory节点一样。
历史交汇点 作为内部过渡
历史交汇点 它可以用作内部通道。
内部转换是有限自动机状态层次结构中的一种机制,允许您从当前状态移动到其子状态之一,而无需转到更高级别。 此转换在父状态激活时自动执行,可以是无条件的,也可以依赖于某些条件。
从父状态的帧到子状态创建内部转换,但在我们的情况下,它将转到内存节点。:
这种转换作为每个子状态的自循环。 当满足内部转换条件时,状态机暂时退出活动子状态,然后立即返回到它。 这允许您通过执行所有相关操作(例如, 运算符组'期间’和’开')。 因此,存储器节点作为内部转换,有助于管理转换,同时保持系统的当前状态。
让我们来看看到内存节点的内部转换是如何工作的。 要做到这一点,让我们想象下面的模型与父状态*A*和两个子状态—A1*和*A2。 模型将没有内存节点和内部转换的条件:
从状态*A*到*A1*的内部转换无条件地执行,即每次激活状态*A*时。 这使得在不使用内存节点的情况下无法访问*A2*状态。 有限状态机的这样一个模型将根据以下逻辑工作:
有限状态机在没有内存节点和条件的模型中的逻辑_
-
激活*Chart*块,启动模型状态机的操作:
-
1. 过渡到*a状态*;
-
2. 激活*a状态*;
-
3. 过渡到*A1状态*;
-
4. 激活*A1状态*;
-
5. 图表*和状态*A,*A1*入睡。
-
-
*图表*和活动状态*A*正在唤醒:
-
1. 运算符`during`和`on’的组被执行(如果有的话);
-
2. 停用*A1状态*;
-
3. 激活*A1状态*;
-
4. 图表*块和状态*A,*A1*睡着了。
-
-
返回步骤2,重复循环。
现在让我们添加一个条件(时间逻辑运算符 每个)关于内部过渡:
添加条件后,状态*A*到*A1*的转换将仅在唤醒状态*A*时执行。 对于奇数唤醒,发生转变*A1*→A2,对于偶数,发生转变*A2*→A1。 因此,模型将按照以下逻辑工作:
有限状态机在没有具有条件的内存节点的模型中的逻辑_
-
激活*Chart*块,启动模型状态机的操作:
-
1. 过渡到*a状态*;
-
2. 激活*a状态*;
-
3. 过渡到*A1状态*;
-
4. 激活*A1状态*;
-
5. 图表*和美国*A,*A1*入睡。
-
-
Chart*块和活动状态*A*正在唤醒(唤醒#1,3,5。.. 国家*A):
-
1. 过渡*A1→A2正在进行中*;
-
2. 停用*A1状态*;
-
3. 激活*A2状态*;
-
4. 图表*块和状态*A,*A2*睡着了。
-
-
Chart*块和活动状态*A*正在唤醒(唤醒#2,4,6。.. 国家*A):
-
1. `During`和`on’运算符组被执行(如果有的话);
-
2. 内部过渡条件被触发(觉醒是偶数),并且它被满足;
-
3. 停用*A2状态*;
-
4. 激活*A1状态*;
-
5. 图表*和状态*A,*A1*入睡。
-
-
返回步骤2,重复循环。
现在让我们考虑一个在内部结点上有一个内存节点的模型。 此外,我们添加了一个时间逻辑运算符。 after和另一个外部状态,如图所示:
回想一下,内存节点在内部转换上的任务是记住最后一个活动子状态,并在满足条件时返回到它。 然后模型将按照以下逻辑工作:
具有内存节点和条件的模型中的有限状态机的逻辑_
-
激活*Chart*块,启动模型状态机的操作:
-
1. 过渡到*a状态*;
-
2. 激活*a状态*;
-
3. 过渡到*A1状态*;
-
4. 激活*A1状态*;
-
5. 图表*和状态*A,*A1*入睡。
-
-
*图表*和活动状态*A*唤醒(状态*A*的第一次觉醒):
-
1. 过渡*A1→A2正在进行中*;
-
2. 停用*A1状态*;
-
3. 激活*A2状态*;
-
4. 历史交汇点 记住*A2的状态*;
-
5. 图表*和状态*A,*A2*入睡。
-
-
图表*和活动状态*a*唤醒(第二次唤醒状态*A):
-
1. 运算符`during`和`on’的组被执行(如果有的话);
-
2. 内部过渡到存储器节点的条件被触发,并且在存储状态*A2中执行*;
-
3. 停用*A2状态*;
-
4. 激活*A2状态*;
-
5. 历史交汇点 记住*A2的状态*;
-
6. 图表*和状态*A,*A2*入睡。
-
-
图表*唤醒(状态的第三次觉醒*A):
-
1. 触发转换条件*A→B*,执行;
-
2. 停用*A2状态*;
-
3. 停用*a状态*;
-
4. 激活*B状态*;
-
5. *图表*和*B*状态入睡。
-
-
*图表*醒来:
-
1. 进行无条件转换*B→A*;
-
2. 激活*a状态*;
-
3. 存储状态的激活*A2*;
-
4. 历史交汇点 记住*A2的状态*;
-
5. 图表*和状态*A,*A2*入睡。
-
-
图表,A*和*a2*唤醒(第一次唤醒*A):
-
1. 历史交汇点 记住*A2的状态*;
-
2. 图表,*A*和*A2*入睡。
-
-
返回步骤3,重复循环。
因此,到内存节点的内部转换允许您暂时退出当前子状态,并在满足转换条件时返回到该状态。 在父状态下执行’during’和`on’语句组后立即发生这种情况。 历史交汇点 记住最后一个活动的子状态,帮助过渡管理.
具有内部转换和没有内部转换的内存节点之间的主要区别如下:
|