
去年接了一个小型污水处理站的控制项目用的就是西门子S7-1200 PLC配KTP触摸屏上位编程软件是博途TIA Portal扩展模块采用了TE20系列另外加了一个远程模块做设备监控和报警推送。这套系统在中小型污水站、泵站、水处理设备集成里非常常见也是很多刚接触西门子PLC的工程师最容易上手的组合S7-1200负责逻辑控制KTP触摸屏做本地显示和操作博途一个软件通吃PLC和HMI远程模块则解决“人不在现场也能看到设备状态”的问题。这篇博客我把整个项目的设计思路、程序结构、画面组态、Modbus通讯和调试验收过程完整拆开讲适合正在做同类项目的工程师、维修电工也适合用博途做第一个完整项目的入门朋友参考。很多参数和调试方法我会直接给出我自己用过的值省得你自己再试半天。1. 先想清楚再动手项目需求和整体架构1.1 一个小型污水处理站需要控制什么这个项目规模不算大日处理量几百吨工艺是典型的A/O或A2/O简化版。现场主要设备有调节池提升泵两台、回流泵一台、鼓风机一台、加药泵一台外加曝气池的电动阀门若干。监控点主要是调节池液位、污泥池液位、清水池液位、进水pH、溶解氧DO、瞬时流量和累计流量。第一次去现场我先把工艺流程图要过来挨个设备、仪表对了一遍这一步特别重要。很多人上来就打开博途建项目等设备到齐了才发现IO不够、模拟量通道不够、泵的控制逻辑跟工艺对不上再改就非常痛苦。这套系统的控制需求拆开看其实是四块一是根据调节池液位自动启停和切换提升泵二是鼓风机和回流泵按时间或者溶解氧联动三是加药泵和进水流量成比例控制四是各种保护联锁和故障报警。真正写程序之前这四块内容必须跟业主和工艺工程师确认清楚尤其是手动/自动切换、泵轮换规则、高液位报警是只报警还是强制启泵这些细节直接决定程序怎么写。1.2 为什么选S7-1200 KTP TE20这套组合S7-1200在这个项目里的定位非常明确控制规模不算大但IO点数和模拟量通道不少而且需要和变频器通讯同时还要挂远程模块。选1200而不是200 SMART核心原因是博途平台对1200的支持更完整程序结构、数据块、PID指令、以太网通讯都更方便以后扩展也容易。具体型号我选了CPU 1214C DC/DC/DC集成14DI/10DQ板载2路模拟量输入但现场液位、pH、DO加起来超过4路板载不够用所以加了TE20扩展模块。TE20在这里作为Profinet分布式IO/模拟量扩展模块使用带4路AI、2路AO以及若干DI/DO通过Profinet接入PLC好处是接线规整扩展不占用CPU机架位置而且模拟量通道隔离性比板载好4-20mA信号抗干扰能力更强。触摸屏选了KTP700 Basic7寸触摸屏分辨率够用画面放得下总览、泵控、报警和趋势这些页面Basic面板在博途里组态也简单。远程模块采用4G工业物联网网关通过Modbus TCP从PLC读取寄存器数据再上传到云平台实现手机端和电脑端的远程监控同时支持微信/短信报警推送。这套组合整体成本控制得不错性能也能满足现场要求属于很标准的“中低端水处理项目配置”。我自己用下来的感受是S7-1200的以太网调试体验比老200好太多程序下载、在线监控、HMI一起下载都很快调试效率高很多。1.3 系统架构与通信方式整个系统从下往上分三层现场设备层、控制层、信息层。现场设备包括泵、风机、阀门、液位计、pH计、流量计和变频器控制层是以S7-1200为核心KTP触摸屏通过Profinet和PLC通信TE20扩展模块同样走Profinet信息层是4G远程网关采集PLC数据上传云平台。通信方式这块TE20走Profinet由博途直接组态分配设备名称和IP基本是“配置好就能用”。KTP触摸屏和PLC在同一个博途项目里连接类型选择ProfinetIP地址规划在同一网段即可。变频器我用了Modbus RTU通讯PLC通过通信模块的RS485口去轮询变频器的频率给定、运行状态和电流反馈。下面是我整理的一张IO分配表现场施工接线和程序符号表都是按这个来的信号类型位号/名称地址说明DI提升泵1故障I0.0热继/变频器故障DI提升泵2故障I0.1热继/变频器故障DI手动/自动切换I0.2柜面旋钮DI鼓风机故障I0.3热继故障DI液位开关高报I0.4调节池超高报警AI调节池液位TE20 AI04-20mA 0-5mAI污泥池液位TE20 AI14-20mA 0-5mAI进水pHTE20 AI24-20mA 0-14pHDO提升泵1接触器Q0.0工频启泵DO提升泵2接触器Q0.1工频启泵AO鼓风机频率给定TE20 AO04-20mA 0-50HzAO加药泵频率给定TE20 AO14-20mA 0-50HzIO表做完硬件方案基本定格接下来才进入博途组态和程序设计的阶段。2. 博途项目搭建与PLC程序设计2.1 TIA Portal项目组态要点博途版本我习惯用V17或V18新项目直接创建S7-1200站点选择对应的CPU型号然后添加KTP触摸屏和TE20扩展模块。这里有个很容易忽略的点TE20这种第三方Profinet设备需要先在设备目录里安装对应的GSD文件否则组态列表里找不到。GSD文件可以找模块厂家要下载后在博途的“选项-管理通用站描述文件”里安装装完重启博途才能生效。把TE20添加到Profinet网络后必须给它分配设备名称比如te20-ai这个名字要跟模块上的实际拨码或者标签一致。S7-1200的Profinet名称区分大小写写错了整个模块就掉线在线状态下能看到设备报“不可访问”。分配设备名称的方法是先打开“在线访问”找到PLC所在的网卡然后搜索到TE20设备右键分配名称。我第一次做这个步骤时漏了名称分配结果TE20一直不在线浪费了两个小时后来才发现是名字没对上。KTP触摸屏组态方面添加设备时选择对应的Basic面板型号然后在“设备与网络”视图里把PLC和HMI用Profinet连接画一条连线系统会自动生成HMI连接。HMI的IP地址要设成和PLC同一网段比如PLC是192.168.0.1HMI就设192.168.0.2TE20设192.168.0.3远程网关设192.168.0.10。IP规划好了写进表格发给施工队不然现场电工经常自己随便配地址最后谁都访问不了谁。2.2 PLC程序结构与关键逻辑程序我按OB1主循环FC功能块DB数据块的思路来组织没有做得太复杂。OB1负责总调度把手动/自动判断、泵控制、模拟量处理、报警处理、Modbus通讯分别封装成FC数据全部保存在对应的全局DB里这样在线监控、改参数都方便。提升泵的自动控制是这套程序的核心。控制规则是调节池液位低于启动液位(默认0.8m)时自动启动当前主用泵当液位低于停止液位(默认0.3m)时停止泵当液位超过高报警(默认4.2m)时备用泵强制启动并触发报警。泵轮换逻辑按照累计运行时间主用泵运行时间超过8小时后自动切换到备用泵防止某一台泵长期运行磨损严重。这个逻辑我用SCL写了一个简化版本贴出来给大家参考// 提升泵自动控制简化逻辑 IF HMI_Params.AutoMode THEN // 液位到达启动值且当前主泵无故障 IF AI_Values.SumpLevel HMI_Params.StartLevel AND NOT PumpStatus.Pump1Fault AND PumpStatus.MainPump 1 THEN PumpCmd.Pump1Run : TRUE; END_IF; // 停止泵 IF AI_Values.SumpLevel HMI_Params.StopLevel THEN PumpCmd.Pump1Run : FALSE; END_IF; // 高液位强制启动备用泵 IF AI_Values.SumpLevel HMI_Params.HighLevelAlarm THEN PumpCmd.Pump2Run : TRUE; END_IF; END_IF; // 泵轮换主泵运行时间超过切换时间 IF PumpStatus.Pump1RunTime HMI_Params.SwitchHours * 3600 THEN PumpStatus.MainPump : 2; PumpCmd.Pump1Run : FALSE; END_IF;这里要注意泵的启动和停止不能只有一个输出变量实际项目里还要考虑泵的启动脉冲、停止脉冲、运行反馈、故障复位等状态最好用一个自定义的“泵控制FB”统一处理把启停命令、反馈、故障、运行时间封装在一个功能块里三台泵调用三次代码量会少很多。这也是博途里面“多重实例”思想的实际应用网上很多人搜“西门子PLC多重实例”其实就是这个场景。还有一点泵的启停如果带接触器程序里启动命令要加“保持”而不要用带“边沿”的脉冲否则操作员在触摸屏上点一下启动马上又停了。博途的线圈输出和置位复位指令在泵控里我偏向用SR触发器手动自动都通过置位/复位来切换这样状态更稳定。2.3 模拟量处理与PID控制模拟量处理这块TE20的AI通道采集4-20mA信号博途里直接把模块的测量类型选择为“电流(4-20mA)”模块会自动把原始值0-27648对应到4-20mA。程序里需要把27648线性换算成工程量比如液位0到5m用一条缩放指令液位工程量 (原始值 / 27648) * 量程上限。博途里可以直接调用SCALE指令也可以自己写一行数学运算我更习惯写运算因为这样量程上下限可以在HMI上设定灵活度高。DO溶解氧控制我用的是S7-1200自带的PID_Compact指令。PID_Compact是个非常实用的FB博途里直接拖到OB30循环中断里调用组态时选择“用于模拟量输出”的PID控制器设定值和过程值都填工程量输出接AO通道给鼓风机变频器。第一次整定我用了PID自整定功能设置里勾选“启动自整定”面板上给一个阶跃变化PLC会自动跑一段时间并计算出P、I、D参数。现场实测下来自整定的P值普遍偏小我一般会在自整定基础上把增益P乘1.5到2倍积分时间Ti适当减一点这样溶解氧响应速度会快一些。PID调节的坑主要在于过程值如果波动很快自整定容易失败AO输出接的是变频器要确认频率给定方式是0-20mA还是4-20mA如果给定类型不匹配输出经常到不了满量程。我在鼓风机频率给定上踩过这个坑模块AO默认输出0-20mA而变频器端子设置的是4-20mA结果频率最低没法低于5Hz后来把模块输出类型改成4-20mA才解决。3. 触摸屏画面做成什么样操作员才喜欢3.1 KTP画面规划与变量连接KTP700 Basic的画面布局我一般按四个页面来做主页面(工艺总览)、泵控制页、报警页、趋势/参数页。画面切换用页面跳转按钮按钮放在顶部操作员在任何页面都能快速跳转。主页面放一张简单的工艺示意设备图标用矩形和状态标签表示泵运行时指示灯变绿停止变灰故障变红闪烁。变量连接是HMI组态里最容易乱的地方。博途里PLC变量和HMI变量可以在同一个项目里直接拖拽连接KTP通过HMI连接以绝对地址或符号地址访问PLC。我的习惯是PLC里把所有需要HMI操作和显示的数据放到一个共享DB(比如HMI_Params)触摸屏变量全部指向这个DB里的元素这样PLC程序改动时HMI变量只要重新编译下载即可不容易出现变量名对不上的问题。画面上按钮的“操作模式”要注意泵启动按钮建议用“按一下置位再按一下复位”的模式也就是复用一个切换按钮避免正反两个按钮同时按下造成逻辑矛盾。液位、DO这些过程值用IO域显示同时把量程和单位标清楚操作员不用猜这个数是什么单位。3.2 报警记录、趋势曲线与用户权限报警这块KTP Basic支持报警类别的定义我在报警里分了“液位报警”“设备故障”“通讯故障”三类。报警文本建议直接写到博途的报警变量上触发变量用PLC里的报警BOOL量。特别注意报警的“确认”功能Basic面板可以组态报警确认按钮操作员消音后必须在报警确认画面里确认故障PLC程序里再配合故障复位按钮这样能避免操作员随手消音不管故障。趋势画面我放了调节池液位和溶解氧两条曲线。Basic面板的趋势控件能记录一定数量的历史数据并保存在HMI的保持性存储区掉电不丢失。不过要注意Basic面板的存储容量有限趋势数据别存太长时间否则会影响面板的运行速度。时间基准和采集周期我设置的是每5秒存一个点显示最近2小时趋势实际使用效果不错。用户权限管理这一块很多人忽略但污水处理站经常会遇到非专业人员乱按触摸屏的情况。KTP Basic支持用户组我组态了“操作员”和“管理员”两个用户组操作员只能控制泵启停和看画面管理员才能修改液位设定值、PID参数和系统时间。具体做法是在“运行系统设置-用户管理”里启用用户登录然后在每个按钮和IO域的“权限”属性里选择对应的用户组。这样既保护了参数也方便追责。3.3 远程模块怎么接从4G网关到云平台远程监控是现在很多项目的硬需求业主要求能在手机上看设备运行状态、接收故障报警。我们选的是市面上很常见的4G工业物联网网关Profinet侧通过以太网接到和PLC同一个交换机上采集侧用Modbus TCP协议读取PLC的保持寄存器。S7-1200做Modbus TCP服务器有现成的指令库博途里添加“Modbus TCP”库函数调用MB_SERVER功能块把PLC的DB区映射到保持寄存器地址网关就能读到数据。Modbus TCP映射需要在PLC里做数据打包把泵状态、液位、pH、流量等需要远程监控的数据统一放进一个专门的“Remote_Data_DB”数据块然后通过MB_SERVER指令把这个DB发布到Modbus寄存器区。这样远程模块那边只需要配置寄存器地址不用关心PLC内部变量结构。数据打包时注意Bool类型和Word类型不能直接混在一个寄存器里我习惯把Bool位打包成INT后上传一个寄存器同时表示多个状态位省寄存器又直观。远程模块的网络配置也很关键。网关设备配置页面里要填云平台地址、端口、SIM卡的APN参数。国内运营商物联网卡的APN一般默认即可如果用普通手机卡可能需要手动填写APN才能上网。远程模块和PLC之间的通讯不稳定很多时候是IP地址冲突或者交换机端口带宽不够远程数据上传周期我通常设置在5到10秒太频繁现场网络会拥塞5秒以上完全满足监控需求。云平台那边网关配置好后设备自动上线把寄存器地址映射成“液位”“pH”“泵状态”等点位名称再做仪表盘和报警规则。报警规则可以设置成“液位高于4.2m时推送微信和短信”这样半夜出现高液位值班人员能第一时间收到通知。远程监测这块我前面特别强调过只做常规的工业物联网数据采集和告警不涉及任何非法的网络访问方式大家按运营商正规物联网方案配置就行。4. PLC与变频器的Modbus RTU通讯实录4.1 从热词看大家最容易卡在哪最近搜索“西门子PLC与变频器通讯”相关词条特别多从ABB变频器到施耐德变频器从一台PLC带3台变频器到带32台变频器的Modbus通讯说明这个场景是刚需。我自己这次项目里虽然没有大量变频器从站但以前做过一套8台变频器Modbus RTU控制的系统踩过的坑完全可以搬到这个项目里讲清楚。Modbus RTU说简单很简单RS485两根线A/BPLC做主站变频器做从站按功能码03读寄存器、功能码06写单个寄存器、功能码10(十六进制0x10)写多个寄存器。说难也难难点全在细节接线极性、从站地址、波特率/数据位/校验位、报文超时时间、还有不同品牌变频器的寄存器地址差异。第一个建议是先一对一通讯调通再连多台。很多人一上来就把32台变频器全部挂到总线上结果一台都通不上根本不知道从哪里查。正确做法是先从站地址设1只接一台用博途在线监控Modbus通讯状态块确认读写寄存器都正常再逐步增加从站数量和轮询逻辑。我们调试时每次只增加一台这样哪台有问题马上能定位。4.2 一台PLC带多台变频器的实际做法很多人问“一台PLC能不能和32台变频器Modbus通讯”答案是能但要考虑扫描周期。Modbus RTU是半双工轮询主站一次只能和一从站通讯从站多轮询一圈时间就长。假设每台变频器需要读3个寄存器(运行状态、电流、频率反馈)每帧报文大约20-30字节波特率9600下每帧响应约30ms加上轮询间隔32台设备跑一圈至少要2-3秒。这个速度做控制和监控没问题但如果每台还要写频率给定轮询数量翻倍周期就会变长。解决办法一是提高波特率到19200或38400二是把读、写分开只在需要改变频率时写平时只读状态。Modbus轮询程序建议用状态机方式实现。我在博途里写了一个FB用轮询指针Index循环访问每个从站Index从1到最大站号对应每台变频器一组数据。核心逻辑是先发送读保持寄存器请求收到响应后解析数据存储到对应DB然后等待下次轮询。用西门子Modbus RTU专用指令比如“MB_COMM_LOAD”初始化串口、“MB_MASTER”发起主站请求。MB_MASTER的REQ管脚不能一直为TRUE必须用脉冲触发否则通讯会卡死。我习惯用一个1秒的定时器产生脉冲每秒钟触发一次读写任务。32台变频器那种规模硬件上还要注意485总线长度和终端电阻。通讯线用屏蔽双绞线屏蔽层单端接地总线两端加120欧终端电阻。很多现场通讯不稳都是因为这个检测方法是用示波器看A/B线间的波形标准485空闲时A比B高至少200mV(算上偏置)如果波形变形严重基本就是接线或终端电阻问题。4.3 通讯参数与程序细节不同品牌变频器的Modbus寄存器定义差别很大这是最坑的地方。ABB变频器通常用“写入速度给定”的功能码频率给定地址是40001(十六进制0x0001)控制字地址是0x0000状态字、频率反馈地址也各有约定而施耐德的地址又不一样。所以做通讯前一定要找到对应变频器的Modbus通讯手册把寄存器地址列表截图放进项目文档调试时随时查。下面是这次项目里施耐德变频器(举例)的通讯参数表实际使用时要对照手册确认项目参数值说明通讯协议Modbus RTU8位数据位1位停止位校验方式偶校验(EVEN)个别设备是NONE要一致波特率19200距离短可以38400从站地址1-8每台变频器面板或参数设置频率给定寄存器0x0001写16位0-20000对应0-50Hz控制字寄存器0x0000写命令启动/停止状态字寄存器0x0009读运行状态程序里MB_MASTER调用时DATA_ADDR填寄存器地址DATA_LEN填寄存器个数DATA_PTR填本地DB地址区。读回来的数据是16位整数频率反馈如果设备端是0-20000对应0-50Hz就要在程序里除以400得到Hz再存到32位浮点数用于HMI显示和PID反馈。写频率同理把浮点Hz乘以400取整后再通过Modbus写出去。通讯状态监控也很重要。我的做法是给每台变频器建一个“通讯超时”标志如果连续3次轮询没有有效响应就判定为通讯故障程序里停止该泵并输出报警。这个功能一定要写进去否则一台变频器通讯断了操作员还以为泵没动作实际设备已经没法控制了。通讯故障复位我放在HMI上故障排除后操作员点“通讯复位”按钮重新恢复轮询。5. 现场调试与常见问题排查5.1 博途连接下载类问题调试第一天最容易卡在博途下载环节。S7-1200程序写好后点击下载如果提示“无法建立到CPU的连接”先检查电脑网卡IP是否和PLC在同一网段。博途程序下载时选择“PN/IE”接口网卡不要选错尤其是笔记本装了虚拟网卡或者无线网卡的时候插了网线也经常默认选无线网卡导致连不上。解决办法是在下载对话框的“接口/子网的连接”里手动指定有线网卡必要时把无线网卡禁用。博途安装许可证问题也很多人问搜索词里居然有“安装博途过程中报一些已安装产品需要许可证”这种。这个通常是因为之前装过试用版或者旧版本卸载不干净。处理办法是在“Simatic License Manager”里清理许可证或者彻底卸载博途后删除注册表残留再重装。个人经验是装博途前先把杀毒软件防火墙退出安装时选择完整安装许可证用正版授权或者厂家提供的试用授权都行。还有PG/PC接口下拉框里没有网卡选项其实是因为没有勾选“显示所有兼容的设备”或者网卡驱动没装好重新安装对应网卡驱动即可。下载时CPU如果处于RUN模式博途会询问是否停机下载选择“停止模块再下载”然后自动启动即可。下载完之后在线监控程序块上显示绿色表示在线正常如果某个功能块显示黄色感叹号大概率是变量连接错误或者DB块被优化访问了。S7-1200的DB块默认是“优化的块访问”这种DB里的变量不支持绝对地址Modbus通讯和触碰某些指令时会不方便我一般在DB属性里取消优化块访问生成偏移量这样变量地址稳定可控。5.2 现场典型问题速查表调试过程中我整理了一些常见问题做成表格方便大家直接对照排查。现象可能原因处理方法TE20模块不上线Profinet设备名称错误重新分配设备名称确保与组态一致模拟量读数一直最大/最小信号线接线错误或模块测量类型不对检查4-20mA接线正负模块属性选“电流4-20mA”液位数值跳变严重屏蔽层未接地滤波时间太短信号线屏蔽层单端接地模块属性设置滤波时间50-100msModbus从站无响应站号重复或波特率不一致逐台检查参数用485转USB工具监听报文触摸屏显示“连接中断”IP地址冲突或PLC未开机检查HMI连接属性PING测试IP连通性远程模块不在线SIM卡没信号或APN错误查看模块日志确认SIM卡可联网配置APN泵启停无响应变量地址不对或接触器线圈坏在线监控Q点输出检查中间继电器和接触器PID输出不稳定给定类型和AO量程不一致确认AO输出0-20mA还是4-20mA匹配变频器端子5.3 调试心得与避坑技巧最后说几点只有实际在现场折腾过才会明白的心得。第一抗干扰怎么强调都不过分。液位计、pH计的4-20mA信号线必须和动力电缆分槽敷设至少保持20厘米以上距离信号线用屏蔽双绞线屏蔽层在PLC柜一侧单端接地。这次项目里有一次pH读数波动很大查了半天发现是信号线和变频器输出电缆扎在一起走了一小段分开之后问题立刻消失。模拟量滤波在博途里可以设置但对快速波动的信号不要滤波太强否则真实变化被滤掉了反而不利于控制。第二关于Modbus通讯超时时间。MB_MASTER的TIMEOUT参数默认是100ms如果你的从站响应比较慢尤其是老款变频器100ms不够用读不回来数据。我一般设300ms到500ms宁可慢一点也要稳定。超时时间太短还有一个坏处超时后重发请求如果原响应刚好慢吞吞回来总线上会出报文碰撞造成更多错误。轮询周期和超时时间要匹配。第三博途程序注释要写清楚。这个项目后期业主自己电工想改点逻辑电话里问我的时候我全靠程序里的注释和IO分配表才能远程指导他把某个泵的联锁改掉。哭的是如果当初没写注释画面、程序、图纸对不上那才叫灾难。我给每个FC都写了块标题和版本号变量符号名也用带前缀的命名规范比如泵用PMP_、阀门用VAL_、模拟量用AI_、命令用CMD_这样程序里一眼能看出变量用途。第四远程模块调试要晚一点接先把本地PLC和触摸屏都调通再配置远程网关。远程网关一旦上线云平台上就能看到数据如果本地逻辑都没调好就急着上云你会发现平台上一堆乱跳的点位排查起来比本地调试验证还难。这套系统从设计到投运前后用了不到两周我自己最满意的还是泵轮换和PID控制这两块既没有过度设计又能满足现场半自动运行需求。做自动化项目其实很多时候不是代码写得越炫越好而是控制逻辑贴合工艺、调试过程能快速定位问题、操作界面别人好上手这套污水处理项目基本都做到了。如果你现在也在做类似的项目建议先把IO分配和工艺逻辑梳理透再打开博途写程序这比背多少指令都管用。