# 状态机建模环境


状态机是一种事件驱动的反应式系统,系统根据不同的条件在预定义的状态之间进行切换,适用于描述和控制系统的行为。

# 概述

状态机的基本组成部分包括:

状态 系统的工作模式
动作 状态内部或转移上编写的语句,用于定义在仿真期间状态机的行为。
转移条件 从一个状态转移到另一个状态的逻辑条件,满足转移条件时状态机会进行状态切换。

使用的所有条件和动作都应符合 Modelica 语法规范。

# 状态机模块库

状态机的编程环境主要通过 Sysblock 模块库中的 StateMachine 分类的模块实现,如下所示:

针对相关模块的模块功能说明如下:

模块 功能描述 典型用途 设计建议
Chart 表示状态机的整体逻辑容器,包含状态、转移、事件和图函数等元素。 用于建模系统的整体状态行为。 合理划分子图,确保图表逻辑清晰,避免图表过于复杂。
State 定义系统的特定状态,包含进入动作、持续动作和退出动作,可响应事件并触发转移。 描述系统的具体状态,如开机、待机、关机状态。 保持状态定义清晰独立,避免状态嵌套层级过深。
GraphFunction 封装复杂计算逻辑或特定行为的模块化组件,支持条件分支、输入输出和事件触发。 实现数据处理、计算逻辑或分支决策,例如计算传感器校准值或触发报警。 确保图函数职责单一,输入输出参数明确,并使用可复用的模块化设计。
Junction 图函数或状态图中的逻辑元素,包括入口节点、动作节点、条件分支节点和出口节点,用于组织执行逻辑。 表示具体逻辑步骤或条件判断,例如函数的开始、逻辑决策路径和结果输出。 避免冗余节点,保持节点间连接清晰,条件判断尽量简化。
HistoryJunction 记录和恢复复合状态(嵌套状态)的最近活动子状态,分为浅历史和深历史两种模式。 恢复上次活动状态,例如在暂停后返回任务状态时。 根据实际需求选择历史模式,避免误用导致意外行为,确保历史节点与复合状态配合使用。
DefaultTransition 定义当未触发其他转移时的默认路径,通常指向一个初始状态或特定状态。 指定状态机的初始状态或在异常情况下的转移路径,例如系统启动后默认进入待机状态。 每个状态图都应定义明确的缺省转移,避免状态机在未定义情况下无效运行。

# 建模流程

状态机的建模主要包含以下三个部分:

  • 模型搭建;
  • 数据管理;
  • 仿真/代码生成配置。

# 模型搭建

状态机的整体结构是层次化的,支持通过拖拽、移动、调整状态、节点、历史节点以及拖拽产生转移和默认状态来搭建复杂模型,如下所示:

# 转移线操作说明

转移线用于确定状态的转移关系,并通过转移条件来约束状态的转移成立条件。

如上所示,转移线的创建过程如下:

  1. 将鼠标悬停于状态框上,等待光标变为 + 号;
  2. 按住鼠标左键并拖动鼠标,引出一条转移线;
  3. 继续拖动鼠标,移动到另一个状态的边框上,松开鼠标或再次单击,建立两个状态的转移线,此时转移线条件默认为[true]

# 数据管理

通过状态机编辑界面管理数据,请参阅状态机变量设置

# 数据批量操作

状态机变量管理支持对变量的批量复制和粘贴功能,数据管理界面还是可以使用如下快捷键:

功能 快捷键
复制 Ctrl + C
粘贴 Ctrl + V
全选 Ctrl + A
取消全选 Ctrl + U
剪切 Ctrl + X
删除 Delete

在执行上述功能前,可通过 Shift 键或 Ctrl 键实现多选。需要注意的是,不支持框选操作。

# 仿真/代码生成配置

状态机模块的代码生成配置,请参阅状态机模块参数设置

# 状态管理

# 状态分解

状态/状态机内可以包含子状态/状态机,子状态之间的关系存在两种情况:

  • 互斥状态:状态之间存在转移,不能同时激活。
  • 并行状态:状态之间无转移,可同时激活,具体请参阅并行状态机搭建教程

子状态之间的关系必须和父状态保持一致,若父状态为互斥,则其内的子状态只能是互斥;若为并行,则子状态只能是并行。

该功能入口是状态机界面空白区域/状态模块的右键菜单内的状态分解,如下图所示。

# 转移状态

在状态机建模中,转移状态是关键概念之一,它决定了在某个状态条件满足时,状态机如何从当前状态转移到另一个状态。

转移状态不仅包括状态的切换,还涉及条件判断、动作执行等关键操作;详情请参阅转移状态编程使用教程,包含转移状态的语法定义、执行顺序,以及在建模中需要注意的事项。

# 相关主题

# 基础说明

# 使用说明

# 进阶使用