ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

水厂WinCC组态画面设计与变量规划实战指南

水厂WinCC组态画面设计与变量规划实战指南

简介:面向工业自动化工程师与SCADA入门学习者,这套WinCC水厂监控画面组态资源源自实际项目,覆盖两个蓄水池与六个水井的实时监控,能帮助理解西门子WinCC在供水场景下的画面设计、数据绑定与报警逻辑。文件共470个,约191MB,以rpl、pdl、sav、mdf等类型为主,分别对应过程画面、归档数据、项目备份与数据库文件,另附脚本、配置文件,目录组织清晰。目前已有1771人学习下载。将项目导入WinCC环境后,可查看水位、压力、温度、pH值等关键参数的图形化展示,学习用模拟表、柱状图、趋势控件、报警窗口搭建人机界面;还能参考自定义脚本,理解水位过低自动补水、压力过高关阀等控制逻辑以及与PLC的通信配置,对快速上手水厂监控组态、理解整套项目结构、提升实际工程调试效率很有价值。

1. 水厂WinCC画面是什么:一份能少走三个月弯路的组态素材

做水厂自动化项目,最耗时间的往往不是PLC程序,而是WinCC组态画面。水厂工艺段多、泵阀多、报警点多,画面上每一项都要跟现场信号对得上。这份“水厂制作的wincc画面”是一套面向实际水厂监控场景的组态画面参考,覆盖取水泵房、加药间、沉淀池、滤池、清水池和送水泵房的完整工艺页面,设备状态、实时趋势、报警记录和操作按钮都按运行人员的习惯排好了。拿到手不用从空白页面开始拼,照着流程改变量名就能挂到自己的PLC点表上。适合正在做水厂/污水厂上位机项目的新手工程师,也适合需要在短时间内交图的系统集成人员——先看懂别人怎么搭,再改成自己的,远比从零折腾高效。

2. 画面结构拆解:总览、工艺段与操作页怎么分层

2.1 三层结构:为什么不能把所有设备塞进一张图

WinCC组态画面最怕“一张图画全厂”。我之前见过一个项目,把所有泵、阀门、仪表堆在同一个页面里,变量三四十个,运行起来画面刷新慢,操作按钮常常要点两三次才有反应。水厂项目的画面必须分层,这套素材同样按“全厂总览—工艺段—设备操作”三层展开:总览层给值班员扫屏,判断全厂是否正常;工艺段层给日常巡检和操作;设备操作层给单台设备的启停、参数修改和故障复位。层级越往下,信息越细,操作许可要求也越高。

典型的页面划分如下表,页面命名方式也建议保持一致,方便后续用脚本统一跳转:

页面分类典型页面主要对象用途
总览层PIC_MAIN.PDL全厂工艺流程、主要设备状态、关键指标中控大屏默认停留页
工艺段PIC_INTAKE.PDL取水泵组、格栅、进水流量取水段监视
工艺段PIC_DOSING.PDL加药泵、搅拌机、pH/浊度仪表加药控制
工艺段PIC_FILTER.PDL滤池阀组、滤后液位过滤段巡检
工艺段PIC_CLEARWATER.PDL清水池液位、出水流量、余氯送水前水质监视
设备页PIC_PUMP01.PDL单泵启停、电流、运行时间单台泵操作
公共页PIC_TREND.PDL关键参数趋势曲线历史数据分析
公共页PIC_ALARM.PDL报警列表、报警确认故障排查

2.2 单页布局:顶部、左侧、中间和底部四块怎么定

每张画面打开之前,先定尺寸。操作员站分辨率的基准一般用 1920×1080,如果现场只有 1366×768 的屏,画面做等比缩放显示,不能整体拉抻,否则管线对不齐、文字错位。画面尺寸在图形编辑器的页面属性里设,几何尺寸和背景色都提前定好。

一套可维护的水厂画面通常切成四块区域。顶部标题栏:放当前页面名称、系统时间和当前登录用户。左侧导航栏:放全厂总览、各工艺段、趋势曲线、报警记录的切换按钮。中间一块是工艺图区,管道、设备、仪表都画在这里。底部留一条报警滚动状态栏,任何页面都能看到最新报警。这样分区以后,值班员不用来回翻页面找报警。

绘制工艺对象时尽量用WinCC图形编辑器自带的矩形、圆形、线条来组合,不要直接把网络找来的位图贴在背景上。位图放大后发虚,而且后期想改一个阀门颜色会非常痛苦。管道颜色按行业惯例统一:生活给水管用蓝色,加药管用黄色,污水管用灰色。素材里已经按这个规范做了,接手的人一看颜色就知道介质类型。

2.3 公共框架:用画面窗口把导航做一次

导航栏如果每个页面复制一遍,后面加一个新页面就要同步改十几个文件,容易漏。我在项目里通常用画面窗口做公共框架:主框架页面里放两个画面窗口,一个放导航,一个放内容区。切换页面时只切换内容区的显示内容,导航窗口保持不动。

具体步骤是:新建一个 PIC_MAIN.PDL 作为主框架页,在左侧放一个画面窗口对象,指向导航页;中间放一个大的画面窗口对象,指向默认工艺页。导航页里的按钮只调用页面切换函数,把中间的内容窗口切到对应工艺画面。这样加新页面时,只需要做一个新内容页并在导航页里加一个按钮,不需要动其他页面。这套素材里的公共导航方式也基本一致,拿到后先打开主框架页看几个窗口的嵌套关系,再开始改。

3. 变量与点位规划:让画面上的每个数都落在真实PLC点位上

3.1 点表先行:外部变量与内部变量分开管理

WinCC变量分两类:外部变量和内部变量。外部变量连接PLC或通信驱动,画面上看到的水位、电流、泵状态都属于外部变量;内部变量不连PLC,只存中间结果,比如界面上的确认标记、临时计算值、按钮互锁标志。变量全部堆在一起肯定乱,规范做法是把外部变量按工艺段和信号类型命名,内部变量统一加 HMI_ 前缀。

这里给出一张水厂典型点表的样例,实际信号名和PLC地址按自己项目替换:

信号用途WinCC变量名PLC地址(示意)数据类型采集周期
泵运行反馈CW_PUMP_RUNQ0.0位100ms
泵电流AI_PUMP_CURPIW256字500ms
清水池液位LT_CLEARWATERDB10.DBD0实数1s
出水流量FT_OUTPUTDB10.DBD4实数1s
加药泵频率给定AO_PUMP_SPEEDQW312字500ms

注意:变量名用“前缀_工艺段_序号”的格式,比如 CW 表示控制位,AI 表示模拟量输入,LT 表示液位,FT 表示流量。这种命名习惯在后期写脚本时能少踩很多坑,不然别人接手时根本猜不出某个变量是干嘛的。

3.2 模拟量的量程换算:把4-20mA变成看得懂的数

水厂大部分仪表是4-20mA信号,进PLC后变成数字量,再变成WinCC里的工程值。最常见的问题是:传感器量程0-10米,WinCC画面上显示出来却是27436这种原始值。原因就是没做量程转换。

转换公式是固定的:

工程值 = (原始值 - 原始下限) / (原始上限 - 原始下限) × (工程上限 - 工程下限) + 工程下限

以清水池液位0-10米、PLC原始值0-27648为例,10米对应27648,5米时原始值大约是13824。在WinCC变量连接属性里,把线性缩放这一项按这组上下限填进去,画面上的文本显示再设置一位小数,基本不会出大错。

我一般会把量程转换放在PLC程序里,把液位、流量先转成实数工程值写进DB块,WinCC侧只做显示。这样如果同一个点位要同时给中控和本地触摸屏用,两边读到的数是一致的,不会出现WinCC显示正常但触摸屏显示原始值的情况。素材里的模拟量变量大多已经在变量注释里标了量程,拿到后和现场仪表核对一遍再投用。

3.3 采集周期是性能的分水岭

WinCC变量刷新不是越快越好。全厂几十上百个变量都设成连续刷新,通信驱动负载和画面刷新都会明显卡顿。水厂液位、温度这类参数变化慢,1秒或2秒采集一次完全够;电流和流量用500毫秒到1秒;只有泵启停状态、故障信号这类需要操作反馈快的信号才用100毫秒。

画面对象的动态连接里也有触发方式选项。默认跟着变量周期走就行,特殊点位可以用事件触发,让PLC那边状态变化时主动置位一个内部变量,画面收到变化事件后再刷新一次,一触即发,平时不占用刷新开销。比较忌讳的是为了“看起来流畅”把所有对象全部设为连续刷新,这会让本来低负载的水厂项目也变得拖沓。

4. 动画与脚本落地:泵启停、液位变化和弹窗操作怎么做

4.1 状态颜色:用动态对话框代替脚本

水厂画面的设备状态显示有一套约定:绿色运行、红色故障、灰色停止、黄色检修或远程。这套逻辑优先用动态对话框做,不写脚本。动态对话框的好处是不运行C脚本,调试直观,运行状态在对象属性里直接能看到规则。

显示状态触发变量条件背景颜色闪烁
运行RUN == 1绿色否
停止RUN == 0灰色否
故障FAULT == 1红色是
远程/检修LOCAL == 1黄色否

配置时选中图块,右键进入对象属性,找到“闪烁/颜色”相关属性,把背景颜色设置为动态连接,表达式写成变量比较条件即可。例如故障条件的表达式是FAULT==1,闪烁速度用1Hz,现场人员远远一看红色在闪就知道是哪台设备报故障。脚本留给真正需要复杂逻辑的地方,比如多条件组合启停判断,不要把简单的颜色变化也写进脚本里。

4.2 泵启停按钮:C脚本里置位与复位的正确姿势

按钮操作的常规做法不是把“运行反馈”直接置1,而是输出一个启动脉冲或停止脉冲给PLC,由PLC程序里的自锁回路保持运行状态。这样即使通信瞬间断开,泵的状态也不会因为上位机误置位而改变。下面这段是启动停止切换的典型写法:

#include "apdefap.h" void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName) { // 读取当前泵运行状态:0表示停止,1表示运行 int nRun = GetTagBit("CW_PUMP_RUN"); // 根据当前状态发脉冲:停止时发启动命令,运行时发停止命令 if (nRun == 0) { SetTagBit("CW_PUMP_START", 1); // 启动脉冲,PLC内部自锁回路保持运行 } else { SetTagBit("CW_PUMP_STOP", 1); // 停止脉冲,PLC内部复位 } }

逻辑说明:GetTagBit 读回来的是位变量当前值,0或1。SetTagBit 是写位变量,第二个参数是目标值。变量名里 CW_PUMP_START 和 CW_PUMP_STOP 必须预先在变量管理里存在,且一般为外部变量。启动脉冲不建议手动再复位,交给PLC程序在下一个扫描周期复位,这样上位机只负责“发令”,不负责“保持”。

水厂操作最忌讳误触。特别是送水泵,停机可能影响管网压力。所以关键设备的启动停止按钮不能单击直接执行,建议做成二次确认:第一次按下进入确认状态,按钮变成黄色提示状态,第二次按下才真正执行。这个逻辑用内部变量做中间状态:

#include "apdefap.h" void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName) { // 读取确认状态:0为未确认,1为已确认待执行 int nConfirm = GetTagWord("HMI_CONFIRM"); if (nConfirm == 0) { // 第一次按下:进入确认状态,让按钮字体变黄 SetTagWord("HMI_CONFIRM", 1); SetTagBit("HMI_TIP_STATE", 1); } else { // 第二次按下:执行启动,再清掉确认状态 SetTagBit("CW_PUMP_START", 1); SetTagWord("HMI_CONFIRM", 0); SetTagBit("HMI_TIP_STATE", 0); } }

逻辑说明:这个脚本使用一个字变量 HMI_CONFIRM 记录确认状态,HMI_TIP_STATE 控制提示颜色。第二次按下时先发启动脉冲,再清空确认状态,避免下次误触直接执行。如果操作员中途改变主意,点其他按钮前可以通过一个“取消操作”按钮把 HMI_CONFIRM 清零。这里用的内部变量不是必须,也可以用按钮自身的“闪烁”属性来提示确认状态。

4.3 页面切换与弹窗操作:SetPictureName的正确参数

WinCC里页面切换最常用的是 SetPictureName 函数。它有三个关键参数:当前主画面文件名、画面窗口对象名、目标画面文件名。初学者最容易写错的是第二个参数,这个参数不是画面名称,而是画面窗口这个对象的ObjectName。如果主框架里的窗口对象叫 ContentWindow,目标页是加药画面,脚本如下:

#include "apdefap.h" void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName) { // lpszPictureName 是当前画面名,可用于调试日志 // 把主框架里的内容窗口内容切换成加药间画面 SetPictureName("PIC_MAIN.PDL", "ContentWindow", "PIC_DOSING.PDL"); }

逻辑说明:第一个参数必须是当前已经打开的主框架页文件名,第二个参数是主框架页里那个画面窗口对象的名称,第三个参数是目标画面文件名。三个参数任何一个写错,函数都会静默失败,画面没有任何变化,也不报错。遇到点了按钮没反应的情况,先核对这三项。

如果需要弹出一个小操作面板而不是切换主画面,可以用 OpenPicture 打开模态窗口,这种窗口需要手动关闭,适合做参数设定和检修确认。但小心不要在一个循环里反复调用,否则无法关闭会导致操作界面卡死。

4.4 液位动画:用缩放模拟水池进水

水池液位动画不需要脚本,用几何尺寸动态连接实现。选中水池矩形对象,在“几何尺寸”里找一个高度属性,设置动态连接,触发变量选择液位变量如 LT_CLEARWATER,缩放范围设0到100%。需要注意水池矩形的锚点,也就是缩放基准点,必须设置在底部,否则水面是从中间往两边涨,看起来像气球而不是水池。

参数设置参考:液位满量程10米对应矩形高度100像素,画面显示文本同时显示当前液位数值。投运前用变量模拟器强制给 LT_CLEARWATER 赋一个中间值比如5.0,如果矩形高度变化正确,说明缩放比例没问题。缺点是这种缩放动画只反映当前值,不反映历史趋势,要拉曲线,还是得靠趋势控件。

5. 避坑注意:水厂WinCC画面最常见的五个翻车现场

5.1 画面数据全是####

现象:管道旁的压力、流量、液位文本显示“#####”,而不是正常数值。

原因:常见有三种。一是变量类型与画面显示格式不匹配,比如变量是浮点型,显示格式设成了整数但位数不够;二是通信连接没建立,变量管理里连接状态是红色叉号;三是变量的原始值超出量程范围,显示框装不下。

解决:先在变量管理里看连接状态。连接正常就打开变量模拟器,手动给这个变量强制赋一个量程中间值,如果画面能显示正常数值,问题出在PLC通信或地址上;如果还是####,检查画面对象的显示格式,把小数位数改成1位或2位。

5.2 设备颜色“呆住不动”

现象:现场设备已经运行,画面上的设备图块还是灰色,切走再切回来会变绿,过一会又灰了。

原因:动态连接的变量没有配置采集周期,或者触发方式选成了“打开画面时刷新一次”。画面刚打开时读了一次状态,之后PLC信号变化了也不刷新。

解决:在动态连接对话框里把触发周期改成周期刷新,周期值按变量重要性设100毫秒到1秒。不要选“仅在打开时刷新”。这一步做完以后,规则表达式才真正生效。

5.3 报警不弹窗、光字牌不闪

现象:现场已经发生高液位报警,画面上光字牌没有反应,报警记录里也没有这条消息。

原因:只在WinCC画面里做了颜色变化,但报警记录系统里根本没有配置这条消息。WinCC报警是独立于画面的,必须在报警记录编辑器里创建对应的消息变量,并绑定触发变量和限值。

解决:在报警记录里新建模拟量报警,选择触发变量,比如 LT_CLEARWATER,设置上限值和滞后值。然后在主画面底部报警控件里勾选对应的报警类别。现场有多个同类设备时,把报警变量做成批量更高效,不要在编辑器里一条一条手翻。

5.4 画面能打开但对象显示红叉

现象:项目从工程师站复制到操作员站后,画面能打开,但部分图块显示红叉,或者弹出错误框。

原因:最常见的原因是画面里用了面板类型或扩展控件,目标电脑没装对应的运行组件;其次是项目版本比源端低,高版本画面对象无法被低版本调用。

解决:操作员站做完整安装,不要精简掉任何可选组件,尤其是控件运行环境相关项。项目整体从高版本向低版本迁移基本不可行,尽量保证工程师站和操作员站主程序版本一致。如果只是个别控件异常,最稳妥的办法是删掉重画,用基本图形替换。

5.5 按钮点了没反应,也不报错

现象:运行画面上按钮红色高亮能点,但PLC那边没有任何动作,脚本也不报错。

原因:常见原因有三个。一是按钮对象的“允许操作”属性没勾上;二是脚本里的SetPictureName参数写错导致函数静默失败;三是操作权限级别不够,操作员用户没有执行该按钮的权限。

解决:先检查按钮属性里“允许操作”是否为真。再看脚本里三个参数:画面名、窗口对象名、目标画面名。权限方面,在用户管理里给当前登录用户分配对应角色的操作许可。如果按钮是组合对象,还要确认真正响应的那个子对象是哪一个,别把脚本挂在外层容器上。

6. 收尾技巧:性能自检与项目备份的固定动作

6.1 投运前把全部页面过一遍

水厂画面交付前,不要只盯着工程师站看效果,一定要到现场操作员站上跑一遍完整流程。我一般按下面这张清单逐项核对,缺一项都不算完成:

检查项目通过标准检查方法
主画面加载时间3秒内出全冷启动计时
运行系统CPU占用常态低于30%任务管理器观察
全部按钮允许操作每个操作页按钮可点用操作员账号逐页点击
模拟量显示精度与现场表计一致对照量程和实际读数
归档磁盘空间剩余空间充足查看系统信息

运行系统CPU占用超标时,优先检查页面里的趋势控件数量和变量的刷新周期,这两个是画面变卡的头号原因。画面里能少放曲线控件的就少放,公共趋势页只保留必要的参数组。

6.2 备份不要直接复制文件夹

WinCC项目是带数据库的,直接复制整个项目文件夹到另一台电脑通常会损坏归档数据。正确做法是使用项目复制器,先把运行系统停掉,再用复制器把项目打包成一个完整包。恢复时通过项目复制器打开,不要用平时拷贝文件的方式去覆盖。

复制到新机器后,还要重新检查通信驱动、连接参数和授权。画面本身在没问题,真正容易丢的是驱动设置和归档数据。素材里的画面结构和变量分组可以直接借用,但通信层要根据现场PLC重新配一遍。有次我把一台电脑上的画面文件夹直接拷到另一台,结果打开后归档曲线全没了,数据库文件没有跟着走,白折腾了一下午。

从那以后,每次交付水厂画面我都强制自己走一遍顺序:先核对点表,再逐页点按钮,再检查运行内存,最后用项目复制器做完整备份并把归档数据单独导出。这个习惯帮我躲过了不少交付后无端的返工,也希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进