# 状态机建模环境
状态机是一种事件驱动的反应式系统,系统根据不同的条件在预定义的状态之间进行切换,适用于描述和控制系统的行为。
# 概述
状态机的基本组成部分包括:
| 状态 | 系统的工作模式 |
|---|---|
| 动作 | 状态内部或转移上编写的语句,用于定义在仿真期间状态机的行为。 |
| 转移条件 | 从一个状态转移到另一个状态的逻辑条件,满足转移条件时状态机会进行状态切换。 |
使用的所有条件和动作都应符合 Modelica 语法规范。
# 状态机模块库
状态机的编程环境主要通过 Sysblock 模块库中的 StateMachine 分类的模块实现,如下所示:
针对相关模块的模块功能说明如下:
| 模块 | 功能描述 | 典型用途 | 设计建议 |
|---|---|---|---|
| Chart | 表示状态机的整体逻辑容器,包含状态、转移、事件和图函数等元素。 | 用于建模系统的整体状态行为。 | 合理划分子图,确保图表逻辑清晰,避免图表过于复杂。 |
| State | 定义系统的特定状态,包含进入动作、持续动作和退出动作,可响应事件并触发转移。 | 描述系统的具体状态,如开机、待机、关机状态。 | 保持状态定义清晰独立,避免状态嵌套层级过深。 |
| GraphFunction | 封装复杂计算逻辑或特定行为的模块化组件,支持条件分支、输入输出和事件触发。 | 实现数据处理、计算逻辑或分支决策,例如计算传感器校准值或触发报警。 | 确保图函数职责单一,输入输出参数明确,并使用可复用的模块化设计。 |
| Junction | 图函数或状态图中的逻辑元素,包括入口节点、动作节点、条件分支节点和出口节点,用于组织执行逻辑。 | 表示具体逻辑步骤或条件判断,例如函数的开始、逻辑决策路径和结果输出。 | 避免冗余节点,保持节点间连接清晰,条件判断尽量简化。 |
| HistoryJunction | 记录和恢复复合状态(嵌套状态)的最近活动子状态,分为浅历史和深历史两种模式。 | 恢复上次活动状态,例如在暂停后返回任务状态时。 | 根据实际需求选择历史模式,避免误用导致意外行为,确保历史节点与复合状态配合使用。 |
| DefaultTransition | 定义当未触发其他转移时的默认路径,通常指向一个初始状态或特定状态。 | 指定状态机的初始状态或在异常情况下的转移路径,例如系统启动后默认进入待机状态。 | 每个状态图都应定义明确的缺省转移,避免状态机在未定义情况下无效运行。 |
# 建模流程
状态机的建模主要包含以下三个部分:
- 模型搭建;
- 数据管理;
- 仿真/代码生成配置。
# 模型搭建
状态机的整体结构是层次化的,支持通过拖拽、移动、调整状态、节点、历史节点以及拖拽产生转移和默认状态来搭建复杂模型,如下所示:
# 转移线操作说明
转移线用于确定状态的转移关系,并通过转移条件来约束状态的转移成立条件。
如上所示,转移线的创建过程如下:
- 将鼠标悬停于状态框上,等待光标变为 + 号;
- 按住鼠标左键并拖动鼠标,引出一条转移线;
- 继续拖动鼠标,移动到另一个状态的边框上,松开鼠标或再次单击,建立两个状态的转移线,此时转移线条件默认为
[true]。
# 数据管理
通过状态机编辑界面管理数据,请参阅状态机变量设置。
# 数据批量操作
状态机变量管理支持对变量的批量复制和粘贴功能,数据管理界面还是可以使用如下快捷键:
| 功能 | 快捷键 |
|---|---|
| 复制 | Ctrl + C |
| 粘贴 | Ctrl + V |
| 全选 | Ctrl + A |
| 取消全选 | Ctrl + U |
| 剪切 | Ctrl + X |
| 删除 | Delete |
在执行上述功能前,可通过 Shift 键或 Ctrl 键实现多选。需要注意的是,不支持框选操作。
# 仿真/代码生成配置
状态机模块的代码生成配置,请参阅状态机模块参数设置。
# 状态管理
# 状态分解
状态/状态机内可以包含子状态/状态机,子状态之间的关系存在两种情况:
- 互斥状态:状态之间存在转移,不能同时激活。
- 并行状态:状态之间无转移,可同时激活,具体请参阅并行状态机搭建教程。
子状态之间的关系必须和父状态保持一致,若父状态为互斥,则其内的子状态只能是互斥;若为并行,则子状态只能是并行。
该功能入口是状态机界面空白区域/状态模块的右键菜单内的状态分解,如下图所示。
# 转移状态
在状态机建模中,转移状态是关键概念之一,它决定了在某个状态条件满足时,状态机如何从当前状态转移到另一个状态。
转移状态不仅包括状态的切换,还涉及条件判断、动作执行等关键操作;详情请参阅转移状态编程使用教程,包含转移状态的语法定义、执行顺序,以及在建模中需要注意的事项。