3、HMI软件架构:组态软件与运行时环境、工程文件结构、变量与标签系统
好,咱们今天聊聊HMI的软件架构。很多人觉得HMI就是个画图工具,拖几个按钮,连几个变量就完事了。其实不然。你想想看,一个工业现场跑着几十上百台设备,HMI要是三天两头死机、变量对不上、工程文件打不开,那现场工程师非得骂娘不可。
我做了十几年HMI项目,踩过的坑不少。今天就把这些经验掰开了揉碎了讲给你听。咱们从三个维度来拆解:组态软件与运行时环境、工程文件结构、变量与标签系统。
3.1 组态软件与运行时环境
先说组态软件。说白了,这就是你用来画界面、配变量、写逻辑的那个工具。比如西门子的WinCC、施耐德的Vijeo Designer、还有国产的组态王、力控等等。
组态软件干三件事:
- 界面设计:拖拽控件,画流程图,做报警画面
- 变量配置:定义标签,关联PLC地址,设置数据类型
- 逻辑编写:写脚本,做数据转换,搞配方管理
但组态软件本身不能直接跑在工业现场。它生成的是一个工程文件,这个文件要交给运行时环境来执行。
运行时环境是什么?就是HMI设备上那个“跑工程”的程序。它负责:
- 解析工程文件里的画面和逻辑
- 跟PLC、变频器这些底层设备通信
- 刷新界面显示,响应用户操作
关键点:组态软件和运行时环境是分离的。你在电脑上装的是组态软件,HMI设备里装的是运行时。两者版本必须匹配,否则工程文件打不开或者运行异常。
我记得有一次,现场工程师打电话说HMI启动后黑屏。我远程一看,好家伙,他用WinCC V7.4组态的工程,下装到只装了V7.3运行时的设备上。这不黑屏才怪。所以啊,版本匹配是第一条铁律。
我的习惯:每次新建工程前,先确认目标设备的运行时版本。然后在组态软件里设置好目标版本,再开始干活。省得后面折腾。
3.2 工程文件结构
一个HMI工程文件,看着就是一个文件夹或者一个压缩包。但里面的门道不少。我拆开给你看。
典型的工程文件结构长这样:
MyHMIProject/
├── HmiRT/ # 运行时配置文件
│ ├── HmiRT.ini # 运行时参数
│ └── HmiRT.log # 运行日志
├── HmiPrj/ # 工程源文件
│ ├── Screens/ # 画面文件
│ │ ├── MainScreen.xml
│ │ ├── AlarmScreen.xml
│ │ └── TrendScreen.xml
│ ├── Tags/ # 变量定义文件
│ │ ├── GlobalTags.xml
│ │ └── LocalTags.xml
│ ├── Scripts/ # 脚本文件
│ │ ├── Startup.vbs
│ │ └── Cycle.vbs
│ └── Resources/ # 资源文件
│ ├── Images/
│ └── Fonts/
├── HmiData/ # 运行时数据
│ ├── AlarmLog.db # 报警数据库
│ └── DataLog.db # 数据记录
└── Project.xml # 工程主配置文件
每个文件夹都有它的职责:
- HmiRT:存放运行时需要的配置。比如启动画面、通信参数、语言设置。这个文件夹一般不动它,除非你要调底层参数。
- HmiPrj:这是你干活的地方。画面、变量、脚本都在这里。注意,有些组态软件把画面存成XML格式,有些是二进制格式。XML的好处是可以用文本编辑器打开,方便做版本对比。
- HmiData:运行时产生的数据。报警记录、历史趋势、操作日志都存这里。这个文件夹会随着时间越来越大,所以要做好存储空间规划。
避坑指南:我曾经遇到一个项目,现场HMI频繁死机。查了半天,发现是HmiData文件夹里的日志文件太大,把存储空间撑爆了。从那以后,我每个项目都会设置日志文件的最大大小和自动清理策略。
工程文件结构还有一个重要概念——分层管理。我个人习惯把工程分成三层:
- 基础层:全局变量、通信驱动、系统设置。这一层基本不动。
- 业务层:画面、脚本、报警、趋势。这是日常维护的重点。
- 数据层:历史数据、操作记录。这一层要关注存储和备份。
为什么要分层?因为现场维护的时候,你不可能每次都把整个工程重新编译一遍。分层之后,改个画面只需要更新业务层,基础层和数据层不受影响。效率高很多。
3.3 变量与标签系统
变量,也叫标签(Tag),是HMI和PLC之间的桥梁。没有变量,HMI就是个空壳子。
变量系统的核心要素:
| 要素 | 说明 | 示例 |
|---|---|---|
| 变量名 | 唯一标识,建议用有意义的英文 | Motor1_Speed |
| 数据类型 | 决定变量能存什么值 | Bool, Int, Real, String |
| 地址 | PLC中的存储位置 | DB1.DBD0 |
| 采集周期 | 多久从PLC读一次 | 100ms, 500ms, 1s |
| 初始值 | HMI启动时的默认值 | 0, False, "" |
变量类型分两种:
- 全局变量:整个工程都能访问。适合放设备状态、工艺参数这些公共数据。
- 局部变量:只在某个画面或脚本里有效。适合放临时计算值、界面状态。
我建议你尽量用全局变量。为什么?因为局部变量一旦画面关闭,值就丢了。现场调试的时候,你切个画面回来,发现变量值没了,那得多闹心。
变量命名规范:我见过最乱的工程,变量名叫“a1”、“b2”、“test123”。三个月后连他自己都看不懂。我的规范是:
- 设备类型_功能_序号:如 Pump1_Status, Valve2_Open
- 全部用英文,不要用拼音
- 长度不超过32个字符
- 禁止使用特殊字符(除了下划线)
变量地址映射这块,容易出问题。PLC里的地址是DB1.DBD0,HMI里要配成一样的。但不同品牌的PLC,地址格式不一样。西门子是DB1.DBD0,罗克韦尔是B3:0,三菱是D100。你想想看,要是配错了,HMI读到的数据就是乱的。
我曾经在一个项目里,把两个变量的地址写反了。结果HMI上显示的温度值,实际上是压力值。现场操作员看着温度曲线异常,差点把设备给停了。还好发现得早,不然损失就大了。
我的做法:每次配完变量,我都会做一个“地址回读测试”。在PLC里强制一个值,看HMI上能不能正确显示。这个测试花不了几分钟,但能避免大麻烦。
变量采集周期也要注意。不是越快越好。你想想看,一个画面里有100个变量,每个都设成100ms采集一次,那通信负载就大了。PLC那边可能都来不及响应。
我的建议:
- 关键变量(急停、报警)设100ms
- 普通变量(温度、压力)设500ms
- 慢变变量(累计量、配方)设1s以上
最后说一个容易被忽略的点——变量归档。HMI运行久了,变量值会变化。但你要是想查三天前的某个值,没有归档就抓瞎了。所以,重要的变量一定要做历史记录。归档周期可以设长一点,比如1分钟一次,既节省存储空间,又能追溯数据。
嗯,关于HMI软件架构,今天就聊这么多。组态软件和运行时环境是基础,工程文件结构是骨架,变量与标签系统是血脉。这三样搞明白了,你的HMI项目就成功了一半。
下一章咱们聊聊画面设计,那可是HMI的“脸面”。