Engee 文档

内存节点

页面进行中。

历史交汇点 stateflow history junction —这是一个元素 状态机 Engee,捕捉孩子的状态 国家 stateflow state 父状态内,从而在重新激活时,返回到最后一个激活状态。

在文章中阅读更多关于父和子状态的信息 状态机的层次结构.

历史交汇点 它只能位于州内。 不正确的位置会给出错误。:

stateflow history junction 1 cn

历史交汇点 记录父状态内部子状态的活动。 当父状态首次变为活动状态时,状态机使用 默认转换 stateflow default transition 来确定哪个子状态变为活动状态。 但是,如果父状态变为非活动状态,然后重新激活,则内存节点允许您返回到最后一个活动子状态,绕过默认转换。

例如,有一个自动门,它可以只有两个子状态—打开和关闭。 父状态将是"Door_Activity"状态,这对于子状态是通用的。 我们得到以下有限自动机的模型:

stateflow history junction 2

  1. 当状态机第一次切换到Door_Activity状态时,默认情况下会激活Closed状态;

  2. 如果门打开,然后系统暂时关闭(切换到"非活动"状态,即Door_Activity的父状态将停止为活动状态),则内存节点记住打开状态。;

  3. 当Door_Activity状态被重新激活时,门自动返回到Open状态,而不是Closed,就像没有memory节点一样。

历史交汇点 作为内部过渡

历史交汇点 它可以用作内部通道。

内部转换是有限自动机状态层次结构中的一种机制,允许您从当前状态移动到其子状态之一,而无需转到更高级别。 此转换在父状态激活时自动执行,可以是无条件的,也可以依赖于某些条件。

从父状态的帧到子状态创建内部转换,但在我们的情况下,它将转到内存节点。:

internal transition sm

这种转换作为每个子状态的自循环。 当满足内部转换条件时,状态机暂时退出活动子状态,然后立即返回到它。 这允许您通过执行所有相关操作(例如, 运算符组'期间’和’开')。 因此,存储器节点作为内部转换,有助于管理转换,同时保持系统的当前状态。

让我们来看看到内存节点的内部转换是如何工作的。 要做到这一点,让我们想象下面的模型与父状态*A*和两个子状态—A1*和*A2。 模型将没有内存节点和内部转换的条件:

internal transition sm 1

从状态*A*到*A1*的内部转换无条件地执行,即每次激活状态*A*时。 这使得在不使用内存节点的情况下无法访问*A2*状态。 有限状态机的这样一个模型将根据以下逻辑工作:

有限状态机在没有内存节点和条件的模型中的逻辑_
  1. 激活*Chart*块,启动模型状态机的操作:

    1. 1. 过渡到*a状态*;

    1. 2. 激活*a状态*;

    1. 3. 过渡到*A1状态*;

    1. 4. 激活*A1状态*;

    1. 5. 图表*和状态*A,*A1*入睡。

  2. *图表*和活动状态*A*正在唤醒:

    1. 1. 运算符`during`和`on’的组被执行(如果有的话);

    1. 2. 停用*A1状态*;

    1. 3. 激活*A1状态*;

    1. 4. 图表*块和状态*A,*A1*睡着了。

  3. 返回步骤2,重复循环。

现在让我们添加一个条件(时间逻辑运算符 每个)关于内部过渡:

internal transition sm 2

添加条件后,状态*A*到*A1*的转换将仅在唤醒状态*A*时执行。 对于奇数唤醒,发生转变*A1*→A2,对于偶数,发生转变*A2*→A1。 因此,模型将按照以下逻辑工作:

有限状态机在没有具有条件的内存节点的模型中的逻辑_
  1. 激活*Chart*块,启动模型状态机的操作:

    1. 1. 过渡到*a状态*;

    1. 2. 激活*a状态*;

    1. 3. 过渡到*A1状态*;

    1. 4. 激活*A1状态*;

    1. 5. 图表*和美国*A,*A1*入睡。

  2. Chart*块和活动状态*A*正在唤醒(唤醒#1,3,5。.. 国家*A):

    1. 1. 过渡*A1→A2正在进行中*;

    1. 2. 停用*A1状态*;

    1. 3. 激活*A2状态*;

    1. 4. 图表*块和状态*A,*A2*睡着了。

  3. Chart*块和活动状态*A*正在唤醒(唤醒#2,4,6。.. 国家*A):

    1. 1. `During`和`on’运算符组被执行(如果有的话);

    1. 2. 内部过渡条件被触发(觉醒是偶数),并且它被满足;

    1. 3. 停用*A2状态*;

    1. 4. 激活*A1状态*;

    1. 5. 图表*和状态*A,*A1*入睡。

  4. 返回步骤2,重复循环。

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

internal transition sm 3

回想一下,内存节点在内部转换上的任务是记住最后一个活动子状态,并在满足条件时返回到它。 然后模型将按照以下逻辑工作:

具有内存节点和条件的模型中的有限状态机的逻辑_
  1. 激活*Chart*块,启动模型状态机的操作:

    1. 1. 过渡到*a状态*;

    1. 2. 激活*a状态*;

    1. 3. 过渡到*A1状态*;

    1. 4. 激活*A1状态*;

    1. 5. 图表*和状态*A,*A1*入睡。

  2. *图表*和活动状态*A*唤醒(状态*A*的第一次觉醒):

    1. 1. 过渡*A1→A2正在进行中*;

    1. 2. 停用*A1状态*;

    1. 3. 激活*A2状态*;

    1. 4. 历史交汇点 记住*A2的状态*;

    1. 5. 图表*和状态*A,*A2*入睡。

  3. 图表*和活动状态*a*唤醒(第二次唤醒状态*A):

    1. 1. 运算符`during`和`on’的组被执行(如果有的话);

    1. 2. 内部过渡到存储器节点的条件被触发,并且在存储状态*A2中执行*;

    1. 3. 停用*A2状态*;

    1. 4. 激活*A2状态*;

    1. 5. 历史交汇点 记住*A2的状态*;

    1. 6. 图表*和状态*A,*A2*入睡。

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

    1. 1. 触发转换条件*A→B*,执行;

    1. 2. 停用*A2状态*;

    1. 3. 停用*a状态*;

    1. 4. 激活*B状态*;

    1. 5. *图表*和*B*状态入睡。

  5. *图表*醒来:

    1. 1. 进行无条件转换*B→A*;

    1. 2. 激活*a状态*;

    1. 3. 存储状态的激活*A2*;

    1. 4. 历史交汇点 记住*A2的状态*;

    1. 5. 图表*和状态*A,*A2*入睡。

  6. 图表A*和*a2*唤醒(第一次唤醒*A):

    1. 1. 历史交汇点 记住*A2的状态*;

    1. 2. 图表,*A*和*A2*入睡。

  7. 返回步骤3,重复循环。

因此,到内存节点的内部转换允许您暂时退出当前子状态,并在满足转换条件时返回到该状态。 在父状态下执行’during’和`on’语句组后立即发生这种情况。 历史交汇点 记住最后一个活动的子状态,帮助过渡管理.

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

  • 历史交汇点 *没有内部转换*只需记住最后一个活动状态,并在重新进入父状态时恢复它。

  • 历史交汇点 *使用内部转换*仅在满足转换条件时激活存储状态,并且在执行父状态的`during`和`on`运算符组后立即发生这种情况。


  • 历史交汇点 *没有内部转换*被动工作-它仅在父状态重新激活时恢复状态。

  • 历史交汇点 *与内部转换*活动-它允许您暂时退出当前状态,并返回到记住的一个,如果转换条件为真。


  • 历史交汇点 *没有内部转换*可以放置在状态中的任何位置(包括子状态),并且无论转换如何,它都可以工作。

  • 历史交汇点 *具有内部过渡*链接到特定的过渡,并且只有在完成后才被激活。

有用的连结