1. 项目背景:这套系统到底在解决什么工艺问题
先把这个项目放在真实场景里说清楚。水处理厂的滤液,说白了就是污泥脱水机(板框压滤机或者离心机)压出来的那部分液体,这部分水不能直接排放,也不能直接进清水池,必须回送到生化段重新处理。生化段一般包括调节池、厌氧池、缺氧池、好氧池(曝气池)、二沉池这几个主要单元,核心工作就是让活性污泥里的微生物把水里的氨氮、COD、总磷这些东西吃掉。
我接到这个项目的时候,现场已经有一套老旧的S7-300系统在跑,但运行状况不理想,主要问题有三个:一是故障率高,模拟量模块老化严重,液位计信号飘得厉害;二是上位机还是WinCC 6.0的老架构,画面粗糙,报警查询卡顿,操作权限管理基本没有;三是工艺流程改了,增加了碳源投加和除磷加药两路控制,老系统I/O点不够用了。甲方提的需求很明确——重新做一套完整的控制系统,PLC用西门子1500系列,编程软件用博途V16,上位机用WinCC 7.5,把滤液生化段这十几个池子的设备全部纳入监控,同时预留与厂级中控系统的通讯接口。
这个项目最有代表性的地方在于,它是很典型的中小型水处理生化段改造场景:点数不算多,大概一百多个I/O点,设备类型却不少,泵、风机、阀门、搅拌器、加药泵都有,还涉及模拟量(液位、流量、pH、DO、温度)。如果你之前只做过单一设备控制的案子,或者只写过小型1200的程序,这套项目的整体架构思路还是很值得参考的。文章后面所有内容,都是我实际做完这个项目之后整理出来的,靠谱程度可以放心。
2. 硬件选型逻辑:1500PLC与WinCC7.5为什么这么配
2.1 CPU和模块选型的考量
S7-1500系列里,CPU的选择范围挺宽,从1511到1518都有。我这次选的是CPU 1513-1 PN,看中的是它的性能刚好卡在这个项目的需求上——程序大概要跑两万多个指令,模拟量处理集中在几个泵站和生化池,浮点运算有要求但不算极端,1513的运行速度完全扛得住,而且集成了PROFINET口,后续扩展以太网设备很方便。
不过这里要提醒一句:选CPU别只看点数,要估算一下程序复杂度和通讯负载。如果你将来想挂七八台触摸屏、再连一套上位机,还要做远程监控,那1511可能有点吃力,直接上1515更省心。我第一次做类似项目就低估了通讯压力,结果运行半年后发现CPU扫描周期被通讯任务拖慢,这种暗亏不值得踩。
输入输出模块方面,我用了三块模块:
| 模块型号 | 用途 | 数量 |
|---|---|---|
| DI 16x24VDC | 设备运行反馈、故障信号、手自动切换 | 2块 |
| DO 8x24VDC/2A | 控制接触器/继电器,驱动泵阀启动停止 | 2块 |
| AI 8xU/I | 液位、DO、pH、流量等模拟量信号采集 | 3块 |
AI模块选了8路的,虽然项目前期用不了这么多通道,但预留出30%的余量是必须的。水处理行业有个特点,调试阶段和生产稳定期会陆续增加监测点,比如总磷在线仪、氨氮在线仪,这些都得走模拟量通道。如果通道卡得太死,后期加一个测点就要再配一块模块,费用翻倍不说,柜内空间也麻烦。
2.2 通讯架构与仪表接入
这套系统的通讯架构我最终搭成了三层:
- 现场仪表层:pH计、DO仪、液位计、电磁流量计,全部走4-20mA标准信号接入AI模块。有些仪表本身带Modbus RTU通讯口,但我说实话,水处理行业的现场环境干扰严重,Modbus RTU走线远了容易出问题,我宁可用硬接线,稳定可靠第一。
- PLC层:CPU 1513-1 PN作为PROFINET主站,带两路IO设备(其实就是前面那几块分布式模块)。控制柜内走标准PROFINET网络,用西门子原装网线,屏蔽层处理好,避免和动力电缆同槽走线。
- 上位机层:WinCC 7.5通过以太网直连PLC的PROFINET口。我单独划了一个VLAN给控制网络,和办公网隔开,既保证实时性,也减少网络风暴风险。
为什么WinCC 7.5能直接连1500?因为S7-1500内置了S7通讯协议,WinCC通过"S7-1500"通道类型的TCP/IP连接就能访问PLC数据区,不需要额外装什么OPC中间层。这个方案比老旧的S7-300时代要简洁太多。项目里我只在PLC侧设置了连接机制,上位机侧加入了该通道的S7-1500驱动,填好IP地址和数据块访问权限就通了,这点后面细说。
2.3 从电气柜到控制柜的布局注意事项
这个项目的柜内设计,我踩过一次小坑,值得拿出来说。PLC柜和动力柜虽然是分开的,但我一开始把模拟量信号线和24V电源线在同一个线槽里走了将近两米,结果调试的时候DO信号一动作,AI通道的液位读数就跳一个字。后来把所有模拟量信号线改成屏蔽双绞线,屏蔽层单端接地,和动力线分开两个走向,信号立刻干净了。
另外,继电器输出模块驱动中间继电器时,一定要在继电器线圈两端并接续流二极管,不然断电瞬间的反向电动势会拉高邻近信号线的电位。这个细节看起来不起眼,很多入门工程师容易漏掉,实际现场就是因为它,我排查了整整一个下午。
3. 博途V16里的程序架构与核心逻辑
3.1 程序块划分与数据管理
博途V16写1500的程序,和老300/400梯形图时代最大的区别,就是结构化程度能拉得很高。我这次的程序架构分为四层,跑下来非常舒服:
- OB100(启动组织块):做初始化,包括中间变量清零、模拟量通道初值写入、通讯状态字复位。
- OB1(主循环):组织调用,按工艺顺序扫描。
- FB块(功能块):每个设备一个FB,比如"进水提升泵FB"、"曝气风机FB"、"加药泵FB",FB内部封装了启动条件判断、运行计时、故障联锁、状态输出。
- FC块(函数):处理共性逻辑,比如模拟量工程量换算、报警判断、通讯数据打包。
变量管理上,我的原则是:设备控制用全局DB,报警状态单独用一个DB,上位机读写的数据全部集中映射到两个DB块。这样WinCC访问的时候逻辑清晰,不用翻遍整个PLC找地址。比方说,所有设备的手动/自动模式切换、启停命令、运行反馈、故障状态,我统一放在"DB_Device_Ctrl"这个DB里,上位机画面读取这个DB就算完事了。
3.2 几个核心控制逻辑的实现细节
进水泵的液位联锁控制。调节池液位控制两台进水泵,原则是"一用一备,根据液位高低自动切换"。我用的是区间控制法:液位低于低低限(比如1.5米)停泵,高于启泵限(2.0米)启泵,高于高高限(3.5米)报警并启动备用泵。注意这里启停限必须加回差(滞回区间),不然液位在临界点附近波动时,泵会频繁启停烧接触器。很多新手写第一版就漏了这个回差,实际工程里这是很致命的问题。
曝气风机的DO联锁控制。好氧池溶解氧(DO)是生化处理的核心指标,太高浪费电能、太低污泥要死。控制思路是:DO传感器实测值和设定值(比如2.5mg/L)做偏差,偏差大就加风机台数,偏差小就减台数。我做了三台风机的轮值启动逻辑:每台风机的累计运行时间记录在DB里,启动时优先选择运行时间最短的那台,这样避免某一台风机天天转、另外两台躺平,磨损不均衡。
加药泵的定时与外部触发双模式。碳源投加和除磷药剂投加,我用了两种控制方式:定时定量模式(每天固定时间段,按设定频率运行)和液位联动模式(进水泵运行时同步启动加药泵,按比例跟随)。具体选择哪个模式,在中控画面上用按钮切换,PLC内部通过一个MOVE指令把选择位传递到FB的使能条件中。
3.3 模拟量处理与报警体系
模拟量处理这一块,我强烈建议你在博途里专门写一个FC块,统一做工程量换算和滤波,而不是依赖模块自带的原始值。我的习惯是:读取PIW原始值(比如6820),先按量程换算公式转成工程量(实际液位米数),再做一阶惯性滤波(平滑系数0.2~0.5),最后把结果存到全局DB。这样做的原因是:水处理现场液位信号本来就有液面波动,不做滤波的话,画面上液位数字会一直跳,操作员看着心里发慌。
报警体系我用的是S7-1500自带的报警系统,在程序里通过"Program_Alarm"指令主动触发。每个设备定义了三类报警:
- 故障报警(红色):比如接触器反馈丢失、电机过载,联锁停机
- 警告报警(黄色):比如液位高高、压力偏高,不停机但提示操作员关注
- 系统性提示(蓝色):比如通讯中断、模拟量断线
报警文本存放在PLC内部,WinCC通过S7-1500通道能直接读取并显示在报警控件里,不用在WinCC侧再维护一份重复的报警记录。这个省了我大量后期工作量,因为所有报警内容都跟着PLC走,上位机只是展示端。
4. WinCC7.5画面从0到1的过程
4.1 变量管理与通道建立
WinCC 7.5和博途V16之间的变量连接,其实不用特别的"系统组态",我实际操作是这样的:
- 在WinCC的变量管理里新建驱动连接,选"S7-1500"通道。
- 填写PLC的IP地址(比如192.168.0.10),确认访问点名称和PLC侧保持一致。
- 单个变量逐个创建,或者用"从PLC上传变量"功能把全局DB变量批量导入。
这里有个实用的坑要提醒:WinCC 7.5的"S7-1500"通道是受版本授权影响的,有些精简版不允许用这个通道,只能走OPC。做项目之前先确认你的WinCC版本授权是否含该通道,不然配置到一半发现没法用就尴尬了。我这次用的是WinCC 7.5 SP2专业版,一切顺利。
变量组织上,我建议在WinCC里也建立一个和PLC侧一致的层级结构,比如"生化池_好氧池"、"调节池_提升泵"这种分组,方便后续维护。变量名保持和PLC注释一致,尽量不缩写,否则几个月后自己都看不懂。
4.2 画面布局与操作逻辑
WinCC的画面我分了五个主画面,配合画面树切换:
- 总览图:整条滤液生化段的工艺流程图,布置主要设备的运行状态指示灯和关键参数。
- 生化池监控:四个生化池的详细画面,包括DO、pH、温度实时值,风机启停按钮。
- 泵站控制:各泵站的操作面板,启停按钮、手自动切换、故障复位。
- 报警归档:调出报警控件,按时间、类型筛选。
- 趋势分析:历史趋势控件,查看液位、DO、pH的历史曲线。
操作逻辑上,所有设备的启动按钮在画面里都加了二次确认弹窗,防止误触。每次点"启动",会弹出一个对话框显示"确认启动3号提升泵?",操作员点"是"才发送命令。这也是现在很多水厂安全规范的要求,不能一个按钮直接就把电机启动了。
画面里还做了一组"设备状态颜色约定":绿色=运行、红色=故障、灰色=停止、黄色=手动模式。这个看起来是小事,但是统一颜色规范后,操作员扫一眼总览图就能判断整条线的大致状态,效率高很多。
4.3 归档、报警与权限配置
WinCC的变量归档是必须做的,不然历史趋势和报表全是空的。我归档了液位、DO、pH、流量、累计电量这几类关键参数,归档周期设为1秒,存储方式选"周期+事件触发"。1秒的归档精度对水处理工艺分析完全够用,而且不会产生过大的数据文件。如果你硬要0.1秒归档,几天下来硬盘就爆了,没必要。
报警归档要和PLC侧报警联动起来。我在WinCC里添加了报警控件后,配置了报警类别和颜色:故障报警红色闪烁、警告黄色、提示蓝色。同时把报警声音打开,一旦有故障,中控室能第一时间听到蜂鸣声。这里要特别提醒:WinCC的报警记录和变量归档是收费组件的,如果你的授权版本没有这两个功能,需要单独装RT扩展包,费用不低。做项目预算时要提前问清楚。
权限管理这块,我按水厂习惯分了三级:管理员(最高权限,可以修改设定值、修改配方)、操作员(可以启停设备、确认报警)、监视员(只能看画面,不能操作)。WinCC的用户管理可以直接在项目里建账号,每个账号指定访问权限等级,然后在画面对象上设置允许操作的角色。比如PID设定值输入框只允许管理员修改,操作员点了会提示无权限。
5. 联调阶段真实遇到的坑与解决记录
5.1 WinCC与PLC通讯不稳定的排查
联调第一天,我就遇到了一个头疼的问题:WinCC画面上有的变量刷新正常,有的却偶尔跳成灰色(通讯中断),过了几秒又恢复。排查过程大概花了两小时,最后定位到两个原因。
第一个原因是PLC侧和WinCC侧的连接资源数不匹配。WinCC通过S7-1500通道建立连接时,默认会关联多个连接资源,但PLC端如果之前调试时开了别的HMI连接,导致连接数被占满了,新连接就会间歇性断开。解决办法是:在PLC硬件组态里把"连接资源"数量调大,至少保证留出5个以上空闲连接。
第二个原因是WinCC的变量读取周期太密。我一开始图省事,把所有变量刷新周期都设成了100ms,结果上百个变量的通信请求排队,有的请求就超时了。后面按重要程度分了三档:控制操作类变量(启停按钮、模式切换)刷新100ms,过程监视类变量(液位、DO)刷新500ms,统计类变量(运行计时、累计流量)刷新1秒。改了之后通讯稳定多了。
5.2 模拟量信号干扰的现场处理
前面提到AI信号跳变,但联调过程中还遇到更隐蔽的情况:曝气池的DO信号白天正常,一到晚上波动就加大。查到最后发现,晚上风机高负荷运行,变频器产生的谐波干扰通过电源线耦合进了仪表信号线。现场解决方案有两个:一是给DO仪表供电加了一台隔离变压器,二是把信号线从靠近变频器的桥架挪到了另一侧,并且在PLC侧AI模块的通道上设置了20ms输入滤波。处理后信号就稳了。
这个事给我的教训是:做水处理项目,现场干扰问题不是"会不会有",而是"什么时候有"。你必须在程序设计阶段就把信号滤波和断线检测做进去,否则后期上生产了再补,麻烦事更多。
5.3 程序版本与调试经验小结
最后聊点项目管理的经验。这个项目里PLC程序在博途V16里做了多个版本迭代,每次修改程序我都会导出带版本号和日期的存档文件,比如"water_biochem_V2.3_20240315"。有一次改了模拟量滤波参数后,运行效果反而变差,靠版本比对半小时就找回了之前好的配置,避免了大返工。
WinCC项目文件也一样,我建议在项目开发阶段就建一个"版本存档"文件夹,每个阶段快照压缩存一份。WinCC项目文件体积大而且很多临时文件,建议用项目复制器工具备份,别直接复制文件夹,不然容易缺文件导致项目打不开。
另外还有一个很实际的小技巧:PLC程序和WinCC画面的变量名一定要在开发前统一定义好风格。我这次先做了一个"变量对照表"Excel文档,把PLC全局DB变量、WinCC变量名、画面绑定的内部变量全部列在一张表里,开发过程中随时对照。这个表不仅帮我节省了大量查找变量地址的时间,后期移交给甲方工程师时,对方照这个表就能快速接手维护,评价非常高。
"最后再分享一个小技巧:如果你后期要在WinCC里增加一个新的历史趋势,记得先确认PLC里面对应的变量已经启用了归档功能,不然WinCC只显示瞬时值,历史曲线是断的。这个坑我见过不少同行踩过,提前说一句,能省你一下午。"