Engee 文档

状态机运算符组

*操作组*是在状态内启动模型操作的条件。

sf state 1 new

操作符组用于需要配置更复杂的模型行为时。有关操作员组背后逻辑的更多信息,请参阅有限自动机逻辑

操作符组只支持 Julia 语言操作,并可包含以任意顺序交错排列的多个部分。例如

during: du1
entry: en1
during: du2

在这种情况下,当状态被激活时,将执行代码`entry: en1`。此后,在状态保持激活状态的每个后续步骤中,将执行以 du1; du2 表示的 during 运算符组的组合代码。这意味着,`du1`和`du2`将被合并并按顺序执行,就像它们在一个`during`中连接在一起一样。

可以使用操作符组的简短名称 — du 表示 during, en 表示 entry, ex 表示 exit(并将它们合并)。操作符组名称 duringentryexit 可以用逗号分隔:

sf x 1

枚举时,重要的是不要重复使用同一个词。一个*不正确*列举的例子:

en, during, entry: foobar

状态块中的 Julia 代码可以是多行的,并一直持续到在行首遇到 entryduringexiton 关键字为止。例如

during:
    if x > 10
        y = 1
    else
        y = 2
    end
exit: y = 3
无操作符组的状态代码在状态激活时和状态保持激活时的每一步都会被执行。因此,它结合了 "进入 "和 "期间 "部分的动作特征,但不包括与停用状态相关的逻辑(如 "退出 "部分)。

进入组

进入 "用于定义进入状态时执行的操作。每次状态激活时,都会执行 entry 中指定的操作。

期间

用于定义如果状态处于活动状态,在模型计算步骤的每一步(第一步除外)执行的操作。当状态处于活动状态时,将执行在 during 中指定的操作。

组退出

exit` - 用于定义退出状态时执行的操作。这些操作会在状态变为非活动时执行一次,并在启动退出该状态的所有转换操作完成后发生。退出状态后,"期间 "操作符不再被执行,因为状态不再处于活动状态。例如,有如下有限自动机:

exit order

在这里,有限自动机将在第一步激活状态 "A",并在第二步按以下顺序执行动作:

y2 = 2
y1 = 1
y3 = 3

小组

on - 当指定的操作在活动状态下发生时执行。操作符组 on 允许在状态内使用时间逻辑。例如

stateflow on after 2

在这里

  • on after(5, sec) 指定从第 5 秒开始执行(也会在 6 秒、7 秒等之后执行)。

  • y = 0 指定将变量 y 设为 0

运算符组的操作逻辑

在状态机中,转换和 entryduringexiton 操作符组的操作顺序如下:

操作符组执行逻辑类型

进入

期间

退出

执行顺序

进入 "在状态激活时执行,即在有限自动机进入新状态时执行。这一步发生在执行任何其他运算符组之前。在这一步不执行`during`。

只要状态保持激活,during 就会在有限自动机的每一步执行。但是,如果在当前步中发生了状态退出,during 不会被执行。

在退出当前状态之前会执行 exit,结束其活动。执行`exit`后,一个新的状态被激活,`entry`会立即被执行。

如果当前状态处于激活状态,则在满足给定条件(如时态逻辑)时激活 on

激活功能

entry 可用于初始化变量、设置参数或执行任何其他必要的操作,以便为当前状态下的操作做好准备。

during`可用于执行定期检查、更新变量值或执行重复计算。

exit`可用于在退出状态前重置变量值或完成计算。

on`允许整合时间逻辑元素,这样就可以确定何时应在状态中执行操作。

与转换的交互

只有在成功过渡到新状态时,entry 才会被激活。如果没有发生状态转换,则不执行 entry 语句组;

在执行 during 部分之前,状态机可能会检查状态转换的条件。如果满足了过渡条件,则根本不开始执行 during 中的操作,而是继续执行当前状态的 exit

只有当过渡条件成功满足时,exit 才会被激活,并准备过渡到新的状态。如果没有过渡,则不执行 exit 语句。

on`语句只在当前激活状态下运行。如果满足了过渡到新状态的条件,过渡会在 on 开始执行之前发生。过渡结束后,on 将不再执行。然而,与在每一步(除了第一步)都执行的 during 不同,on 只在条件(时态逻辑运算符)为真的那一步执行。

实用链接