文章目录

HMI多画面切换的变量传递方法

发布于 2026-03-24 19:03:28 · 浏览 8 次 · 评论 0 条

在HMI(人机界面)项目开发中,多画面切换时的变量传递是核心难点。如果处理不当,常导致数据显示错乱、控制失效或系统资源浪费。本文将以实用为导向,详解三种主流传递方法:全局变量法、参数化画面法与脚本传递法,并配合具体的操作步骤与逻辑解析。


方法一:全局变量法(基础必用)

这是最简单直接的方法,适用于所有HMI品牌(如西门子WinCC、威纶通、三菱GT等)。核心逻辑是:变量存储在PLC或HMI内部寄存器中,不随画面关闭而销毁,所有画面共享同一数据源。

操作步骤

  1. 建立 变量标签。在HMI软件的变量表中,新建一个变量,命名为 Motor_Speed,地址指向PLC的 D100(或对应寄存器)。
  2. 配置 画面显示元件。在“主画面”中,拖入 一个数值显示元件,链接 变量 Motor_Speed
  3. 重复 配置其他画面。切换 至“设置画面”,拖入 一个数值输入元件,同样 链接 变量 Motor_Speed
  4. 验证 数据同步。当在“设置画面”修改 Motor_Speed 的值时,PLC中的 D100 数据更新,“主画面”读取同一地址,数据实时同步。

优缺点分析

特性 说明
优点 配置简单,无需编程,实时性高,所有画面数据绝对一致。
缺点 变量数量庞大时,标签管理混乱;无法直接复用画面模板(例如控制10台电机需建10组变量)。

方法二:参数化画面法(高效复用)

当需要控制多台相同设备(如10台水泵)时,若为每台水泵单独制作画面,工作量巨大。参数化画面通过“传递索引号”实现“一个画面控制多设备”。

核心原理

使用一个“控制画面”作为模板,利用“画面索引变量”或“结构体变量”切换实际控制的设备地址。

操作步骤(以WinCC/通用HMI为例)

  1. 规划 地址分配。确保每台设备的控制地址连续或有规律。
    • 水泵1启动:M100.0
    • 水泵2启动:M100.1
    • 水泵3启动:M100.2
    • 或者使用偏移量计算:基地址 M100,偏移量由索引决定。
  2. 创建 画面变量。在HMI内部建立一个内部变量 Current_Pump_Index(当前水泵索引),数据类型为 Int
  3. 设置 画面调用参数。
    • 在主画面绘制“水泵1”按钮,设置 “按下事件”为 OpenScreen(打开画面)。
    • 在参数设置中,指定 目标画面为“水泵控制模板画面”。
    • 传递 参数:将参数值 1 赋值 给变量 Current_Pump_Index
  4. 配置 模板画面元件。在“水泵控制模板画面”中:
    • 放置 一个位状态指示灯。
    • 地址 设置不直接写死,而是使用公式或指针:
      • 地址表达式:M[100 + Current_Pump_Index](伪代码示意)。
      • 或使用“指针变量”功能,指定 基地址和索引变量。
  5. 测试 效果。点击“水泵1”按钮,画面打开且 Current_Pump_Index1,元件读取 M101 状态;点击“水泵2”按钮,画面刷新,元件读取 M102 状态。

地址偏移计算逻辑

若设备地址非连续位,而是字节或字偏移,需使用公式。

假设每台水泵占用2个字节的状态字,基地址为 VW100
索引变量为 $Index$

$$ Address = BaseAddress + (Index \times 2) $$

如果当前是第3台水泵(索引为3,从1开始计数),则实际地址为:
$$ Address = 100 + (3-1) \times 2 = 104 $$
元件应指向 VW104

流程逻辑图

graph TD A["点击设备按钮"] --> B{"传递索引号"} B -- "Index = 1" --> C["打开模板画面"] B -- "Index = 2" --> C C --> D["计算偏移地址"] D --> E["公式: 地址 = 基地址 + (索引 * 偏移量)"] E --> F["链接PLC变量"] F --> G["显示对应设备数据"]

方法三:脚本传递法(灵活控制)

对于复杂的逻辑,如画面切换前需要保存当前设定、切换后需要初始化状态,单纯的链接无法满足,需使用脚本。

适用场景

数据校验、权限检查、多变量批量赋值、历史数据记录。

操作步骤(以VB Script为例)

  1. 打开 画面属性。在HMI工程树中,右键点击 目标画面,选择“属性”。
  2. 进入 事件脚本页。找到“On Open”(打开画面)或“On Close”(关闭画面)事件。
  3. 编写 初始化脚本。
    • 需求:进入“参数设置”画面时,读取PLC当前设定值到临时缓存。
    • 代码示例:
' 定义临时变量用于中转
Dim temp_SetValue

' 读取PLC变量值
temp_SetValue = SmartTags("PLC_Set_Value")

' 将值赋给画面内的局部显示变量 (假设为 Local_Display)
SmartTags("Local_Display") = temp_SetValue
  1. 编写 保存脚本。在画面关闭事件中:
' 校验数据范围
If SmartTags("Local_Display") > 100 Then
    ' 触发报警,不保存
    ShowSystemAlarm("数值超限,保存失败")
Else
    ' 将修改后的值写回PLC
    SmartTags("PLC_Set_Value") = SmartTags("Local_Display")
End If

关键语法规范

在编写脚本时,变量名必须与变量表完全一致。若涉及数组或变址寻址,需注意数组下标通常从 01 开始(视软件而定)。


进阶技巧:结构体变量传递

在处理大型项目(如污水处理厂,包含几十个相同的泵站)时,单独管理变量效率极低。结构体变量是最高效的解决方案。

实施步骤

  1. 定义 结构体类型。在数据类型中新建 Pump_Struct
    • 包含成员:Start (Bool), Stop (Bool), Speed (Int), Fault (Bool)。
  2. 声明 变量实例。在PLC和HMI变量表中,基于 Pump_Struct 声明变量:
    • Pump[1]
    • Pump[2]
    • ...
    • Pump[20]
  3. 配置 画面变量窗口。HMI软件通常支持“变量窗口”或“结构体画面”。
    • 绘制 画面,元件不指定具体变量,而是指定为“结构体变量”类型。
  4. 调用 时传递实例。
    • 按钮脚本:OpenScreen("Pump_Face", "Pump[5]")
    • 画面打开后,自动映射到 Pump[5] 的所有成员。

常见故障排查

在实际调试中,若画面切换后数据不刷新或显示为 ???,请按以下顺序检查。

故障现象 可能原因 排查动作
数据显示不更新 变量地址冲突 检查 PLC程序中是否有双重输出,或HMI变量地址重叠。
数据显示为 ??? 通信中断或地址错误 确认 通信线缆连接;核对 HMI变量地址是否超出PLC范围。
切换后数据归零 使用了局部变量 改用 全局变量或带断电保持属性的变量;检查 脚本是否误执行了清零指令。
参数画面数据错乱 索引计算错误 核对 偏移量公式;检查 索引变量是否在画面打开前已正确赋值。

推荐排查流程

graph TD A["发现数据异常"] --> B{"数据是否显示?"} B -- "显示为 ???" --> C["检查通信与地址配置"] B -- "显示但数值错误" --> D["检查变量链接逻辑"] C --> E["通信正常?"] E -- "否" --> F["检查硬件接线与驱动"] E -- "是" --> G["修正地址范围"] D --> H{"是否使用参数化?"} H -- "是" --> I["校验索引与偏移量"] H -- "否" --> J["检查PLC逻辑赋值"] I --> K["修正计算公式"] J --> L["修正PLC程序"]

通过以上三种方法,可覆盖绝大多数HMI画面切换需求。简单项目首选全局变量,多设备复用首选参数化画面,复杂逻辑首选脚本控制。

评论 (0)

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

扫一扫,手机查看

扫描上方二维码,在手机上查看本文