主要内容

本页翻译不是最新的。点击此处可查看最新英文版本。

使用状态转移表对有限状态机建模

您可以使用 State Transition Table 模块针对顺序模态逻辑进行有限状态机建模。与 Stateflow® 图相比,当您添加或修改顶层 Simulink 模型时,状态转移表只需对图形对象进行极少的维护。

状态转移表编程

在状态转移表中,行表示系统中的状态。转移列为每个源自状态的出向转移指定条件、条件动作和目标状态。IF 列表示模型的主转移,ELSE-IF 列包含模型在主转移无效时执行的动作。您也可以使用追加转移列插入转移列选项添加附加列。

每个列单元格细分为三行。第一行是条件单元格,第二行是条件动作单元格,第三行是目标状态单元格。有关条件和条件动作的详细信息,请参阅定义转移中的动作

Diagram of state transition table highlighting state column, transition column, condition cell, condition action cell, and destination state cell.

例如,以下状态转移表包含将锅炉温度保持在两个设定值(reference_lowreference_high)之间的模态逻辑。在正常工作期间,锅炉在状态 OffWarmupOn 之间循环。

State transition table with two top-level states called Normal and Alarm. Normal has three substates called Off, Warmup, and On.

状态转移表表示与此 Stateflow 图相同的模态逻辑。

Stateflow chart with two top-level states called Normal and Alarm. Normal has three substates called Off, Warmup, and On.

有关此示例的详细信息,请参阅Model Bang-Bang Controller by Using a State Transition Table

创建状态转移表

要创建状态转移表,请执行以下操作:

  1. 通过调用参量为 -STT 的函数 sfnew,创建一个包含 State Transition Table 模块的 Simulink® 模型。

    sfnew -STT

  2. 双击 State Transition Table 模块。

    Block icon for state transition table.

  3. 对于系统中的每个工作模式,添加一个状态行。选择一个现有状态,然后在建模选项卡中选择以下选项之一:

    • 插入状态行 - 在层次结构中的同一层级添加状态。

    • 插入子状态行 - 添加一个状态作为所选状态的子状态。

      注意

      要移动状态行,请点击该状态的顶部边缘,并将该状态拖到新位置。拖动状态时,编辑器会显示图形提示,指示状态的新位置。

      要对同时处于激活状态的多个工作模式建模,请在父状态中启用并行 (AND) 分解。有关详细信息,请参阅用状态转移表仿真并行状态

  4. 为每个状态添加一个状态标签,如定义状态中的动作中所述。

  5. 要表示状态之间流程逻辑的方向,请为源于每个状态的出向转移指定条件、条件动作和目标。

    • 要添加转移列,请右键点击一个现有列的标题,并选择以下选项之一:

      • 追加转移列 - 在表的右侧添加转移列。

      • 插入转移列 - 在所选列的左侧添加转移列。

    • 要移动转移的条件、动作和目标单元格,请点击条件单元格的上边缘,并向左或向右拖动转移。条件、动作和目标单元格一起移动。

    • 要指定转移的目标,请在目标状态单元格中,选择状态的名称或以下选项之一:

      • $NEXT - 创建到下一个同级状态的转移。此选项不适用于状态层次结构的每个层级中的最后一个子状态。

      • $PREV - 创建到上一个同级状态的转移。此选项不适用于状态层次结构的每个层级中的第一个子状态。

      • $SELF - 创建自环转移。

    • 要注释掉转移,请在目标状态单元格中,选择 % IGNORE %

管理状态转移表中的同级状态和子状态

如果您的状态转移表包含多个同级状态,请标记当其父状态被激活时哪个同级状态应先变为激活状态。选择一个状态,然后在建模选项卡中,选择设置为默认状态

或者,要指定一个具有多个分支点的默认转移路径,请在建模选项卡中,选择插入默认转移行。例如,此默认转移行根据 condition 的值,在两个目标 A1A2 之间进行选择。

Default transition row with transitions to states A1 and A2.

此状态上的图标显示具有多个分支点的默认转移。

要指定从父状态到一个或多个子状态的内部转移,请在建模选项卡中选择插入内部转移行。例如,在此内部转移行中,输入事件 E 触发一个内部转移,该转移根据 condition1condition2 的值在两个目标 B1B2 之间进行选择。

Inner transition row with transitions to child states B1 and B2.

此状态上的图标显示具有多个分支点的内部转移。

在内部转移行中指定目标状态的顺序必须与表中对应子状态出现的顺序相同。例如,在前面的示例中,状态 B1 必须出现在状态 B2 的上方。

使用输入和输出端口将 State Transition Table 模块连接到 Simulink 模型中的其他模块。

用状态转移表仿真并行状态

在 Stateflow 中,您使用并行分解来使两个状态同时处于激活状态。例如,如果状态 A 使用并行分解并且有两个子状态 A1A2,则 A1A2 会同时激活。有关并行状态的详细信息,请参阅通过使用状态分解定义互斥和并行模式

要在 State Transition Table 模块中使用并行状态,请进入状态转移表。要在图级别更改分解,请不要选择状态,而是在建模选项卡中选择分解 > 并行(AND)。要进行状态并行分解,请选择一个状态,然后在建模选项卡中,选择分解 > 并行(AND)

注意

在将图或状态的分解更新为并行 (AND) 之前,您必须清空状态转移列中的所有单元格。

并行状态具有虚线轮廓。在此状态转移表中,stateA 有并行分解,因此其子状态 stateA1stateA2 带有虚线显示,并同时处于激活状态。

State transition table that shows parallel state decomposition.

检测状态转移表中的错误

要对状态转移表运行诊断检查,请在调试选项卡中,选择更新模型 > 更新表。诊断工具对表进行静态解析来查找类似下面这些错误:

  • 未解析的符号

  • 不可达状态

  • 没有无条件转移的默认转移行

  • 有条件或动作但没有目标的转移单元格

  • 条件单元格中出现的动作文本

  • 以不同于对应状态的顺序指定目标状态的内部转移行出现在表中

这些错误检查在仿真期间也会执行。有关调试状态转移表的详细信息,请参阅Debug Run-Time Errors in a State Transition Table

使用状态转移表的规范

  • 状态转移表可以使用 MATLAB® 或 C 语言作为动作语言。有关详细信息,请参阅使用 MATLAB 和 C 作为动作语言语法时的差异

  • 状态转移表必须有至少一个状态行和一个转移列。

  • 状态转移表不支持 Stateflow 图的以下元素:

    • 超转移

    • 局部事件

    • 图级别的图形函数、真值表函数、MATLAB 函数和 Simulink 函数

另请参阅

模块

函数

对象

主题