十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

S7-1500与WINCC在VOCs治理项目中的全套实战解析

S7-1500与WINCC在VOCs治理项目中的全套实战解析 这两年大气治理项目我前前后后做了不少从烟气脱硫脱硝到VOCs废气处理设备清单里几乎都绕不开西门子S7-1500 PLC和WINCC这对组合。说实话这个搭配在环保行业里已经算“标准答案”了现场信号多、联锁条件复杂、需要大量趋势记录和报表普通触摸屏根本扛不住而S7-1500加上WINCC既能保证程序可靠性又能把上位机画面做得像样。这篇文章就把一个实际的VOCs治理项目从头到尾拆开讲一遍从机柜里硬件怎么选、网络怎么搭到PLC程序怎么写、WINCC画面怎么组态再到现场调试遇到的坑全都掏出来。适合正在做环保项目、或者刚接触S7-1500和WINCC的自动化工程师参考。1. 项目全景这套系统到底在控制什么1.1 工艺流程与测点分布先交代一下背景。我做的这个项目是某工业园区的VOCs废气集中治理装置处理风量大概在每小时几万立方米级别。工艺路线是“预处理活性炭吸附催化燃烧CO”废气经过前置喷淋、干式过滤去除颗粒物和部分水汽再进入吸附罐浓缩脱附后的高浓度废气进入催化燃烧炉氧化分解最终通过烟囱排放。这样一套工艺控制对象相当杂。风机有大有小有送风机、引风机、脱附风机泵类有喷淋循环泵、加药泵还有补气阀、冷却阀、电动阀门、调节阀。测量点更多温度、压力、差压、液位、流量、氧含量、LEL浓度、VOCs浓度粗略统计下来数字量DI/DO各三十多点模拟量AI接近五十个AO八个左右。我把主要测点整理了一下供大家估算点位时参考信号类型点数具体对象DI数字量输入36电机运行反馈、故障、阀门开关到位、急停、硬接线联锁DO数字量输出32电机启停、电磁阀、声光报警AI模拟量输入48温度、压力、差压、液位、流量、LEL浓度、VOCs浓度AO模拟量输出8调节阀开度、变频器频率给定通讯类数据若干CEMS在线监测、32台变频器运行数据1.2 控制需求拆解这类项目的控制需求表面看是“风机启停、阀门开关、数据监控”但真正做起来有几个难点。第一是联锁条件多。启动前必须检查压缩空气压力、冷却水流量、烟囱挡板位置、吸附罐阀门状态、急停按钮有没有复位这十几个允许条件全部满足才能启动。运行中出现任何一个危险状态比如燃烧炉温度超过上限或者LEL浓度突然超标系统要在几百毫秒内完成跳停不能依赖操作员肉眼判断。第二是顺控逻辑。吸附罐不是一直固定工作的A罐吸附、B罐脱附到时间切换阀门要按顺序动作。切换过程要是顺序写错轻则憋压重则出安全事故。第三是需要大量历史数据。客户不仅要求实时看温度压力还要求每台环保设备的启停记录、烟气排放数据报表能保存几个月随时能查。这块光靠PLC根本不够必须配WINCC这类上位机做变量归档和报表。1.3 为什么选S7-1500和WINCC说实话现在做中大型大气治理项目S7-1500基本是避不开的选择。项目点数超过一百点、联锁逻辑复杂、还要支持PROFINET和Modbus TCP并行通讯S7-300的老平台确实有点吃力S7-1200的程序容量和连接资源又不够宽裕。S7-1500不管是程序存储、通讯资源还是指令执行速度都更适合这类“信号多、逻辑重、通讯复杂”的场景。上位机我选了WINCC主要是三个原因一是项目要带报表和归档WINCC自带的变量记录和报警记录功能成熟不用自己造轮子二是第三方设备CEMS、废气在线仪提供OPC UA或Modbus TCP接口WINCC对接方便三是后续业主还要上MES系统WINCC做OPC UA服务器可以把数据直接开放出去。后面我会专门讲OPC UA配置这块。2. 项目硬件选型与现场网络架构设计2.1 PLC站硬件配置我最终选的CPU是1515-2 PN配合PM 1507电源模块。很多人问为什么不上1511够用就行。我解释一下1511-1 PN虽然便宜但程序容量和通讯资源都比较紧张现场又要拖分布式IO又要拖第三方网关算下来很勉强。1515-2 PN的工作内存和连接资源明显宽裕后期业主加个触摸屏、加个数据网关也扛得住。数字量模块我用了16点输入和16点继电器输出继电器输出便于隔离、维修时也好查线。模拟量模块选的是8通道AI和8通道AO均支持4-20mA/0-20mA/0-10V切换。有一点要注意AI模块的通道如果接4-20mA两线制变送器要确认模块是否提供变送器供电如果不提供就得买带配电的安全栅或者用隔离配电器这个细节在订货时特别容易漏。2.2 分布式I/O与第三方设备接入项目现场机柜分了好几处设备区跨度大如果全部拉硬线到主柜电缆成本高不说查线还痛苦。我在设备区附近放了两套ET200SP分布式IO站跑PROFINET通讯现场的温度、压力信号就近接入再通过工业以太网和主站同步。这样既省电缆后期加测点也灵活。第三方设备接入是另一个大头。烟气在线监测系统CEMS我让仪表厂家配了Modbus TCP接口直接用网线接到交换机上PLC通过Modbus TCP指令读取排放数据再转发到WINCC。变频器这块现场一共32台PLC通过Modbus RTU轮询读取每台的状态、电流、频率同时下发启停和频率给定这一块我在后面第3.4节单独展开。2.3 网络层次划分与安全隔离网络层次我是这么搭的最底层是PROFINET设备网包含CPU、ET200SP、触摸屏、交换机中间是控制网WINCC服务器、工程师站通过工业交换机连接PLC上层管理网留给业主的MES系统通过防火墙路由器隔离。三个网段之间用路由和防火墙限制访问不能让外部随便访问到PLC。再说一下抗干扰。现场有变频器柜、大功率电机动力电缆和通讯电缆我严格分开桥架信号线用屏蔽双绞线屏蔽层在PLC侧单端接地。RS485通讯线加了120欧终端电阻PROFINET网线用的工业级屏蔽线。这些措施看着是基本功但现场干扰问题基本都能靠这些细节解决。3. PLC程序设计核心细节与变频器集群控制3.1 模拟量采集与工程量换算S7-1500里模拟量采集后默认整数量程是0到27648对应4-20mA。要把原始值变成实际的温度、压力工程值时千万别直接在指令里写死换算公式到处复制最好封装成一个FC或FB后面所有通道复用。我习惯用NORM_X做归一化再用SCALE_X做缩放例如一个量程0~200摄氏度的温度变送器输出4-20mA程序大致是这样的#RawTemp : AI_Temp_Raw; // 27648对应20mA0对应4mA #Normalized : NORM_X(MIN : 0, MAX : 27648, VALUE : #RawTemp); #Temp : SCALE_X(MIN : 0.0, MAX : 200.0, VALUE : #Normalized);要注意几个点一是断线检测4-20mA信号断线时模块输入会跳到一个接近32767的负值或特殊值程序里要做限制超过正常范围就给出断线报警二是滤波现场变频器干扰会导致模拟量跳动我在FC里加了简单的一阶滞后滤波时间常数设1秒左右曲线平稳很多三是工程量上下限和量程的单位要跟仪表量程保持一致这个出错率很高有人把0-200度的表当0-100度算画面数据错得离谱。3.2 电机启停与联锁逻辑电机控制我建议做成一个FB每个电机调用一个实例这就是多背景实例的好处。比如我建一个“Motor_Control”FB里面包含自动/手动切换、启动允许条件、综合故障复位、运行反馈监视、输出延时等功能。项目里有二十几台风机水泵每个电机生成一个背景DB逻辑只要写一次后续维护都方便。启动允许条件用数组或者Bool输入参数传入任何一个不满足就不允许启动。运行反馈监视特别重要如果输出启动命令3秒后没有反馈要报“运行反馈超时”这能帮你快速定位是接触器坏了还是电机保护跳了。下面节选SCL示意IF #AutoMode AND #StartCmd AND NOT #Running THEN #RunOutput : TRUE; END_IF; IF #TripSignal OR #Fault OR NOT #PermitAll THEN #RunOutput : FALSE; END_IF; IF #RunOutput AND NOT #Feedback THEN IF #FbTimer T#3S THEN #FaultFeedback : TRUE; END_IF; END_IF;程序里还有一个重点就是联锁的分级处理。急停、燃烧炉超温、LEL超标这类紧急联锁直接硬件回路或最高优先级逻辑跳停不能经过烦琐的条件判断慢慢来。联锁旁路开关只在调试阶段用并要在画面里明显提示“联锁旁路中”防止调试完忘记恢复。3.3 PID闭环控制回路实现项目里有几个真正的闭环回路一个是催化燃烧炉的补气阀控制炉膛温度一个是喷淋塔的加药泵根据pH值调节加药频率。这两类回路我都用S7-1500指令库里的PID_Compact FB来做。使用PID_Compact时几个关键设置要提前想清楚控制器方向正作用/反作用设错系统直接飞掉输出限幅必须设防止阀门全开全关造成振荡手动/自动切换要做无扰切换PID_Compact自带这个功能但要从手动切回自动前把输出同步好。现场整定经验我简单分享一下。温度回路采样周期2秒先纯比例试P从5%往上加观察曲线出现等幅振荡再往下退一半然后加积分积分时间设在30到60秒。压力回路响应快采样周期1秒P可以到20%到50%I设在5到20秒。关键不是参数有多标准而是看趋势曲线来微调我都是开着WINCC的趋势控件调一版看一版比纸上算靠谱得多。3.4 变频器Modbus通讯一台PLC控制32台变频器可行吗网上经常有人问一台PLC跟32台变频器做Modbus通讯可行不可行我的答案是可行但刷新周期和总线负荷必须先算清楚。我先说硬件方案。CPU上插两个CM1241 RS485通讯模块每个模块带一路RS485总线每路挂16台变频器。所有变频器站号不重复波特率统一19200数据格式8-E-1地址从1到16或17到32。RS485总线两端各加一个120欧终端电阻通讯线用屏蔽双绞线变频器侧最好用专用通讯端子而不是普通的信号线硬接。程序流程是每个CM1241端口接近一个主站用Modbus_Comm_Load初始化端口参数再用Modbus_Master指令按站号依次读取和写控制字。一个典型的轮询序列是站1读状态字当前频率站2读一直到站16然后再站1写启停命令频率给定站2写循环。每台读两三个寄存器加写两个寄存器一次从站交互大概要40到80毫秒加上超时和间隔一路16台跑完一个完整轮询周期大约3到4秒。这种刷新速度对风机来说完全够用因为风机本身的响应就是秒级的频率给定延迟一两秒没有任何问题。但要注意如果现场有工艺要求很高的快速变速比如PID闭环直接调频率那种轮询方式的延迟就会影响控制品质这种情况就应该改成每台变频器单独走PROFINET或者加硬接线模拟量给定而不是靠RS485轮询。Modbus报文解析时还要留意寄存器地址的偏移。不同品牌的变频器地址定义不一样ABB、施耐德、汇川的地址我基本都摸过了有的启停寄存器用十六进制地址2000有的用40001加偏移最好的办法是把每台变频器的通讯手册打印出来对照写。做32台通讯时我建议一开始先用仪表调试软件单台测通确认报文格式、寄存器地址都正确再批量编写轮询程序否则32台一起排查会让人崩溃。提示32台变频器分两路RS485总线每路16台刷新周期约3到4秒。如果工艺要求更高刷新速度优先考虑PROFINET或硬接线模拟量频率给定别硬扛Modbus轮询。4. WINCC画面组态、脚本报表与OPC UA实战4.1 画面规划与变量管理WINCC项目第一步不是急着画画面而是规划好画面树和变量。画面上我分了总览、预处理、吸附、催化燃烧、CEMS排放、报警、趋势、报表这几个页面。总览页把整套系统的关键运行状态用缩略图展示出来操作员不需要点进每个子画面一眼就能看到哪里报警了、哪台设备在转。变量管理这块我特别推荐用结构变量。比如定义一个“电机”结构类型包含运行反馈、故障、启动命令、状态等成员之后在变量管理里基于这个结构创建各台电机变量这样新增一台设备时所有属性自动带出来画面和报警里引用也清晰。WINCC变量建立后要和PLC地址正确对应连接设置里要建好驱动连接填对IP和访问点否则变量在运行时全显示“不可用”。还有一点WINCC里变量的“线性标定”可以用来做模拟量转换比脚本里写公式更直接。比如CEMS传来的NOx浓度地址原始值范围0到27648对应量程0到100mg/m³在线性标定里填好两个点画面显示值就自动转成工程值了省得每次在脚本里乘系数。4.2 画面弹窗、动画与循环脚本的实现“画面弹窗关闭一次就打不开了”这个问题很多同行都遇到过我来说说原因和对策。最常见的错误是用OpenPicture去打开一张弹出画面关闭时又把整张画面关掉导致再次触发OpenPicture时对象状态不对或者脚本里的打开标志没有被复位。正确做法是用“画面窗口”控件承载弹窗按钮的VBS脚本里调用SetPictureName动态设置画面窗口内容关闭时清空画面窗口这样不存在整个画面被关掉的问题。举个例子我在“风机操作面板”弹窗上做“关闭”按钮脚本大致是Sub ClosePopup(ByVal Item) SetPictureName PalmMain.PnlPopup, PnlPopup, End Sub打开时SetPictureName PalmMain.PnlPopup, PnlPopup, PnlFan101.Pdl这样无论打开多少次、关闭多少次画面窗口始终在主画面里只是内容在切换不会再出现一次就再也打不开的情况。另外注意弹窗画面里别放永久关闭主画面的函数我见过有人直接在弹窗的“返回”按钮里写ClosePicture把主画面也关了操作员瞬间蒙了。关于动画“WINCC静态文本几何属性里的位置X动态”这类问题其实很实用。就是把对象的“几何-X”属性连接到变量变量变化时对象水平移动。比如我想模拟废气在管道里的流动把一个文本或一个短线沿着管道方向平移就是给它的X坐标连接一个0到1的循环变量乘以移动距离。WINCC里可以用“动态对话框”直接连变量表达式也可以用C脚本。推荐用动态对话框做简单动画效率高不用编译。循环脚本的典型用途是统计设备累计运行时间、计算一些画面需要的辅助量。在WINCC全局脚本里新建C脚本设置周期触发为1秒脚本里用标准C读取变量、做加法、再写回变量。注意脚本里的变量存取要用GetTagDouble/SetTagDouble这类函数不要直接引用画面变量否则作用域不对。另外脚本运行频率不要太高能1秒解决的不要设100毫秒CPU占用率看着不高真到多画面并发的时候影响就出来了。4.3 历史趋势、报警记录与SQL报表大气治理项目要应付检查、要给业主提供排放报告历史数据和报表是硬需求。我的方案分两层第一层用WINCC自带的变量记录做归档把关键温度和CEMS数据每10秒归档一次报警记录也打开这满足日常趋势查看和即时报警查询。第二层做报表定时把数据导入SQL Server数据库客户需要月报时直接查库导出。关于“WINCC报表教程(SQL数据库的建立)”我给一个最直接的路径。先在SQL Server里建一个报表数据库建一张数据表字段包含采集时间、设备位号、数据值例如CREATE TABLE EmissionData ( SampleTime DATETIME, TagName NVARCHAR(50), TagValue FLOAT );然后WINCC里用一个VBS循环脚本每1分钟把当天累积的归档数据查询出来写入SQL。具体可以用ADO连接数据库也可以用WINCC自带的“全局脚本”写Dim conn, rs Set conn CreateObject(ADODB.Connection) conn.Open ProviderSQLOLEDB;Data Source服务器IP;Initial Catalog环保报表;User IDsa;Password****** ...真要“抄作业”的话我建议更稳妥的方式用WINCC的“变量记录”过程值归档在“归档组态”里选好变量组态好SQL Server连接归档数据本身已经写进了WINCC的数据库。报表环节直接用Excel或其他BI工具连这个SQL库查询就行不用自己重复写一遍采集逻辑。把这条链路搭通之后生成的日报表、月报表就完全自动了。4.4 WINCC做OPC UA服务器与远程访问配置现在很多项目不只是本地看画面还要给MES、智慧环保平台提供数据。WINCC里配置OPC UA服务器主要就是这几步在安装WINCC时选择安装OPC UA组件打开WINCC项目后在“计算机属性”里启用作OPC UA服务器配置端口默认是4860对外提供服务时防火墙要放行这个端口配置访问模式和证书安全要求不高可以先启用匿名访问正式环境建议用账号密码加证书。很多人在这一步卡住我提醒几个细节。第一OPC UA服务器名称格式一般是“opc.tcp://服务器IP:4860”客户端连接时建议填IP而不是计算机名避免DNS解析问题。第二配置完OPC UA必须重新激活项目最好重启一下WINCC的服务不然客户端连不上。第三如果WINCC服务器和客户端不在同一网段中间有防火墙除了放行4860端口还要看系统防火墙是不是拦截了独立程序的出站规则。要允许远程设备或者第三方系统访问PLCS7-1500这侧也要设置。博途里打开CPU属性在“防护与安全”菜单下把“允许来自远程对象的PUT/GET通信访问”勾上然后重新编译下载。这样第三方的OPC客户端或者数据网关才能通过S7协议直接读写PLC数据。提示正式生产环境建议在OPC UA和PUT/GET访问配置里启用访问列表限制可访问IP不要为了省事全部匿名开放。5. 现场调试踩坑实录与问题排查速查5.1 通讯中断、变量不刷新怎么查现场调试最耗时间的不是写程序而是排查那些“看起来通了但数据不动”的问题。我先给一个排查顺序第一看CPU的RUN灯是否正常诊断缓冲区有没有通讯故障第二看交换机、通讯模块的指示灯是不是闪得很乱第三用网线测试仪确认物理链路把水晶头重新压一遍的情况我都遇到过好几次第四在WINCC里看连接状态变量管理里连接如果是红色就是没有连上第五查防火墙PC的Windows防火墙经常把WINCC的通讯端口拦了直接把防火墙关掉或放行相关端口。有一次CEMS排放数据在WINCC画面上卡住不动了我一开始以为是WINCC变量连错了查了半天发现是CEMS仪表的串口死机了。后来我在程序里给CEMS的通讯数据加了超时判断超过60秒没更新就在画面上置灰并报警。这个思路我在其他项目里也一直用效果很好。通讯类信号不能只显示数值要同时显示它的“新鲜度”否则画面看起来是正常的其实是假数据。5.2 画面弹窗关闭一次就打不开的解决方案这个问题前面讲过对策现场再补充一个常见变体弹窗用的是“画面窗口”但关闭时没有清空这时虽然能再次打开但内容会被上一次的残留画面覆盖。解决办法是关闭按钮上同时执行“清空画面窗口”和“隐藏画面窗口”而且这两步之间有先后先清空再隐藏顺序反了会有闪烁。另外如果弹窗脚本里用了GetParentPicture这类函数注意画面名称大小写和结构一定要跟画面树一致WINCC在脚本里找对象是按名称匹配的名称错了脚本会报错但不一定弹提示症状就是按钮没反应。这类问题排查方法很简单在脚本里加几行MsgBox打印调试信息看到哪一步没执行就定位了。很多人嫌麻烦不写调试结果一调就是一整天。5.3 WINCC安装时数据库一直重启怎么解决关于“WINCC Flexible在安装数据库时一直重启”的问题这个确实让很多人崩溃。它本质上是系统残留的重启标记导致SQL Server装到一半又跳回重启检测。解决的核心方法是清理注册表里的PendingFileRenameOperations项把“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager”里的PendingFileRenameOperations删除然后重新启动电脑再装就能跳过。操作前一定记得先备份注册表删除后如果还有问题可以搜索一下“SkipReboot”相关工具有些情况下是因为Windows更新还在后台等系统彻底安静下来再装更省心。我自己的经验是装这类组态软件之前最好用干净的系统别装那些整天更新补丁的版本工控机上能不上外网就不上外网很多莫名其妙的安装问题都是更新引起的。5.4 PID参数整定与现场干扰处理现场PID调试时最典型的问题是阀门来回摆动“嗡嗡响”这是纯比例作用太强或者系统有纯滞后导致的。我的做法是先切到手动模式把执行机构停在一个稳定位置确认机械环节没有卡涩再切自动从很小的P开始慢慢加。如果阀门还是高频震荡就把采样时间拉长比如温度回路从1秒改成3到5秒很多时候系统就稳定了因为阀门和传感器本身响应速度没那么快。干扰方面还有一招模拟量滤波。温度信号可以在PLC里做平均滤波但压力、流量这种变化快的信号滤波时间不能太长否则就看不到真实变化了。这个度需要根据工艺来加热炉温度可以滤3到5秒管道压力最多滤1秒滤太狠会导致联锁响应变慢安全上不允许。5.5 博途中查看PLC资源使用情况程序写大了有时候CPU扫描时间过长、内存不够这时候要到博途里看看资源。在线状态下打开CPU的“在线与诊断”在“诊断缓冲区”可以看到详细报警要看装载内存和工作内存的使用率可以在项目树里右键程序块选择“编译软硬件”编译结果会报每个块的大小离线就能看出来哪些块占空间大。更实用的方法是在线连接后打开“设备视图”里CPU的属性选择“信息和诊断”中的“存储器”能看到装载内存、工作内存的占用比例。如果发现某个程序块太大可以考虑把大段FC拆成几个小FC把重复逻辑收敛到FB里减少代码体积同时把不重要的周期性任务放到低优先级的OB里别让所有东西都堆在OB1。还有一点扫描周期超时报警时可以在CPU属性里设定最大循环时间比如默认150ms如果程序扫描超过这个值会报“循环时间超时”并停机。我遇到过程序里有一个循环计算量很大的函数块一旦触发就把扫描时间拉到几秒CPU直接报警。解决方案是把这个函数块的执行放到定时OB里并且降低频率比如每500毫秒执行一次而不是每个循环都跑。结语调试结束后我留下的一些习惯最后不说什么系统性的总结了就讲讲我从这个项目里留下的一些工作习惯算是给同行的经验。第一是备份。PLC程序、WINCC项目、GSD文件、变频器参数表我每隔半天就备份一次而且把不同版本放进带日期的文件夹。这招在我后来一次需要回退程序时救了命当时现场调试改乱了逻辑直接回滚到前一版本五分钟搞定。第二是注释。程序块、DB块、画面变量我都会写清楚注释因为半年后维护的不一定是自己没有注释的工程就是给后人挖坑。第三是通讯协议文档。每个仪表的寄存器地址、每个指令的报文格式整理成一个Excel放在项目文件夹里后面排查问题时不用到处翻手册。还有一个可以扩展的方向这类系统后面越来越多要对接环保数采仪、园区数字化平台做项目时从一开始就预留好OPC UA和Modbus TCP接口后面接数据比重新改程序轻松得多。希望这篇分享能帮你少踩几个坑要是你在现场也碰上类似的问题照着这个思路排查一遍基本都能找到症结。
返回列表