ARTICLE DETAIL

资讯详情

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

S7-1500污水处理程序拆解:博图V16工程与泵组联锁PID控制

S7-1500污水处理程序拆解:博图V16工程与泵组联锁PID控制 简介这是西门子S7-1500 PLC在污水处理场景下的完整项目案例面向自动化、电气工程及物联网相关专业学生、PLC入门与进阶开发者以及需要快速搭建污水处理控制方案的工程师。项目基于TIA Portal工程文件组织43个文件涵盖项目组态、程序块、数据块、配置文件及日志压缩包仅2.1MB结构紧凑便于按模块查看工艺控制逻辑与项目划分。目前已有167人学习下载内容完整适合作为课程设计、毕业设计或初期项目立项的参考蓝本。通过该项目可以了解污水处理工艺常见控制要求、S7-1500项目文件组织方式与程序调试思路掌握从项目组态到逻辑编写的完整流程也可在现有代码基础上进行修改扩展快速验证不同控制策略。项目代码已经过运行验证可直接导入TIA Portal查看文件分类清楚可节省自行搭建环境的时间。1. 一套污水处理程序比想象中更值得拆拿到06_S7-1500污水处理.zip后第一步不是急着解压而是先确认它是不是 TIA Portal V16 工程——压缩包里的Baf.ap16后缀已经说明了一切。解压后的目录里有Baf System、XRef、AdditionalFiles、Vci、IM Logs这不是简单的源码包而是一个可以直接用博图打开的 S7-1500 项目案例覆盖了从格栅到曝气再到泵组联锁的完整控制流程。适合正在学西门子PLC编程的开发者也适合拿它做课程设计、毕业设计或初期项目立项的自动化工程师。与普通教学例程不同这套程序能让你看到真实污水处理场景下对硬件资源、通信接口和诊断信息的管理方式尤其是Baf System目录里按功能拆分的逻辑块很值得对照现场工艺图逐块读一遍。2. 拆解.ap16工程博图 V16 程序骨架与块规划2.1 先识别压缩包目录哪些文件是程序哪些是诊断信息打开zip会看到这几个顶层项它们的用途差别很大只看文件名容易踩坑。目录/文件作用Baf System主项目目录存放PLC站、设备组态和程序块XRef交叉引用数据用于变量和地址的关联查看AdditionalFiles附加文件常包含项目说明、IO清单或工艺图Vci通信相关配置比如虚拟通信接口或PN/OPC UA实例文件Baf.ap16TIA Portal V16项目文件双击即可打开主工程IM Logs运行日志和诊断日志便于排查故障提示如果你用的是V15.1或V17需要先升级或降级项目建议保留zip原件再另存副本XRef目录在打开项目后会自动重建不要把它删掉否则交叉引用表可能丢失。接下来把Baf.ap16在TIA Portal V16中打开会看到S7-1500 CPU、IO模块和程序块。对于这种规模的控制系统通常会把逻辑分成几个层次循环组织块OB1负责主流程定时中断OB35用于周期采样和控制启动组织块OB100初始化参数。程序块规划上建议用FB封装设备逻辑、用FC做算法或转换、用全局DB做数据共享背景DB交给FB自动生成。S7-1500支持符号寻址和优化的块访问所以程序里很少看到%I/%Q地址全部通过符号名引用这一点与S7-300/1200的旧习惯不同。2.2 存储区分配保持区与过程数据分开在S7-1500中工作存储器足够容纳中等规模的污水处理程序但如果要记录历史曲线例如pH、COD、流量日累计需要在设备组态中设置保持存储区并把DB属性勾选为“保持”。我一般会建两个全局DBDB_ProcessData用于实时值DB_RetainData用于停电保持的累计值和状态字后者设置断电保持这样重启后泵的运行时间、故障次数不会丢。注意优化的DB即使不勾选保持上电后也会按初始值复位若需要数据掉电保持必须在DB属性里显式勾选。2.3 OB100 初始化设置默认参数和故障字在OB100中写初始化逻辑可以用一个FC做批量赋值。常见做法是在OB100里把故障字清零、把PID输出设为安全值、把泵轮换顺序恢复为1号泵。SCL片段// OB100 Start-up DB_RetainData.faultWord : 16#0; DB_Pump.leadPump : 1; DB_PID.out : 0.0; DB_Com.connState : FALSE;代码说明这个OB只在上电和STOP→RUN时执行一次。为什么把faultWord放在保持DB里因为故障记录需要掉电保存但上电时又要清掉瞬时故障所以先读出来保存到临时变量再复位等OB1里重新扫描后会再次写入真实的故障状态。如果你在运行时热复位OB100也会执行注意不要让累计时间被误清零。2.4 用 FC 做模拟量线性化从原始值到工程量程序中大量用到4-20mA信号液位计、压力变送器、pH计S7-1500的模拟量输入模块将电流信号转换为INT型原始值0~27648对应4~20mA。这里给出一个通用的线性化FCSCL语言FUNCTION FC_Scale : REAL VAR_INPUT rawValue : INT; rawLo : REAL; rawHi : REAL; engLo : REAL; engHi : REAL; END_VAR VAR_TEMP rawReal : REAL; END_VAR IF rawHi rawLo THEN rawReal : INT_TO_REAL(rawValue); FC_Scale : (rawReal - rawLo) / (rawHi - rawLo) * (engHi - engLo) engLo; ELSE FC_Scale : 0.0; END_IF; END_FUNCTION说明这个FC把原始值按线性比例映射到工程单位。比如某个液位计量程0-10米对应原始值0-27648调用时参数填rawLo : 0,rawHi : 27648,engLo : 0,engHi : 10.0即可。注意S7-1500中INT_TO_REAL是显式转换直接运算前必须转换否则编译器会报类型冲突。我习惯把这类纯算法放在FC里而不是FB里因为FC不占用背景数据块适合多处调用。如果信号上有波动可以在调用处再加一个一阶滞后滤波避免液位值跳动引起泵频繁启停滤波时间常数设为0.5~1秒比较合适。3. 泵组联锁与格栅时序污水处理逻辑的重头戏3.1 提升泵分级启动与轮换策略进水井液位是污水处理的首要控制量。当液位高到设定值时启泵低到停机位时停泵多台泵还要考虑轮换避免同一台泵长期运行导致机械磨损。常见做法是建立泵组状态字用SCL实现// DB_Pump.actLevel:REAL 当前液位 // DB_Pump.leadPump:INT 当前主泵号 IF DB_Pump.actLevel DB_Pump.highLevel THEN DB_Pump.pumpCmd[DB_Pump.leadPump] : TRUE; ELSIF DB_Pump.actLevel DB_Pump.lowLevel THEN DB_Pump.pumpCmd[DB_Pump.leadPump] : FALSE; END_IF; IF DB_Pump.pumpCmd[DB_Pump.leadPump] AND DB_Pump.runTime[DB_Pump.leadPump] DB_Pump.rotateTime THEN DB_Pump.leadPump : DB_Pump.leadPump MOD 3 1; END_IF;参数说明highLevel和lowLevel分别是启停液位需要设回差比如2.5m启动1.8m停止避免边界抖动pumpCmd数组对应3台泵的输出rotateTime是轮换切换时间工程上通常设24小时。MOD运算实现1→2→3→1循环这里的编号必须从1开始。这种基于数组的写法比堆M点要易维护得多。如果要支持备用泵自动切入可以再加一个故障字把故障泵从轮换表里剔除。3.2 机械格栅定时/液位差控制格栅拦截大颗粒杂物常用两种控制模式定时启停例如每30分钟运行15分钟或液位差启动格栅前后液位差超过200mm时启动。两种模式用模式字切换。定时模式用TON即可液位差模式则直接比较两个液位计的差值。需要注意格栅电机的过载保护要接电机保护断路器的辅助触点程序里必须把运行反馈与命令做比较若命令为ON但反馈长时间为OFF要报“无反馈”故障并禁止输出。这样的故障在日志里非常常见很多时候是接触器辅助触点没接入DI点调试时要优先核对。3.3 与变频器配合三段速与模拟量调速很多污水处理站用变频器控制提升泵或风机。项目中如果是PROFINET通讯直接写DB_Freq.SetSpeed到变频器的控制字和速度设定值如果是普通端子控制可以用数字量组合实现三段速。西门子PLC与变频器三段速控制常见做法是用Q点组合速度档位程序中用CASE选择CASE DB_Freq.SpeedMode OF 0: DB_Freq.DigitalCmd : 16#0; // 停机 1: DB_Freq.DigitalCmd : 16#1; // 低速 25Hz 2: DB_Freq.DigitalCmd : 16#2; // 中速 40Hz 3: DB_Freq.DigitalCmd : 16#3; // 高速 50Hz ELSE DB_Freq.DigitalCmd : 16#0; END_CASE;这段代码对应三个输出端子的组合DigitalCmd的低两位分别映射到变频器的两个数字量输入端子。注意变频器需要预先在参数里设置多段速端子为组合选择模式PLC侧只输出开关量不要用高速脉冲否则接线和参数都会对不上。如果项目中使用的是ABB变频器还要注意端子默认逻辑是正逻辑还是负逻辑必要时在PLC输出后加中间继电器。如果变频器支持模拟量输入PID输出直接给0-10V也是常见方案但要注意模拟量输出模块的负载能力一般只能驱动一个变频器端子。3.4 数字量输入去抖防止液位边界抖动现场DI点最烦人的是触点抖动尤其是浮球液位计和故障继电器。我一般写一个去抖FC用OB35每100ms扫描一次FUNCTION FC_Debounce : BOOL VAR_INPUT rawDI : BOOL; ms : INT; // 去抖时间单位毫秒需要是100的整数倍 END_VAR VAR_TEMP cnt : INT; END_VAR IF rawDI THEN IF cnt ms / 100 THEN cnt : cnt 1; FC_Debounce : FALSE; ELSE FC_Debounce : TRUE; END_IF; ELSE cnt : 0; FC_Debounce : FALSE; END_IF;说明这个函数在输入持续为TRUE超过设定时间后才输出TRUE输入一旦断开立即复位。cnt建议放到静态变量或背景DB里否则调用结束后会丢失。实际使用时把去抖后的信号传给电机控制逻辑而不是直接用原始DI点能减少很多误动作。S7-1500的DI模块硬件上也有滤波参数但那是模拟量通道级别的数字量去抖还是程序里做更灵活。4. 曝气池溶解氧 PID模拟量滤波与调节回路实现4.1 溶解氧信号预处理滤波与量程校准生化池通过曝气保持溶解氧DO浓度在2-4mg/L。DO传感器通常输出4-20mA进入模拟量模块后原始值不仅要线性化还要做均值滤波避免气泡干扰。推荐滑动平均值滤波在OB35中调用VAR_TEMP sum : REAL; i : INT; END_VAR sum : 0.0; FOR i : 0 TO 14 BY 1 DO DB_Filter.buffer[i] : DB_Filter.buffer[i 1]; sum : sum DB_Filter.buffer[i]; END_FOR; DB_Filter.buffer[15] : DB_Filter.input; sum : sum DB_Filter.buffer[15]; DB_Filter.output : sum / 16.0;注意这里数组长度16每次把数据前移一位新的采样值放到末尾然后求平均。这种写法直观但会消耗较多扫描周期如果窗口超过32建议改成环形缓冲区。S7-1500的定时中断OB35默认周期100ms采样16次约1.6秒对溶解氧这种慢过程足够。DO电极还有温度补偿通常在变送器里完成PLC侧不需要重复处理但量程校准要跟仪表说明书核对比如0-20mg/L对应4-20mA则换算系数就是20/27648。4.2 使用 TIA 自带的 PID_Compact vs 手写PID博图里集成了PID_CompactV2.3以上版本支持自整定可以快速投用。但污水处理现场存在大滞后自整定结果经常振荡而且PID_Compact需要分配一个较大的背景DB。我在这类项目中倾向自己写一个带抗积分饱和的增量式PID放在FB里用多重实例方式调用多个回路例如DO、pH、加药。下面是增量式PID的SCL// FB_PID_SCL 输入输出 // setpoint, feedback, Kp, Ki, Kd, maxOut, minOut, out e : setpoint - feedback; deltaOut : Kp * (e - ePrev) Ki * e Kd * (e - 2.0 * ePrev ePrevPrev); outTmp : out deltaOut; IF outTmp maxOut THEN outTmp : maxOut; ELSIF outTmp minOut THEN outTmp : minOut; END_IF; out : outTmp; ePrevPrev : ePrev; ePrev : e;这里的Kp、Ki、Kd是结构体成员调用时通过实例DB传入。增量式输出只加在上一拍输出上天然具有抗积分饱和作用适合控制阀门开度和变频器频率。需要说明的是增量式PID的参数和位置式不同不能直接套PID_Compact整定出来的P/I/D我通常先用试凑法调Kp再逐步加Ki。写这个FB时建议把背景DB设为多重实例在主OB35里定义一个静态调用即可PID_DO(setpoint : 2.5, feedback : AI_DO_Value, Kp : 1.2, Ki : 0.05, Kd : 0.0, maxOut : 50.0, minOut : 0.0);参数说明maxOut是风机最大频率上限这里为50Hzsetpoint是溶解氧目标值2.5mg/Lfeedback来自滤波后的DO值。关于多重实例的好处每个FB调用占用的背景DB数量少且结构化清晰可以在全局DB中直接看到每一路的输出。S7-1500的FB在优化模式下多重实例的背景数据都集中放在调用方的DB里在线监控和强制都方便。4.3 回路之间的优先级与联锁污水处理中风机不仅要满足DO需求还要受液位和压力限制。我一般会在PID输出后加一个软保护当曝气池液位高于7米强制输出降到40%当风机总管压力超过0.08MPa闭锁输出增量。这些保护写在FB的最后覆盖outTmp保证安全优先。此外pH调节和加药调节是两个相互耦合的回路可以通过系数矩阵解耦但实际工程中先保证加药泵脉宽与pH偏差比例再慢慢调另一个性价比更高。还要注意在手动/自动切换时PID输出要做无扰切换手动状态下持续执行out : 手动输出自动切换瞬间输出才不会有跳变。5. PLCSIM 仿真与 TSEND_C busy 排查5.1 用 PLCSIM V16 验证程序打开项目后可以用PLCSIM V16仿真运行。仿真模式下没有真实IO需要在监控表里手动给aiRawValue等输入变量强制赋值观察泵和PID输出是否按预期变化。技巧是把FB的输入输出接口做成结构体仿真时对结构体成员批量赋值省时很多。注意OB35中断周期在仿真里也可以修改但建议保持默认100ms与现场行为一致。5.2 TSEND_C 发送 busy常见原因与解决当PLC需要向中控上传数据时很多人用TSEND_C。现场最典型的故障是发送总是BUSY。原因通常是REQ信号持续为TRUE或上一次发送未完成就再次触发。处理方式如下表错误现象原因处理方法TSEND_C 返回 BUSYREQ一直为TRUE用沿触发发送完成后再复位REQ发送速度慢每个周期都尝试建连打开保持连接不要频繁断开状态字ERROR连接ID冲突或远程端口未打开检查组态连接ID和对方端口SCL片段IF TSEND_C_DB.DONE OR TSEND_C_DB.ERROR THEN DB_Com.sendReq : FALSE; END_IF; IF DB_Com.dataReady AND NOT DB_Com.sendReq THEN DB_Com.sendReq : TRUE; END_IF;参数说明TSEND_C_DB是系统生成的背景DB通过其DONE和ERROR状态判断发送是否结束dataReady由数据采集逻辑置位这样同一时刻只有一个发送任务。多连接场景用多重实例为每个连接生成独立背景DBREQ分别触发不互相干扰。S7-1500的TSEND_C默认最大数据长度是8192字节超过需分包。5.3 用 XRef 定位重复写入XRef 是快速定位变量使用位置的利器。在TIA中双击交叉引用输入变量名能看到该变量在OB/FC/FB中出现的位置和访问类型。调试时如果泵输出没被置位先查是否被多段程序重复写。S7-1500编译不会对符号访问报多重重写必须靠XRef核对。项目中的IM Logs存有诊断日志模块断线或模拟量超限都能在诊断缓冲区看到比如模拟量卡读回32767通常是断线不是超量程。分发项目前排除IM Logs历史记录压缩包体积会小很多也避免把调试信息暴露给现场人员。本文还有配套的精品资源点击获取
返回列表