3. HMI画面模板体系
在WinCC项目中,画面模板体系是决定项目可维护性的第一道分水岭。很多工程师在项目初期为了赶进度,习惯直接复制画面、逐个修改,结果到了调试阶段,一个公共按钮的样式调整就要改几十个画面。模板体系的核心思路是:把画面中重复出现的结构、公共元素和固定布局抽取出来,形成可被继承或引用的母版,让后续画面只关注自身独有的内容。
WinCC中真正可落地的模板体系通常由三类模板构成:主模板(Main Template)负责全局框架与公共操作区,弹出模板(Popup Template)负责参数设置、报警确认等临时交互,区域模板(Area Template)负责某一工艺段或设备单元的固定布局。三者不是并列关系,而是"全局—局部—瞬时"三个层次的配合。
主模板:把"永远不变"的部分固定下来
主模板承载的是整个项目所有画面都需要的公共元素:顶部标题栏(项目名、当前时间、登录用户)、底部状态栏(报警计数、通信状态)、左侧或顶部的导航按钮组,以及一个用于承载具体画面内容的画面窗口(Picture Window)。创建主模板的典型做法是新建一个名为 @MainTemplate.pdl 的画面,尺寸按目标分辨率设定,例如 1920×1080。在画面中放置一个画面窗口对象,命名为 PW_Content,其"画面名称"属性不写死,而是通过内部变量或脚本动态赋值。
导航按钮的实现不建议在每个按钮上写死"打开某画面",而是统一调用一个全局动作。例如按钮的鼠标点击事件中写入:
// 导航按钮统一动作(C 脚本)
#include "apdefap.h"
void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
char szTarget[64];
// 从按钮对象名解析目标画面,如 "btn_Overview" -> "Overview.pdl"
strcpy(szTarget, lpszObjectName + 4);
strcat(szTarget, ".pdl");
SetPictureName(lpszPictureName, "PW_Content", szTarget);
}
这样新增一个导航按钮只需复制按钮、改对象名,不需要改脚本。主模板的复用方式是:所有实际画面不再单独打开,而是通过主模板中的 PW_Content 窗口加载。项目运行时始终停留在主模板上,内容区随导航切换。这种"壳+内容"的结构,使公共元素只维护一份。
区域模板:同一工艺段的批量复用
区域模板针对的是"结构相同、变量不同"的场景。以水处理项目为例,有 4 台相同的提升泵 P-101~P-104,每台泵的画面都包含:设备位号、启停按钮、运行/故障指示灯、电流显示、累计运行时间。如果逐台画,工作量是 4 倍,且后期改一个指示灯颜色要改 4 处。
正确做法是先创建 @AreaTemplate_Pump.pdl,画面内所有对象的变量绑定都使用变量前缀方式。例如电流显示 I/O 域的变量填 @NOTPREFIX@Current,其中 @NOTPREFIX@ 是 WinCC 的变量前缀占位符。然后在主画面中放置 4 个画面窗口,分别设置其"变量前缀"属性为 P101_、P102_、P103_、P104_,画面名称都指向 @AreaTemplate_Pump.pdl。这样 4 台泵共用同一张模板画面,变量自动按前缀寻址。
设备_参数 的规则建立结构变量,例如 P101_Current、P101_Run,避免前缀拼写错误导致模板取不到值。弹出模板:临时交互的标准化
弹出模板用于参数设定、报警确认、操作二次确认等临时窗口。它的特点是:不占据主画面布局、用完即关、需要向调用方传递参数。创建 @Popup_Parameter.pdl 时,画面尺寸通常设为 400×300 左右,包含标题、输入区、确定/取消按钮。关键点在于参数传递:调用方在打开弹出窗口前,先把目标变量名或设备号写入一个内部变量,例如 g_PopupTag,弹出模板的输入框再通过脚本读取该变量完成绑定。
// 调用弹出模板(主画面按钮动作)
SetTagChar("g_PopupTag", "P101_Setpoint");
OpenPicture("@Popup_Parameter.pdl", "Popup", 0, 0, 400, 300);
// 弹出模板内确定按钮动作
char* pTag = GetTagChar("g_PopupTag");
SetTagFloat(pTag, GetTagFloat("g_PopupValue"));
ClosePicture("@Popup_Parameter.pdl", "Popup");
弹出模板的复用策略是"一个模板对应一类交互"。参数设定、报警确认、趋势查看可以各做一个弹出模板,而不是每个设备单独做。调用时只改变传入的变量名,模板本身不变。
三类模板的配合与维护边界
三类模板的职责边界需要明确,否则容易互相污染。主模板只放全局公共元素,不放任何工艺内容;区域模板只放某一类设备的固定布局,不放导航和全局状态;弹出模板只放临时交互,不放常驻显示。维护时遵循"改一处、影响一类"的原则:改主模板影响所有画面,改区域模板影响该工艺段所有设备,改弹出模板影响所有同类交互。
| 模板类型 | 典型文件 | 复用方式 | 修改影响范围 |
|---|---|---|---|
| 主模板 | @MainTemplate.pdl | 画面窗口加载内容 | 全部画面 |
| 区域模板 | @AreaTemplate_Pump.pdl | 变量前缀 + 多实例 | 同类设备全部画面 |
| 弹出模板 | @Popup_Parameter.pdl | 变量传递 + 动态调用 | 所有同类交互 |
@ 开头命名,并在项目浏览器中集中放在 @Templates 分组下。这样既能与普通工艺画面区分,也便于在项目归档和版本对比时快速定位。切勿在模板画面上直接绑定具体设备的绝对变量名,否则模板将失去复用价值。判断模板体系是否建立成功,有一个简单的检验方法:如果新增一台同类型设备,只需要复制一个画面窗口、改一个变量前缀,而不需要重新绘制任何图形元素,说明区域模板有效;如果调整一次公共按钮的样式,只需要改一个画面,说明主模板有效;如果新增一种参数设定需求,只需要复用已有弹出模板并传入新变量,说明弹出模板有效。模板体系的价值最终体现在项目后期的修改成本上,而不是初期的绘制速度。