# 状态机变量设置
介绍状态机输入输出变量的定义、配置和使用方式,并通过示例解决如何合理设置这些变量。
在状态机设计中,输入输出变量的设置是实现状态机功能的基础。输入变量用于接收外部信号或事件,驱动状态的转换;输出变量则用于反映状态机的行为或与外部系统交互。
# 基本概念
输入(
Input)变量- 触发状态转移或影响状态的外部数据来源,如传感器信号、用户输入、系统事件等。
输出(
Output)变量- 状态机对外输出的信息,常用于表示当前状态或触发外部动作。
参数(
Parameter)变量- 状态机运行时的配置值,用于影响状态机的行为。参数变量在运行时通常不可修改,其值在初始化阶段由外部系统设置。
常量(
Constant)- 状态机内部定义的固定值,在整个运行期间保持不变。通常用于表达逻辑中的不变条件或标识符。
局部(
Local)变量- 状态机内部的临时变量,用于存储中间数据或状态逻辑的辅助信息。
# 变量范围总结对比表
| 变量类型 | 定义位置 | 作用范围 | 是否可修改 | 数据来源 | 用途 |
|---|---|---|---|---|---|
Input | 外部模块或系统 | 全局(状态机外部输入) | 否 | 外部信号或事件 | 驱动状态转移 |
Output | 状态机内部 | 全局(状态机对外输出) | 是 | 状态机逻辑 | 表示当前状态、触发外部行为 |
Paramter | 外部配置或初始化 | 全局(全生命周期有效) | 否 | 外部配置 | 影响状态机行为 |
Constant | 状态机内部定义 | 全局(设计时定义) | 否 | 设计时固定值 | 表示常量或标识符 |
Local | 状态或过度逻辑内部 | 局部(特定状态有效) | 是 | 状态机内部定义 | 临时存储中间值,辅助状态转换 |
# 管理界面
状态机变量管理界面分为对话框和面板两种形式,在管理界面定义状态机中使用到的所有变量,是状态机正常运行的基础。
# 状态机变量对话框
状态机建模界面的空白处右击,右键菜单中选择编辑状态机变量,打开状态机变量对话框。
# 状态机变量面板
状态机建模界面选中建模-状态机变量,打开状态机变量面板。
此窗口主要分为三栏:
组件栏
可以选择组件进行变量定义,在状态机中定义的变量及事件,所有状态及转移线都能使用,在状态栏上定义的变量仅此状态及其子状态可用。
状态机中需要进行输入、输出的变量及事件必须定义在状态机层。
操作栏
从左到右的功能点依次为:
| 功能点 | 功能说明 |
|---|---|
| 添加变量 | 在变量与事件栏中新增一个变量 |
| 新建事件 | 在变量与事件栏中新增一个事件 |
| 删除变量 | 在变量与事件栏中选择条目后才可使用,效果为移除选中的条目 |
| 检索框 | 在检索框内输入字符后,变量与事件栏中将只显示“范围”和“名称”中包含此字符串的条目 |
| 上层显示 | 切换状态机变量窗口是/否保持在最上层显示 |
变量与事件栏
变量与事件可设置项为:
| 设置项 | 功能说明 | 可选项说明 |
|---|---|---|
| 范围 | 指定变量的作用范围。 | - Input:输入变量,每定义一个输入变量,chart 模块就会多一个输入接口,并将输入端口接收到的数据赋值给对应的变量。 - Output:输出变量,每定义一个输出变量,chart 模块就会多一个输出接口,并将对应的变量以此端口输出。 - Parameter:参数变量,可以在整个模型(不局限于状态机)中使用。 - Constant:常数变量。 - Local:局部变量,只能在状态机中使用的变量。 |
| 名称 | 指定设置项对应的变量名,状态机语句中需引用相应的变量名才能生效。 | / |
| 值 | 指定变量的初始值,即仿真开始时的值。 | / |
| 类型 | 指定变量的数据类型。 | - 浮点型:float/double - 整数型:uint8/uint16/uint32、int8/int16/int32 - 布尔型:boolean - 定点型:fixdt(1,16,0) |
| 维度 | 指定变量的数据维度。 | - 标量:填 "[]" 即可。 - 数组:以 "[n]" 形式输入,其中 n 表示数组的元素个数,如包含 3 个元素的数组 {1,2,3} 的维度为 [3]。 - 矩阵:以 "[m,n]" 形式输入,其中 m 表示矩阵行数,n 表示矩阵列数,如两行三列矩 { {1,2,3},{4,5,6}} 维度为 [2,3]。 |
| 触发方式 | - 输入变量的触发方式:触发时输入变量相当于值为 true 的布尔值,支持作为转移条件。 - 事件的触发方式:事件触发的时机。 | - 输入变量:rising(变量从 0 或负值变为正值)falling(变量从 0 或正值变为负值)either(在任一方向发生过 0 变化); - 输入事件: rising(上升沿触发) falling(下降沿触发) either(上升或下降沿触发) functionCall(函数触发); - 输出事件:either(上升或下降沿触发) functionCall(函数触发); - 局部事件:默认为 functionCall(函数触发),不提供编辑操作。 |
| 端口 | 指定 Input/Output 类型变量所暴露接口的顺序,输入端口与输出端口的排序相互独立。 | 备注:编号为 1 的端口显示在最上端,然后按端口索引顺序递增排列。 |
# 注意事项
状态机中使用的所有变量及事件,必须在状态机变量管理界面中全部定义,是状态机正确执行的基础。
确定变量名称具有清晰的含义,并根据作用范围选择合适的类型。
仅定义必要的变量,减少重复数据的传递或存储。
合理使用局部变量和全局变量,避免不必要的全局变量污染。
所有变量在使用前应初始化,确保数据一致性与正确性。