使用状态转移表以表格形式表达时序逻辑
State Transition Table 模块以表格形式表示顺序模态逻辑的有限状态机。除了在 Stateflow® 图中绘制状态和转移这种方式,您还可以使用状态转移表,以简洁、紧凑的格式对状态机进行建模,而且只需对图对象进行极少的维护。
在状态转移表中,行表示系统中的状态。转移列为每个源自状态的出向转移指定条件、条件动作和目标状态。
例如,以下状态转移表包含将锅炉温度保持在两个设定值(reference_low
和 reference_high
)之间的模态逻辑。在正常工作期间,锅炉在状态 Off
、Warmup
和 On
之间循环。
状态转移表表示与此 Stateflow 图相同的模态逻辑。
有关此示例的详细信息,请参阅Model Bang-Bang Controller by Using a State Transition Table。
状态转移表编程
要创建 State Transition Table,请执行下列步骤:
通过调用函数
sfnew
,创建一个包含 State Transition Table 模块的 Simulink® 模型。sfnew -STT
双击 State Transition Table 模块。
对于系统中的每个工作模式,添加一个状态行并输入状态标签,如定义状态中的动作中所述。要组织复杂的系统,请通过在父状态行下添加子状态行来定义状态的层次结构。
要添加状态行,请选择一个现有状态,然后在建模选项卡中选择以下选项之一:
插入状态行 - 在层次结构中的同一层级添加状态。
插入子状态行 - 添加一个状态作为所选状态的子状态。
要移动状态行,请点击该状态的顶部边缘,并将该状态拖到新位置。拖动状态时,编辑器会显示图形提示,指示状态的新位置。
要对同时处于激活状态的多个工作模式建模,请在父状态中启用并行 (AND) 分解。有关详细信息,请参阅用状态转移表仿真并行状态。
要表示状态之间流程逻辑的方向,请为源于每个状态的出向转移指定条件、条件动作和目标。
要添加转移列,请右键点击一个现有列的标题,并选择以下选项之一:
追加转移列 - 在表的右侧添加转移列。
插入转移列 - 在所选列的左侧添加转移列。
要移动转移的条件、动作和目标单元格,请点击条件单元格的上边缘,并向左或向右拖动转移。条件、动作和目标单元格作为一个单元整体移动。
要指定转移的目标,请在目标状态单元格中,选择状态的名称或以下选项之一:
$NEXT - 创建到下一个同级状态的转移。此选项不适用于状态层次结构的每个层级中的最后一个子状态。
$PREV - 创建到上一个同级状态的转移。此选项不适用于状态层次结构的每个层级中的第一个子状态。
$SELF - 创建自环转移。
要注释掉转移,请在目标状态单元格中,选择 % IGNORE %。
在层次结构的每个级别,当父状态被激活时,将第一个状态标记为激活。选择一个状态,然后在建模选项卡中,选择设置为默认状态。
或者,要指定一个具有多个分支点的默认转移路径,请在建模选项卡中,选择插入默认转移行。例如,此默认转移行根据
condition
的值,在两个目标A1
和A2
之间进行选择。要指定从父状态到一个或多个子状态的内部转移,请在建模选项卡中选择插入内部转移行。例如,在此内部转移行中,输入事件
E
触发一个内部转移,该转移根据condition1
和condition2
的值在两个目标B1
和B2
之间进行选择。在内部转移行中指定目标状态的顺序必须与表中对应子状态出现的顺序相同。例如,在前面的示例中,状态
B1
必须出现在状态B2
的上方。如果您的系统有输入或输出,或依赖于任何状态变量,请添加输入、输出和局部数据,如添加 Stateflow 数据中所述。
如果您的系统对事件触发器作出反应,或必须在您模型的图或其他模块中触发动作,请添加输入和输出事件,如通过广播事件同步模型组件中所述。
使用输入和输出端口将 State Transition Table 模块连接到 Simulink 模型中的其他模块。
要仿真该模型,请点击运行。在仿真期间,状态转移表会突出显示激活状态和转移。
用状态转移表仿真并行状态
在 Stateflow 中,使用并行分解的状态的子状态会同时激活。例如,如果状态 A 使用并行分解并且有两个子状态 A1
和 A2
,则 A1
和 A2
会同时激活。有关并行状态的详细信息,请参阅通过使用状态分解定义互斥和并行模式。
要在 State Transition Table 模块中使用并行状态,请进入状态转移表。要在图级别更改分解,请进入状态转移表,但不要选择任一状态。在建模选项卡中,选择分解 > 并行(AND)。要对状态进行并行分解,请选择要更改其分解的状态。在建模选项卡中,选择分解 > 并行(AND)。
注意
在将图或状态的分解更新为并行 (AND) 之前,状态转移列中的所有单元格都必须清空。
并行状态具有虚线轮廓,表示它们会同时激活。
检测状态转移表中的错误
要对状态转移表运行诊断检查,请在调试选项卡中,选择更新模型 > 更新表。诊断工具对表进行静态解析来查找类似下面这些错误:
未解析的符号
不可达状态
没有无条件转移的默认转移行
有条件或动作但没有目标的转移单元格
条件单元格中出现的动作文本
以不同于对应状态的顺序指定目标状态的内部转移行出现在表中
这些错误检查在仿真期间也会执行。有关调试状态转移表的详细信息,请参阅Debug Run-Time Errors in a State Transition Table。
指定状态转移表的属性
状态转移表属性指定状态转移表如何与 Simulink 模型对接。您可以在属性检查器、模型资源管理器或“状态转移表”属性对话框中修改这些属性。
要使用属性检查器,请执行以下操作:
打开 State Transition Table 模块。
在建模选项卡的设计数据下,选择属性检查器。
在属性检查器中,编辑状态转移表属性。
要使用模型资源管理器,请执行以下操作:
在建模选项卡的设计数据下,选择模型资源管理器。
在模型层次结构窗格中,选择状态转移表。
在对话框窗格中,编辑状态转移表属性。
要使用“状态转移表”属性对话框,请执行以下操作:
打开 State Transition Table 模块。
在建模选项卡中,点击表属性。
在属性对话框中,编辑状态转移表属性。
您还可以通过使用 Stateflow.StateTransitionTableChart
对象以编程方式修改状态转移表属性。有关 Stateflow 编程接口的详细信息,请参阅 Overview of the Stateflow API。
提示
状态转移表属性是 Stateflow 图属性的子集。有关每个属性的描述,请参阅指定 Stateflow 图的属性。
使用状态转移表的规范
状态转移表可以使用 MATLAB® 或 C 语言作为动作语言。有关详细信息,请参阅使用 MATLAB 和 C 作为动作语言语法时的差异。
状态转移表必须有至少一个状态行和一个转移列。
状态转移表不支持 Stateflow 图的以下元素:
超转移
局部事件
图级别的图形函数、真值表函数、MATLAB 函数和 Simulink 函数