在HMI(人机界面)项目开发中,多画面切换时的变量传递是核心难点。如果处理不当,常导致数据显示错乱、控制失效或系统资源浪费。本文将以实用为导向,详解三种主流传递方法:全局变量法、参数化画面法与脚本传递法,并配合具体的操作步骤与逻辑解析。
方法一:全局变量法(基础必用)
这是最简单直接的方法,适用于所有HMI品牌(如西门子WinCC、威纶通、三菱GT等)。核心逻辑是:变量存储在PLC或HMI内部寄存器中,不随画面关闭而销毁,所有画面共享同一数据源。
操作步骤
- 建立 变量标签。在HMI软件的变量表中,新建一个变量,命名为
Motor_Speed,地址指向PLC的D100(或对应寄存器)。 - 配置 画面显示元件。在“主画面”中,拖入 一个数值显示元件,链接 变量
Motor_Speed。 - 重复 配置其他画面。切换 至“设置画面”,拖入 一个数值输入元件,同样 链接 变量
Motor_Speed。 - 验证 数据同步。当在“设置画面”修改
Motor_Speed的值时,PLC中的D100数据更新,“主画面”读取同一地址,数据实时同步。
优缺点分析
| 特性 | 说明 |
|---|---|
| 优点 | 配置简单,无需编程,实时性高,所有画面数据绝对一致。 |
| 缺点 | 变量数量庞大时,标签管理混乱;无法直接复用画面模板(例如控制10台电机需建10组变量)。 |
方法二:参数化画面法(高效复用)
当需要控制多台相同设备(如10台水泵)时,若为每台水泵单独制作画面,工作量巨大。参数化画面通过“传递索引号”实现“一个画面控制多设备”。
核心原理
使用一个“控制画面”作为模板,利用“画面索引变量”或“结构体变量”切换实际控制的设备地址。
操作步骤(以WinCC/通用HMI为例)
- 规划 地址分配。确保每台设备的控制地址连续或有规律。
- 水泵1启动:
M100.0 - 水泵2启动:
M100.1 - 水泵3启动:
M100.2 - 或者使用偏移量计算:基地址
M100,偏移量由索引决定。
- 水泵1启动:
- 创建 画面变量。在HMI内部建立一个内部变量
Current_Pump_Index(当前水泵索引),数据类型为Int。 - 设置 画面调用参数。
- 在主画面绘制“水泵1”按钮,设置 “按下事件”为
OpenScreen(打开画面)。 - 在参数设置中,指定 目标画面为“水泵控制模板画面”。
- 传递 参数:将参数值
1赋值 给变量Current_Pump_Index。
- 在主画面绘制“水泵1”按钮,设置 “按下事件”为
- 配置 模板画面元件。在“水泵控制模板画面”中:
- 放置 一个位状态指示灯。
- 地址 设置不直接写死,而是使用公式或指针:
- 地址表达式:
M[100 + Current_Pump_Index](伪代码示意)。 - 或使用“指针变量”功能,指定 基地址和索引变量。
- 地址表达式:
- 测试 效果。点击“水泵1”按钮,画面打开且
Current_Pump_Index为1,元件读取M101状态;点击“水泵2”按钮,画面刷新,元件读取M102状态。
地址偏移计算逻辑
若设备地址非连续位,而是字节或字偏移,需使用公式。
假设每台水泵占用2个字节的状态字,基地址为 VW100。
索引变量为 $Index$。
$$ Address = BaseAddress + (Index \times 2) $$
如果当前是第3台水泵(索引为3,从1开始计数),则实际地址为:
$$
Address = 100 + (3-1) \times 2 = 104
$$
元件应指向 VW104。
流程逻辑图
方法三:脚本传递法(灵活控制)
对于复杂的逻辑,如画面切换前需要保存当前设定、切换后需要初始化状态,单纯的链接无法满足,需使用脚本。
适用场景
数据校验、权限检查、多变量批量赋值、历史数据记录。
操作步骤(以VB Script为例)
- 打开 画面属性。在HMI工程树中,右键点击 目标画面,选择“属性”。
- 进入 事件脚本页。找到“On Open”(打开画面)或“On Close”(关闭画面)事件。
- 编写 初始化脚本。
- 需求:进入“参数设置”画面时,读取PLC当前设定值到临时缓存。
- 代码示例:
' 定义临时变量用于中转
Dim temp_SetValue
' 读取PLC变量值
temp_SetValue = SmartTags("PLC_Set_Value")
' 将值赋给画面内的局部显示变量 (假设为 Local_Display)
SmartTags("Local_Display") = temp_SetValue
- 编写 保存脚本。在画面关闭事件中:
' 校验数据范围
If SmartTags("Local_Display") > 100 Then
' 触发报警,不保存
ShowSystemAlarm("数值超限,保存失败")
Else
' 将修改后的值写回PLC
SmartTags("PLC_Set_Value") = SmartTags("Local_Display")
End If
关键语法规范
在编写脚本时,变量名必须与变量表完全一致。若涉及数组或变址寻址,需注意数组下标通常从 0 或 1 开始(视软件而定)。
进阶技巧:结构体变量传递
在处理大型项目(如污水处理厂,包含几十个相同的泵站)时,单独管理变量效率极低。结构体变量是最高效的解决方案。
实施步骤
- 定义 结构体类型。在数据类型中新建
Pump_Struct。- 包含成员:
Start(Bool),Stop(Bool),Speed(Int),Fault(Bool)。
- 包含成员:
- 声明 变量实例。在PLC和HMI变量表中,基于
Pump_Struct声明变量:Pump[1]Pump[2]- ...
Pump[20]
- 配置 画面变量窗口。HMI软件通常支持“变量窗口”或“结构体画面”。
- 绘制 画面,元件不指定具体变量,而是指定为“结构体变量”类型。
- 调用 时传递实例。
- 按钮脚本:
OpenScreen("Pump_Face", "Pump[5]")。 - 画面打开后,自动映射到
Pump[5]的所有成员。
- 按钮脚本:
常见故障排查
在实际调试中,若画面切换后数据不刷新或显示为 ???,请按以下顺序检查。
| 故障现象 | 可能原因 | 排查动作 |
|---|---|---|
| 数据显示不更新 | 变量地址冲突 | 检查 PLC程序中是否有双重输出,或HMI变量地址重叠。 |
数据显示为 ??? |
通信中断或地址错误 | 确认 通信线缆连接;核对 HMI变量地址是否超出PLC范围。 |
| 切换后数据归零 | 使用了局部变量 | 改用 全局变量或带断电保持属性的变量;检查 脚本是否误执行了清零指令。 |
| 参数画面数据错乱 | 索引计算错误 | 核对 偏移量公式;检查 索引变量是否在画面打开前已正确赋值。 |
推荐排查流程
通过以上三种方法,可覆盖绝大多数HMI画面切换需求。简单项目首选全局变量,多设备复用首选参数化画面,复杂逻辑首选脚本控制。

暂无评论,快来抢沙发吧!