1. 纯水工艺场景拆解先搞明白现场在控什么做上位机组态最忌讳一上来就开WinCC拖控件。纯水项目跟一般的工厂自动化不太一样它不是单台设备启停那么简单而是一条连续的水处理链。我在接到这个项目时第一件事不是打开TIA Portal而是花了两天时间把工艺流程图彻底捋了一遍把每一个测点、每一台设备、每一种运行模式都登记成表。这一步做扎实了后面的组态工作其实就是体力活。1.1 典型纯水工艺流程与测点清单纯水制备的工艺路线大同小异这个项目里采用的是比较经典的两级反渗透加EDI电去离子方案。原水先进入原水箱经过原水泵加压后依次通过多介质过滤器、活性炭过滤器、软化器再进入一级RO保安过滤器、一级高压泵、一级RO膜组产水进入中间水箱中间水通过二级高压泵进入二级RO膜组产水进入EDI装置最终产品水存入纯水箱通过循环泵输送到用水点。整体来说就是预处理段、RO脱盐段、精处理段、供水循环段这么四大块。别小看这个流程图它是整个上位机的骨架后续的画面划分、变量命名、报警分组全部跟着它走。测点这块我通常分成四类来登记模拟量输入液位原水箱、中间水箱、纯水箱、压力各泵出口、RO膜前、膜后、流量产水流量、浓水排放流量、电导率原水电导率、一级RO产水、二级RO产水、EDI出水、pH值、温度、余氯等。数字量输入泵的运行/停止/故障状态、阀门的开到位/关到位、水箱的高/低液位开关、电气柜的断路器状态、手自动转换开关位置。数字量输出泵的启动/停止控制、阀门的开/关控制、声光报警器的驱动。模拟量输出变频器的频率给定原水泵、高压泵常用变频、气动调节阀的开度给定。这个项目的点位规模大概在300点左右用WinCC 7.5来做是杀鸡用牛刀但也正因为如此整个上位机跑起来极其流畅冗余度和扩展性是完全不用担心的。1.2 控制需求分级哪些需要做成自动场景纯水系统的控制逻辑说复杂也复杂说简单也简单关键是要把运行模式分清楚。我一般把控制需求分成三个层次来和工艺人员确认第一层是单设备控制。就是泵的启停、阀门的开关可以在上位机上手动操作也可以在现场操作柱上操作。这一层是基础不涉及联锁但需要画面上能实时反映设备状态并且操作时要有确认对话框防止误操作。第二层是设备联动。比如原水泵启动之前必须先开进水电动阀到位后再启动泵泵启动后延时5秒如果出水压力没有上来就要报警提示。这种逻辑我一般放在PLC里做上位机只负责显示当前联动步骤的状态。有人问为什么不在上位机里做因为上位机做得再花哨PLC宕了或者通讯断了逻辑就全废了。关键联锁必须在PLC本地执行这是做工控的铁律。第三层是场景控制。比如系统自动启动的顺控流程先开原水进水阀开原水泵确认预处理各罐体运行正常再启动一级高压泵等待一级RO产水电导率达标后才把产水切到中间水箱。这个流程可以一键触发但每一步都要有状态反馈哪一步卡住了要能报警显示。上位机在这层的主要职责是把整个顺控步骤用流程图的形式展示出来操作员能一眼看出当前走到哪一步。顺带说一个实用的点纯水系统最重要的事情不是制水而是保护膜。RO膜非常娇贵高压泵启动前必须确认进水压力满足要求、低压保护开关导通否则干转几秒钟膜就废了。所以画面设计时膜前压力、进水流量这些关键参数不但要显示还要做成醒目的趋势和报警操作员每天交接班第一眼就是看这些数值有没有异常漂移。2. 组态模板的整体架构设计先把骨架搭好纯水项目的上位机不是画三五张画面就行的事一套完整可交付的系统至少包括流程画面、设备操作面板、报警管理、趋势曲线、数据报表、用户权限这几个模块。如果每一张画面都从头开始拖控件、配动画项目周期会拖得很长而且后期改起来特别痛苦。所以我在这个项目里花了不少心思做了一套可复用的组态模板这也是我把这个案例分享出来的主要原因。2.1 为什么选WinCC 7.5而不是C#或Qt自研这个话题在工控圈里争论得不少。C#和Qt做上位机确实灵活想画什么控件都能写出来做出来的界面也漂亮但它们在纯工业监控场景里的劣势也很明显开发周期长、需要处理通讯协议、报警归档、历史存储这些基础功能要自己造轮子而且后面的维护者不一定是软件工程师。WinCC 7.5的优势是开箱即用——S7协议的通讯是原生的跟TIA Portal的集成度极高变量表、报警、归档、用户管理都内置好了我花在搭基础设施上的时间基本为零。换句话说C#是从零开始盖房子WinCC是给你一套精装房你只需要搞软装纯水项目这种流程监控场景WinCC能把80%的时间省下来花在工艺效果的打磨上。WinCC 7.5的另一个优势是生态成熟市面上能查到的案例、脚本、面板非常丰富遇到问题基本都能搜索到解决方案。搭配S7-1500系列PLC使用时WinCC 7.5可以直接通过S7-1200/1500的符号地址访问变量连变量导入的功夫都省了大半。我在这套模板里PLC侧用的就是S7-1500配合TIA Portal V16做的开发。2.2 画面规划与变量树设计画面规划的原则是总览在顶层操作在底层三层结构最合理。第一层是总览画面显示整个纯水系统的主要工艺流程图各设备用不同颜色表示运行状态关键仪表显示实时数值操作员在总览画面就能判断整个水站是否健康。第二层是分区画面按照预处理段、RO脱盐段、精处理段、供水循环段拆分成四张画面每张画面展示该工艺段的详细流程、所有设备的运行参数和操作入口。第三层是设备细节与报表页面包括配电监控、报警历史、数据趋势、用户管理等。画面层级之间用导航按钮互相跳转并统一放在一个主框架画面里。WinCC里可以用画面窗口来做这个框架顶栏固定显示项目名称、当前登录用户、当前时间、报警闪烁灯左侧放导航菜单。这样后期增加新画面时只需要在主框架里加一个按钮所有其他画面自动获得一致的布局非常省事。变量树设计我强烈建议大家按工艺段来组织。比如RawWater_Pump_Status原水泵状态PreTreat_MultiMedia_Filter_DiffPress多介质过滤器压差RO1_Feed_Pressure一RO进水压力EDI_Product_Water_ConductivityEDI产水电导率命名规则用工艺段设备类型参数的格式统一用小驼峰或者下划线分隔这样变量多了也不会乱。WinCC 7.5里可以按结构树建目录PLC侧的变量也可以通过导入功能直接映射过来不用一个个手敲。2.3 模板复用思路画面窗口、面板类型与脚本这套模板的核心复用单元是我自己做的一个通用设备操作面板。在WinCC中面板Faceplate是一个很强大的功能——我可以把一台泵的所有元素状态灯、启停按钮、运行时间累积、故障复位按钮、手自动切换打包成一个面板对象然后重复用在原水泵、一级高压泵、二级高压泵等所有泵上。每台泵只需要关联不同的结构变量面板里面的动画连接和脚本逻辑可以全部复用。阀门的面板同理包含阀位显示、开关按钮、故障状态、开到位/关到位指示灯。仪表的面板则包含实时值显示、量程上下限、工程单位、报警状态色。变量结构方面我推荐在PLC里就建好UDT用户自定义数据类型比如一个泵的结构包含运行信号、停止信号、故障信号、远程信号、启动命令、停止命令。WinCC导入符号后这些结构变量会以结构名.成员名的方式呈现正好能匹配面板的属性连接。这一个设计直接解决了我以前做项目时一改了PLC变量WinCC画面全部断链的噩梦。脚本方面这一套模板里我用到了几类常用脚本C脚本用于画面对象的事件触发比如按钮按下执行置位、弹窗打开时动态填充设备名称和值等。VBS脚本用于处理时间戳、报表打印、Excel数据导出。组态内部变量动作比如某个液位超过设定值时驱动颜色变化动画和弹窗。初学的时候建议多用C脚本WinCC 7.5的C脚本语法跟标准C语言一致网上样例也最多。虽然现在WinCC也可以用C#写脚本但C脚本在7.5里最稳定、兼容性最好我后面踩坑的很多问题经验就是在C脚本的写法上细致一点就能避开。3. 核心场景控制逻辑的实现细节这一部分是全篇的干货重点。组态画面做得再漂亮如果控制逻辑在画面上表达不准、操作不顺手车间操作员用几天就想骂人。我把纯水系统里最关键的几个场景控制逻辑逐个拆开讲。3.1 泵组顺序联动与联锁保护纯水系统的泵不是独立的。以原水泵为例它的启动条件是原水箱液位不低于低低限值比如0.5米并且原水进水电动阀已开到位。停车条件是原水箱液位低至低限0.8米以下持续5秒或者接收到了急停信号。这些逻辑全部在PLC里实现WinCC上位机只负责两件事把泵状态和联锁条件状态显示在画面上以及在操作员点击启动按钮时先弹出一个确认窗口提示原水箱液位当前1.2m进水阀已开到位确认启动原水泵。这个确认弹窗的操作我用了面板里的自定义属性来完成。在创建泵面板时我预留了一个联锁状态提示字符串变量每次弹窗前用一段C脚本把所有联锁条件的状态拼成文本传进去。这样操作员能理解为什么有些情况下泵启动不了——每一次启动被拒绝画面上会明确告诉他哪一条条件不满足。高压泵是第二个关键泵。高压泵启动前必须满足膜前压力大于0.1MPa、进水流量不低于某阈值比如2m³/h、低压压力开关闭合。这些条件如果有一个不满足高压泵立刻停并报警因为RO膜最怕无水空转和高压冲击。画面上我单独做了一个RO膜状态指示区将膜前进水压力、膜后浓水压力、压差、产水流量、回收率都做成一个表格一目了然。泵的联锁停机条件我总结了最常见的几条出水母管压力过高超压保护比如超过1.6MPa立即停泵进水压力过低防止吸空电机过载热继电器反馈所在工艺段的手动急停按下与之联动的下游设备故障停机3.2 液位、流量与PID控制的画面数据绑定纯水项目里面PID控制不多但有一个典型场景是纯水箱液位控制供水泵变频。水箱液位高了就降低供水泵频率液位低了就提高频率维持出水压力稳定。这个PID回路我放在PLC里做上位机画面需要提供三个要素手自动切换按钮、设定值修改框、当前实际值显示。注意一个WinCC的细节设定值修改框要用输入输出域控件并且要连接PLC里的PID设定值变量属性改为输入/输出。直接在画面上双击就能输入新数值回车后写入PLC。这里建议在控件的操作员输入授权里做一下分级控制普通操作员只能看不能改技术员以上权限才允许修改设定值。流量累积是另一个小坑。纯水系统经常需要统计今日产水量累计产水量这事情可以在PLC里用高速计数加定时中断来实现也可以在上位机通过脚本对模拟量积分。我推荐在PLC里做因为WinCC的重启/死机不会影响PLC侧的累积数据。画面上加一个累积量清零按钮但必须设置权限和确认弹窗防止操作员误清零导致统计数据丢失。这个按钮我会再做一层保护只有管理员登录时可见其他角色登录时按钮灰化。3.3 报警与事件分级、弹窗、声音联动报警设计是纯水项目中操作员感受最直接的部分。我按照严重程度把报警分成了三级一级报警急停、超压、缺水红色闪烁触发声音报警自动弹出报警窗口追溯到具体设备。二级报警液位低限、电导率超标、压差偏高黄色闪烁触发声音提示需要确认但不弹窗。三级报警维护提醒、运行时间到、一般性的状态变化只在报警记录中显示不闪烁不声音。WinCC 7.5的报警管理系统里可以设置不同类型、不同优先级的声音文件。一级报警我用的是系统自带的急促蜂鸣声二级报警用一个平缓的提示音。这里有一个大家容易忽略的地方声音报警必须在WinCC项目的运行系统属性中启用报警选项里的声音文件而且在计算机上要有声卡和音频输出。如果现场操作员抱怨没声音八成就是这几处没设置。报警弹窗的实现我用了画面窗口脚本的方案当触发一级报警时C脚本动态将画面窗口导航到报警弹窗画面并在弹窗中显示报警文本和当前时间操作员点击确认后弹窗关闭。这个方案的坑之一是如果画面窗口的显示属性没有正确设置回false弹窗会被卡住关不掉后面我在常见问题里会详细说。4. 实操过程从建项目到画面动画完整走一遍这部分是写给正在照着做的人每一步都是我在现场摸索后总结出来的顺序。按这个顺序走能少走很多弯路。4.1 新建项目与PLC连接配置打开WinCC 7.5第一步是新建项目。在WinCC项目管理器里选择单用户项目命名项目名称建议用项目编号加地点比如ZW-PURE-001存放路径务必不要放在C盘系统盘避免系统还原或重装时项目文件丢失。第二步是添加通讯驱动。在项目树的变量管理上右键选择添加新驱动选择SIMATIC S7-1200/1500通道然后新建通道连接填入PLC的IP地址和机架/槽号S7-1500默认机架0槽号0。连接建立之后我的习惯是先不做变量导入而是在PLC侧用TIA打开程序确认变量的绝对地址和符号名导出符号表CSV。然后在WinCC变量管理里通过从CSV导入把符号表导入到对应连接下导入时选择映射全部变量。这一步能节省至少一上午的手动建变量时间。通讯连接有一个参数值得检查在连接的属性里数据采集周期建议设500ms或1秒。如果太快比如100ms在点数多时会给PLC通讯模块造成不小的负担太慢比如5秒操作员会感觉画面卡顿。4.2 变量建立与画面对象动画连接变量建立完进入图形编辑器。我的建议是先做总览画面的框架背景色统一用深蓝色RGB 18, 34, 56图元线条用白色或浅灰设备图形用标准色——泵用绿色表示运行、红色表示故障、灰色表示停止阀门到位用绿色未到位用红色。颜色规范定好以后整套画风会非常统一客户看了也专业。添加一个泵图形双击打开对象属性。在几何里设置大小在颜色里用动态对话框绑定到泵状态变量。动态对话框是WinCC最基础也最重要的功能之一——在属性右侧的闪电图标上点击选择动态对话框设置触发变量为...Pump_Status数据类型选二进制然后分别给0和1赋值绿色和灰色。泵启停按钮的实现有两种常用方式一种是直接在图形上叠加一个不可见的按钮对象按钮事件里写C脚本另一种是用右键菜单或工具栏。我更推荐第一种因为现场工人习惯直接点设备本身。按钮的C脚本代码大致如下#include apdefap.h void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName) { SetTagBit(Start_Pump1, 1); }注意启动命令是短暂的脉冲信号PLC里把这个点做成置位-延时-复位即可。阀门的动画连接同理开到位显示绿色关到位显示黄色故障时红色闪烁。闪烁需要在闪烁属性里配置两个颜色并启用闪烁频率一般一级报警用1Hz闪烁。4.3 报表与趋势的配置要点趋势控件是操作员判断系统是否健康的重要工具。我用WinCC的WinCC函数趋势控件来显示四个关键参数的历史趋势原水箱液位、一级RO进水压力、二级RO产水电导率、纯水箱液位。趋势控件配置的核心是将数据源设为归档变量即需要先在变量记录里把这几个变量添加到归档列表并设置采集周期。我的建议是液位和压力的归档周期15秒电导率1分钟这样既保证了曲线精度又不至于让归档文件膨胀得太快。报表方面我做了日报表和月报表通过VBS脚本定时触发打印。日报表的内容包括当日产水总量、平均产水电导率、系统运行时长、各泵累计运行时间、报警事件数量汇总。VBS脚本里调用Excel对象生成表格再通过WinCC的打印功能输出。5. 常见问题与排查技巧实录这部分整理的每一个问题都是我在这个项目以及以前项目中实际踩过的坑我按症状-原因-处理方法的形式记录成速查表方便大家直接对照。5.1 弹窗关闭一次就打不开WinCC画面弹窗关闭一次就打不开是很出名的一个问题。症状是第一次点击报警弹窗正常显示关闭后再点击其他设备的弹窗就没反应了。原因一般是画面窗口的关闭脚本中把画面窗口的显示属性置为false后没有重置画面窗口内的页面名称为空或者弹窗对象本身被置为不可见后再次打开时触发的条件不满足。我的处理方法是在每个弹窗按钮的C脚本里先设置画面窗口的Visible属性为true再设置PageName属性关闭按钮里只做Visiblefalse不改PageName。同时检查画面窗口的属性中激活是否勾选如果取消勾选页面就无法加载。另外在WinCC 7.5中同一个画面窗口对象优先复用不要在画面里放多个画面窗口弹窗。5.2 画面整体往左右偏移怎么调整画面整体偏移通常发生在运行分辨率和组态分辨率不一致下载情况下。我在这个项目里组态时用的是1920x1080但现场操作员站实际分辨率是1366x768结果画面整体被向左压缩底部出现白条。解决办法有两个一是在运行系统属性里把窗口布局设为适应窗口大小但这会让字体和图形变形二是建议在组态阶段就把目标电脑的分辨率问到并统一使用该分辨率做画面。现场显示器务必把缩放比例设为100%Windows系统显示缩放如果设成125%WinCC画面会发虚偏移。5.3 C脚本语句未结束报错WinCC的C脚本编译器对分号和括号非常敏感我经常因为某个字符串里多了一个半角引号导致报语句未结束。排查技巧是把脚本复制到记事本中逐个括号检查成对关系尤其注意字体是全角还是半角。另外WinCC的C脚本里字符串必须用英文双引号括起来不能用单引号也不能用中文双引号。5.4 WinCC组显示控件使用问题热词里提到的组显示控件也就是WinCC的Control Container和对象集合显示在纯水项目里常用来做多个同类型设备的总览。比如我要在预处理画面里同时显示四台阀门的开到位状态就可以用组显示控件绑定到四个不同变量。最容易踩的坑是组显示控件的间接属性不支持跨画面访问导致画面切换后控件空白。我建议这个功能只用于单画面内跨画面访问还是老老实实通过过程值归档变量来做。5.5 变量显示##或通讯质量掉线在WinCC画面出现###表示变量无法访问通常是通讯通道配置错误或变量名没有对应。处理方法是打开变量管理在对应连接上右键测试看质量代码是0还是非0。质量代码为0表示通讯中断检查IP地址、机架槽号、网线物理连接质量代码非0但值异常检查变量地址是否超出PLC地址范围。还有一个隐蔽问题是S7-1500默认仅允许激活PUT/GET通讯后才能被WinCC访问很多人没在PLC属性里打开这个选项导致连不上。在TIA中打开PLC组态属性勾选允许从远程伙伴PUT/GET通讯进行访问下载后重新连接即可。我在实际调试中还发现WinCC访问S7-1500的数据块时如果DB块设置了优化访问部分数据块无法直接读取。需要把需要上位机访问的DB块取消优化属性选择标准访问。这一点特别容易忽略排查时间非常长。5.6 运行一段时间后归档文件暴涨纯水项目是7x24小时不间断运行的如果所有变量都归档且周期很短历史数据文件会快速膨胀最终磁盘满后WinCC运行性能明显下降。建议把归档存储在非系统盘并设置段大小和备份策略。归档周期按变量重要性做区分关键报警变量不归档只走报警记录。实操小技巧WinCC安装目录下的ProiectData\ArchiveManager会按小时生成数据段文件默认会保留所有历史。如果甲方只需要保存三个月可以在变量记录里开启运行数据多级存储时间超过三个月后自动删除旧段。我通常设置为90天自动清理一次。5.7 操作按钮被卡住点一下触发多次这个问题很烦人。症状是操作员点击一次启动按钮PLC收到的启动脉冲却触发了两次甚至更多次。原因通常有两个一是鼠标点击事件和键盘触发事件同时发生比如按钮在点击时获得了焦点并触发了空格键二是WinCC按钮的按左键和释放左键两个事件里都写了触发脚本。正确做法是只使用按左键或释放左键其中一个事件。我习惯用按左键加短脉冲输出另一事件留空。另外PLC侧的启动命令一定要写成置位-定时-复位不要用置位后手动复位这样可以抵抗上位机偶然的多余脉冲。6. 模板复用的扩展思路与实际效果这套模板我在这个纯水项目里完整落地后后续又拿到了类似的两套小型净水项目直接把模板复制过去只改了变量表、画面文字描述和少量工艺参数每个项目从组态到联动调试只花了一周时间。这就是模板投入时间的价值回报。如果你想让这个模板进一步扩展我建议关注两个方向。一个方向是Web发布。WinCC 7.5支持Web Client和Web Server功能可以让工艺主管在办公室通过浏览器看到水站的实时画面和趋势数据不用跑到中控室。这个功能在纯水项目中很受欢迎因为水站往往离办公区比较远。但要注意Web Client需要单独授权而且画面中某些ActiveX控件在Web浏览器里可能不兼容要提前测试。另一个方向是移动端报警推送。纯水系统夜间无人值守时一级报警如果没人看到就会造成水箱溢流或者设备空转。可以通过WinCC的报警系统对接第三方短信模块或微信通知接口用VBS脚本在报警触发时发送HTTP请求。我在一个项目中用一台工控机加4G短信模块实现了这个功能虽然代码写得不复杂但实际效果极好甲方的运维人员终于不用大半夜被电话吵醒了——他们直接收到一条短信上面清楚写着哪一台设备、什么报警、几点几分。说到底WinCC做上位机有点像一个手艺活。同样的功能不同人做出来的可靠性和易用性差距可以很大。我的体会是真正值钱的从来不是你会拖几个控件而是你懂现场工艺、理解操作员的痛点、知道哪些环节容易出事故。组态模板只是把这些经验和规范固化下来的载体让下一次做类似项目时可以站在自己的肩膀上而不必重复踩坑。
