☰
WinCC V7.5 SP2小型污水站监控界面组态与工程移植
2026/11/3 20:50:12 网站建设 项目流程

做小型污水站的上位机改造,最怕的不是工艺复杂,而是把界面做成一堆「能看不能用」的静态图片。我前后做过几个水处理相关的监控画面,从早期的 WinCC 6.2 一路做到 V7.5 SP2,踩过的坑基本集中在两件事上:画面组态时没想清楚变量怎么组织,以及导航菜单全靠硬编码,后期加一个页面就要改一圈脚本。这篇就把一个简易污水处理监控界面的完整做法拆开讲——从画面尺寸、图元绘制、动态化,到自定义菜单、报警趋势,再到工程文件的组织和移植。适合刚接触 WinCC 的自动化从业者,也适合手上有个小项目要快速出活、不想从头啃手册的人。

1. 项目背景与整体设计思路拆解

1.1 为什么这个场景适合用 WinCC V7.5 SP2

小型污水站的点位规模通常不大:提升泵、格栅机、调节池、厌氧池、好氧池、二沉池、污泥回流泵、加药装置、鼓风机、出水口在线仪表,加起来模拟量几十个、开关量一两百个,属于典型的「小而全」。这种规模的项目有个特点:预算有限、工期紧、现场维护人员水平参差,所以上位机选型的第一原则不是功能多强,而是稳定、通用、后续有人能接手改。

WinCC V7.5 SP2 在这个场景下的优势很实在。一是与 S7-1200/1500、S7-300 的通道对接成熟,以太网连上基本不用折腾;二是图形编辑器的对象体系足够画工艺流程图,管道、池体、泵、阀门这些图元用基本图形就能拼出来;三是报警记录、变量记录是内置模块,不需要额外买组件;四是现场工程师普遍认识这个界面,交接文档好写。我在几个项目里对比过,同样做一个带报警和趋势的监控画面,WinCC 从零到能用大概两三天,换成纯 Web 方案光环境搭建就得一周。

V7.5 SP2 相对早期版本有几个实用改进:支持 VBS 动作,脚本门槛低了一截;图形对象的抗锯齿和透明度处理更自然;诊断和项目复制工具也更省心。当然它的短板也明显——画面对象的渲染效率不如现代前端框架,对象数量上千后切换会有肉眼可见的卡顿。所以整套设计的核心思路就是:画面适度拆分、动态化尽量用组态而不是脚本、导航靠画面窗口而不是多开画面。

1.2 工艺段划分与画面分区规划

动手画之前,先在纸上把工艺段列清楚。一个典型的简易污水站可以拆成五块:进水与预处理(格栅、提升泵、调节池)、生化处理(厌氧、好氧、鼓风机)、泥水分离(二沉池、回流泵、剩余污泥)、加药与消毒、出水与在线监测。每一块对应一个子画面,再配一个总览画面做全流程鸟瞰。

画面布局我固定用这一套:顶部 80 像素放标题栏和系统状态(当前用户、报警条、时间),左侧 200 像素做自定义菜单,中间剩余区域放画面窗口承载内容,底部 60 像素放全局操作按钮(报警确认、报表、注销)。这个布局的好处是菜单和内容解耦——内容画面只管画工艺,不用关心自己从哪进来,后期加页面只加按钮和画面,不动任何已有逻辑。

分辨率按现场工控机来定。新建画面先在属性里把宽度高度设成显示器的物理分辨率,1920×1080 是目前最常见的配置,老机器可能是 1366×768。这里有个容易忽略的点:运行系统如果设成「适应窗口」,画面元素会被缩放,细线(1 像素的管道)会糊成一团。所以我一般直接用和显示器一致的分辨率,运行方式选全屏,宁可留白也不缩放。

1.3 变量设计先于画面设计

这是我最想强调的一条。新手常见做法是打开画面开始画,画到哪需要数据再回头建变量,结果变量名全是 Tag_1、Tag_2,一个月后自己都不认识。正确的顺序是先把 PLC 侧的 DB 结构定好,再按结构在上位机建变量。

我的命名规则是三段式:设备编号_参数_类型。比如P01_Run(1 号提升泵运行反馈)、P01_Fault(故障)、P01_Mode(手动/自动)、T01_PV(1 号池液位测量值)、T01_SP(设定值)。前缀统一用设备类型编码:P 泵、M 搅拌器、V 阀门、T 液位/温度、F 流量、A 分析仪表。

变量多的时候用结构变量能省大量重复工作。定义两个结构类型:stPump包含 Run、Fault、Mode、Start、Stop 五个成员;stAnalog包含 PV、SP、HH、H、L、LL 六个成员。然后建P01、P02、P03三个结构变量,指向 PLC 的连续地址块。这样画面里的对象只要改一个「变量前缀」,整台设备的动态化就能复用——后面讲自定义菜单时,这个特性会派上大用场。

提示:结构变量在跨 PLC 或地址不连续时不好用,不要硬套。现场很多项目的 DB 是分批加的,地址零散,这时候老老实实建扁平变量更省心,命名规范做到位就行。

2. 画面组态核心细节:从静态底图到动态元素

2.1 图层、对齐与对象命名这三件小事

图层(Layer)共 16 层,很多人从来不动,全堆在第 0 层,结果调一个元素的位置要把上面压着的东西一个个挪开。我习惯这么分层:0-1 层放背景色块和厂区轮廓,2 层放管道,3 层放池体和设备图元,4 层放动态元素(液位填充、流动效果),5 层放数值和单位文本,6 层放操作按钮,10-12 层放弹出画面窗口,15 层放全局提示(比如「系统停机维护中」的横幅)。

对齐网格建议打开,网格宽度设 8 或 10 像素。管道横平竖直对不齐,视觉上会非常廉价,而且后期改尺寸时容易错位。我用 10 像素网格,所有矩形宽高都取 10 的整数倍,管道起点终点落在网格交点上。

对象命名是另一个被严重低估的环节。画完一个对象,属性里默认名字是「矩形1」「按钮3」,脚本里引用就得靠数。我要求所有会被脚本或动态对话框引用的对象必须有语义化名字:pnlContent(主画面窗口)、btnNavOverview(菜单按钮)、barT01(液位棒图)、txtP01State(泵状态文字)。规范统一之后,SetPropChar这类函数写起来才不会写错一个字母调试半天。

2.2 静态图元:管道、池体、泵阀怎么画得像那么回事

WinCC 自带图形库里有不少现成图元,管道、阀门、泵、风机都有,直接拖出来改颜色和尺寸是最快的路子。图形库的管道对象带「流向」属性,可以设置介质类型和流动方向,比自己拿线画省事。但图形库图元的风格偏「工业软件默认脸」,一堆项目用下来长得都一样,如果甲方对界面有点审美要求,我建议关键图元自己画。

池体的画法:外框用一个矩形,边框色取浅灰(RGB 200,200,200),线宽 2,填充设成从深到浅的线性渐变,模拟水深。池子里再放一个矩形作为水位填充,初始填充色用半透明蓝(RGB 60,130,200,透明度 40%)。这两个矩形叠起来,静态部分就完成了,动态化下一节说。

管道用「折线」对象画,线宽 5-6 像素,颜色取浅灰。拐弯处用折线的中间点,拐角要圆润的话把「连接线型」设成圆角。主工艺线宽一点(6 像素),辅助管线细一点(3 像素),视觉层次立刻出来。如果需要表现介质颜色(污水是褐黄色、污泥是深褐、加药是淡黄),就给不同管段用不同颜色,比统一灰色直观得多。

泵的画法有两种。图省事就从图形库拖一个离心泵图元,改一下颜色;想好看一点就用圆形加三角形拼:圆代表泵体,三角形代表出口方向,再配一个小矩形做底座。我一般用后者,因为组合对象(Group)可以在内部叠加多个图形,做成「自定义对象」后复制到别处还能保持整体,改一个属性全部同步。

阀门的画法同理,两个三角形对接就是标准阀符号。开状态填绿色,关状态填红色,故障灰色,这个颜色约定基本是全行业通用的,别自己发明。

2.3 动态化:能用组态解决的,坚决不写脚本

动态化手段有三档,复杂度从低到高:动态对话框、C 动作、VBS 动作。选择原则很简单——单变量、范围判断,用动态对话框;多变量逻辑、需要中间计算,用脚本;脚本里如果只是简单赋值和条件,VBS 更好维护。

颜色动态化是最典型的动态对话框场景。泵的状态颜色绑定P01_Run,范围 1 → 绿色、0 → 灰色、P01_Fault为 1 → 红色闪烁。注意 WinCC 的闪烁是通过「闪烁」属性单独设的,不是靠颜色切换,动态对话框里的「闪烁」要把背景色和闪烁频率分开配。

液位的动态化是最能体现功力的地方。简单做法用棒图(Bar)对象:最小值 0、最大值 5(米),绑定T01_PV,方向设成从下往上,一眼就能看出液位高低,新手第一天就能做出来。但这个做法有个缺陷——棒图是独立控件,很难和池体的立体感融合,看起来像贴在画面上的仪表。

进阶做法是用矩形填充,需要同时动态化「高度」和「顶边位置」两个属性。假设池体内部高度是 240 像素,对应实际液位量程 0-5 米:

  • 填充矩形高度 = (液位 / 5.0) × 240
  • 填充矩形顶边 Y = 池底 Y 坐标 − 填充高度

这两个表达式写在动态对话框的「变量」→「计算」里,或者直接用 C 动作算。为什么必须同时动两个属性?因为 WinCC 的矩形是从左上角定位的,只改高度会让它从顶部长出来,方向正好反了。这个坑我见过太多人掉进去,调半天以为是变量没连上,其实是定位基准的问题。

注意:液位填充的透明度不要太低,低于 20% 在深色背景上几乎看不出来。我一般用 35%-45%,既能透出底部的池体纹理,又能看清水位线。

2.4 泵旋转和管道流动:两个看起来很唬人其实很土的技巧

WinCC 没有直接的旋转动画属性(除非用 ActiveX 或第三方控件),泵的旋转只能靠多帧图片轮换。准备 8 张不同旋转角度的泵图片(0°、45°、90°……),放在项目目录下的GraCS文件夹里,命名pump_0.bmp到pump_7.bmp。

然后用一个内部变量iAnimFrame做帧计数,全局脚本里挂一个 250ms 的定时器:

// 全局脚本:动作,触发周期 250ms #include "apdefap.h" int gscAction(void) { static int frame = 0; char szPic[32]; frame = (frame + 1) % 8; sprintf(szPic, "pump_%d.bmp", frame); // 只在泵运行时切图 if (GetTagBit("P01_Run") == 1) { SetPropChar("overview.pdl", "imgP01", "PictureName", szPic); } return 0; }

8 帧、250ms 一帧,正好 2 秒转一圈,转速看着比较自然。想转快点就减帧间隔,但别低于 150ms,否则画面刷新压力上来了,泵会一顿一顿的。

管道流动效果也是类似的土办法:在管道内部放一个窄矩形(宽度约管宽的 30%),用脚本每 200ms 移动它的 X 坐标,超出管道范围就回到起点。视觉上就是一个「流动的色块」,远看很像介质在流动。这套做法性能开销不小,所以一定要加开关——用一个内部变量bAnimEnable控制脚本是否执行,只在总览画面上打开,切到别的画面就关掉。

我个人在这块的体会是:动画点到为止。泵在转、管道在流,操作员能一眼看出设备在运行就够了,不需要做得像游戏。画面里的元素越多、动画越多,工控机的 CPU 占用越高,现场的工控机往往是五年前的老机器,跑不动花哨的东西。

3. 自定义菜单的实现路径与权限联动

3.1 三种菜单方案的取舍

WinCC 的菜单实现方式主要有三种,各有适用场景。

方案一,左侧按钮组 + 画面窗口。最土也最稳,一个按钮对应一个子画面,点击时改画面窗口的「画面名称」属性。优点是逻辑清晰,任何人打开工程都能看懂;缺点是一级菜单最多放七八项,再多就要滚动,占地方。

方案二,下拉弹出菜单。主菜单按钮点了之后,显示一个隐藏的画面窗口,里面是一列按钮,选完再隐藏。这套适合二级菜单多的项目,比如「报表」下面挂日报、月报、历史查询,「设置」下面挂参数、用户、通信。实现起来比方案一多一步显示/隐藏控制,但视觉上清爽很多。

方案三,ActiveX 菜单控件。WinCC 的控件箱里确实有菜单类控件,可以配多级菜单和图标,看着最专业。但我不推荐新手用——配置全靠属性面板和脚本,调试成本高,出问题不好排查,而且控件在不同版本间的兼容性有坑。小项目完全没必要。

我的做法是方案一加方案二混着用:一级用左侧固定按钮,二级用下拉弹出。

3.2 用画面窗口做菜单的完整步骤

先解释一下画面窗口这个对象为什么是导航的核心。它本质上是一个「容器」,可以在里面加载另一个 .pdl 画面,并且支持「变量前缀」——加载进来的画面里所有未限定前缀的变量,都会自动加上这个前缀。这个特性是后面做设备弹出面板的关键。

具体步骤:

第一步,在中间内容区放一个画面窗口对象,命名pnlContent,属性里设「无边框」勾上、「可关闭」去掉、「可移动」去掉,尺寸铺满内容区。

第二步,左侧放置菜单按钮。按钮的文字用「静态文本」对象叠在矩形上做,比直接用按钮对象的默认样式好看;如果要省事,直接用「按钮」对象,把「字体」设成 16 号微软雅黑,背景色用深灰。

第三步,给每个按钮的「鼠标点击」事件写 C 动作:

// 菜单按钮点击:切换内容画面 #include "apdefap.h" void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName) { // 加载工艺总览画面,并清空前缀 SetPropChar(lpszPictureName, "pnlContent", "ScreenName", "overview.pdl"); SetPropChar(lpszPictureName, "pnlContent", "TagPrefix", ""); // 记录当前菜单索引,用于按钮高亮 SetTagByte("iMenuIndex", 1); }

三个参数的含义要搞清楚:lpszPictureName是当前画面名,lpszObjectName是触发事件的按钮名,lpszPropertyName是属性名。实际写的时候直接用字面量替换就行,但保留参数形式便于复制到别的项目。

第四步,做菜单高亮。每个菜单按钮的「背景色」属性用动态对话框绑定iMenuIndex,值等于自己的序号时显示深蓝,否则显示深灰。这样点哪个哪个亮,操作员一眼知道自己在哪一页。这步不需要脚本,纯组态,非常省事。

提示:iMenuIndex必须建成内部变量(Internal Tag),类型 BYTE 就够用(最多 255 个菜单)。别用 32 位整型,浪费。

3.3 二级菜单:弹出式下拉的显示与隐藏

一级按钮如果直接跳转,一级菜单数量就被限制死了。实际项目里「报警」「趋势」「报表」「设置」这几项下面通常还有子项,用弹出式面板更合适。

做法:在菜单按钮下方放一个小尺寸画面窗口pnlSubMenu,加载submenu.pdl,初始「可见」属性设为否。主菜单按钮点击时切换可见性:

// 点击"报表"主菜单,弹出二级面板 #include "apdefap.h" void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName) { // 用内部变量做开关,避免直接操作属性导致状态不同步 if (GetTagBit("bSubMenuVisible") == 0) { SetTagBit("bSubMenuVisible", 1); } else { SetTagBit("bSubMenuVisible", 0); } }

然后把pnlSubMenu的「可见」属性用动态对话框绑到bSubMenuVisible上,值为 1 时可见。为什么不直接在脚本里设 Visible 属性?因为画面上可能同时有多个触发点(主菜单按钮、点击别处关闭、切换画面自动关闭),用变量做单一数据源,状态永远不会乱。这是我做交互的一条基本原则:UI 状态尽量用变量表达,不要散落在各个脚本里。

二级面板里的按钮点击后要做两件事:加载对应画面,然后把自己的可见性关掉。

3.4 权限控制:别指望操作员自觉

监控界面必须分权限,这不是形式主义。参数设定、报警确认、历史数据清除这些操作,误触一次可能就是几个小时的排查。

WinCC 的用户管理(User Administrator)里建三个组:操作员(授权等级 1)、班长(等级 4)、工程师(等级 8)。数字不是必须这么分,但要有明显的梯度,方便后续扩展。

应用权限有两种方式。第一种是对象属性:选中按钮,打开属性 → 其他 → 授权,选对应等级。运行时如果当前登录用户等级低于设定值,按钮变灰且不可点击。这是最省事的做法,不需要一行脚本。

第二种是脚本校验:在需要精细控制的场景(比如同一个按钮根据设备状态决定是否允许操作),在 C 动作里先判断。WinCC 的系统函数库里有用户管理分组,提供登录、注销、权限检查类函数,可以直接挂到按钮事件,也可以写进脚本里做静默登录。

我一般两者结合:按钮对象上设授权等级做第一道拦截,脚本里对关键操作(比如泵的启停)再加一道状态判断——泵在故障状态下不允许启动,避免操作员在报警没处理完就强行开机。这种细节写进脚本只要三行,但能挡掉不少现场事故。

注意:不要用「隐藏按钮」代替「禁用按钮」。隐藏会让操作员困惑「这个功能去哪了」,禁用加个提示文字才是正常交互。WinCC 里禁用靠授权属性实现,被禁用的对象默认变灰,视觉上很明显。

4. 报警、趋势与关键参数计算

4.1 报警记录配置:死区和延迟时间比报警数量重要

报警记录(Alarm Logging)里先建消息类别。默认有错误、系统、过程控制消息等,我一般只用「错误」和「警告」两类,错误用于设备故障和超限,警告用于偏离正常范围但还能运行的情况。类别太多,操作员看报警列表时会失去判断力。

消息块选择上,必选的有:日期、时间、编号、消息文本、持续时间、状态、确认状态。编号很重要,现场打电话报修时报「E1023」比描述半天现象高效得多。

模拟量报警的关键在两个参数:延迟时间和死区。延迟时间是指变量越限后持续多久才产生报警,防止瞬时波动误报。比如液位上限报警设 5 秒延迟,进水阀门动作时液位短暂波动不会触发。死区是报警恢复的阈差值,比如上限报警值 4.5 米,死区 0.1 米,那么液位要降到 4.4 米以下才恢复。没有死区,液位在 4.5 附近抖动,报警会疯狂闪烁,操作员一分钟内就会把报警声音关掉——这是最糟糕的结果。

离散量报警相对简单,P01_Fault上升沿触发一条消息。但要注意脉冲型故障:有些设备的故障信号只持续几百毫秒,如果上位机采样周期是 1 秒,很可能抓不到。解决办法是在 PLC 侧做锁存(置位到确认后复位),上位机只管读状态位。这条经验值不少加班时间——上位机永远不要指望能可靠捕获 PLC 的瞬时信号。

报警控件用 WinCC Alarm Control,放在单独的报警画面上,也可以在主画面顶部放一个精简版(只显示最近 3 条未确认报警)。顶部的报警条我强烈建议做,操作员在总览画面上就能看到有没有新报警,不用来回切页面。

4.2 趋势曲线:归档周期和显示跨度要匹配

变量记录(Tag Logging)里建归档,归档周期是最关键的选择。周期太短,数据库膨胀快;周期太长,曲线呈阶梯状,看不出变化趋势。

我的经验值:液位、流量这类变化较慢的过程量,归档周期 5 秒足够;压力、泵电流这类变化快的,1 秒;累计量(比如总产水量)10 秒甚至 30 秒都行。归档周期设成 1 秒看着「专业」,但一个 30 个变量的归档,一天就是 259 万条记录,一个月后查询会明显卡顿。

归档尺寸上,单个分段的大小按一周算,所有分段保留四周,循环覆盖。这个配置对应的是「能查最近一个月数据」的需求,也是环保类项目最常见的追溯要求。

趋势控件(WinCC Online Trend Control)里配置时间轴,默认显示 10 分钟有点短,改成 1 小时更符合运行人员的观察习惯——他们关心的是「这一小时水位怎么变的」,不是「这一分钟」。

曲线颜色要区分清楚。我用的约定:液位蓝色、流量绿色、pH 橙黄、溶解氧青色、设定值用红色虚线。同一条曲线上不要放超过 4 个变量,超过就分成两个趋势控件,上下叠放。曲线挤在一起,什么趋势都看不出来。

4.3 两个必须算对的参数:液位换算和流量累计

液位换算。现场用的大多是 4-20mA 输出的投入式液位计,接到 S7-1200 的模拟量输入模块,原始值范围 0-27648,对应 4-20mA。假设量程 0-5 米:

  • 4mA 对应原始值 0(有些模块是 5530,取决于是否启用断线检测)
  • 20mA 对应原始值 27648

液位计算公式:液位(m) = (原始值 - 5530) / (27648 - 5530) × 5.0

为什么用 5530 而不是 0?因为 S7 的模拟量输入在 4mA 时对应的原始值是 5530(27648 × 4/20 附近,实际是个固定偏移),低于这个值说明线路断了或者传感器故障,可以单独判定。用 0 做基准,断线时会算出一个负数液位,看不出是故障还是空池。

这个换算有两个地方可以做:PLC 里做,或者 WinCC 里做。我倾向在 WinCC 里用变量的「线性标定」功能做——原始值 5530 映射到 0,27648 映射到 5.0,配置一次就行,不占 PLC 扫描周期。但如果这个值要参与联锁控制,必须在 PLC 里算,上位机只做显示。

流量累计。瞬时流量单位是 m³/h,累计量是 m³,换算关系:

累计增量 = 瞬时流量(m³/h) ÷ 3600 × 采样间隔(s)

采样间隔 1 秒、瞬时流量 100 m³/h 时,每次累加 0.0278 m³。用全局脚本 1 秒定时器做累加,累加结果存到内部变量F01_Total。

这里有个必须处理的问题:掉电保持。WinCC 内部变量可以设「保持」属性,但它的保持机制依赖运行系统正常关闭,突然断电时最后一段数据会丢。对累计量这种只增不减的数据,我建议把累计值定时(比如每 10 秒)回写到 PLC 的保持型 DB 里,上位机重启后从 PLC 读数继续累加。多写这十行脚本,能避免和甲方扯皮「为什么昨天的水量少了 3 吨」。

// 全局脚本:流量累计,触发周期 1s #include "apdefap.h" int gscAction(void) { double q = GetTagFloat("F01_PV"); // 瞬时流量 m³/h double total = GetTagDouble("F01_Total"); if (q > 0.0) { total = total + q / 3600.0; // 1 秒采样 SetTagDouble("F01_Total", total); } return 0; }

累计值显示时注意小数位数。IO 域的输出格式设成99999.9,一位小数就够,显示太多位数操作员反而不信任。

5. 实操避坑与常见问题速查

5.1 现场踩过的坑,一条一条说

画面窗口切换后数值全是 0 或者显示 ####。这是最高频的问题,九成是「变量前缀」没清空。画面窗口的变量前缀是「继承」的,你给某个画面窗口设了P01_前缀,切到另一个画面时如果不显式清空,那个画面里所有变量都会被加上P01_前缀,找不到就显示 0。解决方法很简单:每次切换画面都调用一次SetPropChar(..., "TagPrefix", ""),养成肌肉记忆。

脚本写了但完全不执行。排查顺序是:先看全局脚本有没有编译(图形编辑器里的「编译」动作,很多人漏了这步);再看触发器有没有设(全局脚本动作必须指定触发周期或变量触发);最后看运行系统有没有激活。这三步覆盖了 95% 的「脚本不生效」问题。

泵的图片切换没反应。两种可能:属性名写错了,或者图片没放到正确位置。WinCC 引用图片只认文件名,文件必须放在项目目录下的GraCS文件夹里,放桌面或者别的地方都不行。另外属性名在不同版本里可能显示为「图形名称」或「PictureName」,写脚本前先在属性面板里确认一遍实际名称,别照抄网上的代码。

报警一直闪个不停。前面说过,加死区和延迟时间。还有一类情况是变量的数据类型不匹配——报警配置里按浮点数配的限值,实际变量是整型,比较时会出现异常边界。这种情况不常见但很折磨人,配置完先在报警视图里看原始值对不对。

趋势曲线一条线都没有。依次检查:变量有没有加入归档(不是建了变量就会归档,要在变量记录里单独添加);归档有没有启动(运行系统属性里的「变量记录运行系统」要勾上);趋势控件的时间范围是不是选在了数据存在的时间段之外。我遇到过最离谱的一次是系统时间被改成了 2019 年,归档数据全部写到了「过去」,控件显示当前时间段当然什么都没有。

画面切换明显卡顿。对象数量太多是主因。一个总览画面上如果堆了三百个对象(每个池子、每根管道、每个文字都算一个),切换时重绘压力很大。优化手段是把静态元素合并成一张背景图——在图形编辑器里画好之后导出成 bmp,再作为「图形」对象插回来,对象数从三百降到三十。缺点是后期改图麻烦,所以适合已经定稿的画面。

5.2 常见问题速查表

现象可能原因排查与解决
画面窗口内容显示 0 或 ####变量前缀未清空切换画面时同步SetPropChar(..., "TagPrefix", "")
C 脚本完全不执行未编译、无触发器、运行系统未激活依次检查编译状态、触发周期、运行状态
泵/风机动画不生效属性名错误或图片路径不对图片放项目GraCS目录,属性名以属性面板为准
报警频繁抖动闪烁缺死区与延迟时间上限报警加 0.1 死区、5 秒延迟
趋势控件空白变量未归档或归档未启动变量记录里添加归档、勾选变量记录运行系统
中文显示为方块字体不支持或编码问题统一用微软雅黑/宋体,避免生僻字
画面切换卡顿对象数量过多静态元素合并为背景图,关闭不必要的动画脚本
累计量掉电后归零内部变量未做保持或未回写 PLC定时回写 PLC 保持寄存器
变量连接断开通信通道配置或网络问题用通道诊断工具查看连接状态与错误码

5.3 工程文件的组织与移植

标题里提到「附工程文件」,这块其实比很多人想的更重要。一个能交付的工程,不是「我电脑上能跑」就行,而是换一台机器、换一个人接手,还能顺利改。

项目路径绝对不能有中文和空格。这条是老生常谈,但每年都有人踩。WinCC 的全局脚本编译、归档数据库路径、部分系统组件对特殊字符敏感,路径里出现中文可能表现为「脚本编译报错但看不出哪错」或者「归档数据写不进去」。我统一用D:\Projects\WWTP_Demo\这种纯英文短路径。

工程文件的结构要清晰。我的习惯是在项目根目录下建三个文件夹:Docs放 IO 点表、变量对照表、操作说明;GraCS放所有自定义图元;Backup放每日备份。点表用 Excel,三列就够:变量名、PLC 地址、说明。这份表是交接的核心,比什么文档都管用。

复制工程一定要用项目复制器(Project Duplicator),不要直接拷文件夹。直接拷贝会漏掉运行时生成的归档数据库文件,或者把一些机器相关的配置一起带过去,在新机器上表现为「归档打不开」「授权报错」。项目复制器会把工程整理成可移植的形式,归档数据也能一并带走。

版本升级要注意 SP 补丁。V7.5 SP2 的工程在 SP1 环境里打不开,反过来可以。移植前先确认目标机器装的版本不低于源工程,实在不确定就带着安装包去现场。

给工程留注释。每个画面的「属性」→「注释」里写清楚这个画面干什么、用到哪些变量;每个全局脚本的函数头写清楚触发周期和依赖变量。这些注释不占地方,但半年后回来改代码时能救命。我做过的项目里,注释齐全的工程二次开发时间大概是不齐全的三分之一。

5.4 关于性能的一点实测体会

我曾经在一个总览画面上堆了 400 多个对象、12 个动画脚本、5 个趋势控件,在一台四代 i5 的工控机上,画面切换要等 2-3 秒,操作员抱怨「点了没反应」。后来做了三件事:静态元素合并成背景图(对象降到 80 个)、动画脚本合并成一个全局动作(从 12 个减到 1 个)、趋势控件从 5 个减到 2 个(其余移到独立画面)。切换时间降到 0.3 秒以内,肉眼几乎感觉不到延迟。

这个经历让我形成了一个判断标准:主画面对象数控制在 150 个以内,动画脚本不超过 2 个,趋势控件不超过 2 个。超过这个量级,就要考虑拆分画面或者做显示优化。工控机不是开发机,现场的 CPU 和显卡往往是整个系统里最弱的一环,画面设计必须为它让路。

另外一个小细节:图片资源用 bmp 或 png,尺寸不要超过实际显示尺寸的两倍。有人喜欢放 4K 图片再缩放显示,内存占用翻好几倍,动画切换时会明显掉帧。按实际像素尺寸准备图片,这是最省资源的做法。

最后分享一个我自己一直在用的习惯:每做完一个画面,把运行系统激活,用一个临时变量模拟各种状态(正常、越限、故障、通信中断),从头到尾点一遍。通信中断的模拟尤其重要——直接把变量的「质量」改成无效,看看画面上的数值是变成灰色、显示***,还是傻乎乎地保留最后一个值。这一步花十分钟,能提前发现很多现场才会暴露的问题。我见过不少项目,通信一断,画面上的数值还稳稳地显示着三小时前的液位,操作员完全不知情,这种设计比不做监控还危险。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询