
1. 项目概述与方案选型思考1.1 核心需求解析水箱液位控制在工业现场太常见了——水处理、锅炉补水、化工配料、楼宇供水到处都有它的影子。无论是维持一个恒定液位还是按需完成自动补水和停泵背后都是一个典型的闭环控制问题检测当前液位和设定值比较决定水泵或阀门的开关动作。这次我做的这个项目核心诉求并不复杂利用西门子S7-200 PLC作为下位机负责采集液位信号、执行控制逻辑上位机用组态王完成画面监控、数据记录和远程操作。说白了就是把一套“传感器控制器执行器人机界面”的完整链条跑通并且能稳定运行。我选S7-200而不是S7-1200或S7-1500原因很实际项目预算有限S7-200虽然老但二手市场货源充足、价格便宜配套的编程软件Micro/WIN也容易找到更重要的是S7-200的指令系统和存储器结构相对简单非常适合用来教学、做毕业设计或者小型工程项目验证。组态王这边6.55和6.60版本我都用过运行稳定驱动库里自带S7-200的TCP驱动省去自己写OPC服务器的麻烦。1.2 整体架构设计整个系统的数据流向是这样的液位变送器把水箱里的水位高度换成4-20mA电流信号接到S7-200的模拟量输入模块EM231或者CPU224XP自带的模拟量输入PLC内部经过量程换算得到实际的液位数值然后PLC运行控制程序根据液位高低和设定值之间的偏差决定是否启动或停止水泵同时PLC通过以太网模块CP243-1或者串口方式与上位机组态王通信把实时液位、泵状态上传组态王画面上的液位数字、柱状图、指示灯同步刷新操作员也可以在组态王上点击按钮切换手自动模式或者修改设定值指令下发到PLC。为什么要把控制逻辑全部放在PLC里而不是让组态王直接参与控制这是我的一个原则上位机可以死机、可以断线但现场设备不能停。组态王只是“监”和“控”的窗口真正保证安全运行的是PLC里那套独立的逻辑。哪怕通信中断PLC依然按照自己的程序维持液位在允许范围内这才是工业控制设计的底线。系统架构简表层级设备作用感知层液位变送器4-20mA/0-10V把水位变成标准电信号控制层S7-200 PLC EM231模拟量模块数据采集、逻辑运算、输出控制执行层水泵/电磁阀 接触器/继电器执行补水或排水动作监控层组态王 通信模块/PC显示、记录、参数设定与报警2. 硬件选型与I/O分配2.1 关键元器件选择PLC主机西门子S7-200 CPU226 CN。选CPU226是因为它有两个通信口一个口接编程或者触摸屏另一个口接上位机或者扩展模块灵活性好。而且CPU226支持EM231、EM232等扩展模块后续想加温度、压力通道也留了余地。如果预算特别紧CPU224XP也可以它自带两路模拟量输入足够这个项目用。液位变送器超声波及静压式都可以。我最终用的是静压式液位变送器量程0-5米输出4-20mA两线制。选它的原因在于结构简单、价格便宜、抗干扰能力强而且在水箱这种常温常压场景下足够可靠。超声波液位计非接触、不怕腐蚀但是成本高一些而且有盲区水箱顶部安装空间不足的话容易出问题。执行机构我用了小型水泵交流220V功率约370W作为补水执行器。水泵的启停通过中间继电器控制交流接触器完成PLC的数字量输出点只驱动中间继电器线圈不直接带水泵主回路这样既保护了PLC输出点也方便后续增大水泵功率。通信模块CP243-1以太网模块。这是S7-200上以太网通信的标准配置组态王通过TCP/IP直接访问通信速度快、稳定性好。如果没有以太网模块也可以用PC/PPI电缆走串口组态王通过PPI协议访问但对于现代电脑没有串口的情况比较麻烦USB转串口又容易出兼容性问题所以我优先推荐以太网方案。上位机软件组态王6.60 SP4。组态王在国内中小型工控项目里的占有率很高上手快、图库丰富、驱动全。尤其是它自带的S7-200 TCP驱动不需要额外安装OPC服务器省了很多事。2.2 I/O点分配表在写程序之前先把I/O点规划清楚这一步看似简单但直接决定了接线和编程的顺畅程度。地址功能信号类型说明AIW0液位变送器4-20mA输入模拟量输入接EM231通道0I0.0水泵热继电器常闭触点数字量输入用于过载报警I0.1手动/自动切换开关数字量输入0手动 1自动Q0.0水泵启动数字量输出驱动中间继电器KA1Q0.1蜂鸣器报警数字量输出液位超高/超低时鸣叫VW100液位设定值cm变量存储区组态王可写VD200实际液位cm变量存储区PLC计算后上传实际液位值我用VD200而不是VW200是因为计算过程中涉及浮点运算PID或者线性换算会产生小数用32位浮点存储更精确。组态王里建变量时也要对应设置为FLOAT类型。2.3 接线注意事项模拟量接线有个特别容易踩的坑4-20mA两线制变送器正极接EM231的A负极接A-同时一定要把EM231模块上的“24V DC电源”端子接好。很多新手忘了给变送器供电结果读到的数据一直是0排查半天发现是供电没接。还要注意EM231模块的拨码开关。模块侧面有六个拨码用来设置模拟量输入范围0-20mA还是0-5V等和滤波时间。实际使用前要确认拨码位置正确否则即使接线对了数据也可能满量程跳变或者精度偏差。中间继电器线圈是感性负载断电时会产生反向电动势一定要在继电器线圈两端并联续流二极管1N4007否则时间长了可能击穿PLC输出点的晶体管。这个细节我在多个项目里都遇到过炸过输出点后才会长记性。3. PLC程序设计详解3.1 程序结构规划S7-200的程序分为主程序OB1、子程序SBR和中断程序INT。这个项目我按照模块化的思路拆成了几个部分主程序OB1完成整体调度调用各个子程序。子程序SBR_0模拟量处理将AIW0原始值换算成实际液位厘米数。子程序SBR_1控制逻辑手自动切换、液位比较、水泵启停判断。子程序SBR_2报警处理超限报警、蜂鸣器驱动。为什么要分开写子程序好处很明显调试的时候可以单独测试每个环节模拟量不准先查SBR_0水泵不动作查SBR_1不会互相牵扯。而且以后项目复用把控制逻辑子程序改一下就能用在于别的场合。主程序调用关系LD SM0.0 // 每次扫描都调用 CALL SBR_0 // 模拟量处理 CALL SBR_1 // 控制逻辑 CALL SBR_2 // 报警处理SM0.0是S7-200里的特殊继电器常为ON保证每个扫描周期这些子程序都被执行。PLC扫描周期大约是几毫秒到十几毫秒对这个液位控制场景完全够用。3.2 模拟量工程量换算S7-200模拟量模块的原始值范围是0-32000对应0-20mA。4-20mA对应的数值范围是6400-32000。液位变送器量程0-5米那么4mA对应液位0米20mA对应液位5米线性关系。换算公式液位(cm) (AIW原始值 - 6400) / (32000 - 6400) × 量程(cm)代码里我用浮点运算来实现LD SM0.0 MOVW AIW0, AC0 // 把AIW0原始值送入AC0 ITD AC0, AC0 // 整数转双整数 DTR AC0, AC0 // 双整数转浮点数 MOVR AC0, VD300 // 暂存原始值 SUBR 6400.0, AC0 // 减去零点偏移 MOVR AC0, VD304 MOVR 25600.0, AC0 DIVR AC0, VD304 // VD304 (AIW-6400)/25600 MOVR VD304, AC0 MOVR 500.0, AC0 MULR AC0, VD304 // VD304 换算后的液位(cm)这段程序就是把原始数值逐级缩小到0-1之间再乘以量程500cm。结果存放于VD304组态王直接读这个变量显示液位。注意一个细节S7-200的浮点运算指令是MULR、DIVR、SUBR、ADDR和整数运算是完全不同的指令不能用错。如果用整数运算指令处理浮点数程序会直接报错或者得到错误结果。3.3 控制逻辑实现控制方式分为手动和自动两种手动模式由组态王上的手动启动/停止按钮直接控制水泵。这个模式用于调试、检修或者特殊工况。程序里用置位/复位指令实现按钮信号是脉冲PLC内部用保持线圈维持输出状态。自动模式采用双限位控制也叫滞回控制而不是简单的单点比较。比如设定水位为100cm我设定上限为105cm、下限为95cm。当液位低于95cm时启动水泵液位达到105cm时停止水泵。这种“滞回”方式比单点频繁启停要好得多如果只设一个100cm点液位刚到100就停泵停泵后水会继续滴落或者波动很快又低于100又启动水泵会频繁启停对电机和接触器都是伤害。代码片段如下// SBR_1 控制逻辑 Network 1 自动模式判断 LD I0.1 // 手动/自动开关 AN Q0.0 // 水泵未运行 LD VW100 // 设定值 AW VD304 // 实际液位低于设定值-5cm M0.0 // 启动条件 Network 2 自动启动 LD I0.1 A M0.0 S Q0.0, 1 Network 3 自动停止 LD I0.1 AW VD304 // 实际液位达到设定值5cm R Q0.0, 1这里我用了浮点数比较指令AW和AW注意S7-200的符号是AW和AW不是常见的和。另外M0.0是内部中间继电器标志位不占用物理输出。3.4 PID调节方案进阶可选如果只做双限位控制系统结构已经完整但对于要求液位严格稳定的场合双限位就不够了。我在实验过程中也测试过PID方案。S7-200 CPU自带PID指令核心参数在PID回路表中定义。用PID向导Micro/WIN里的PID Wizard可以快速生成PID子程序配置过程大概分四步一是定义回路编号S7-200最多支持8个PID回路我用的是回路0。二是设置输入输出参数输入是液位过程变量PV输出是控制量通过模拟量输出模块EM232输出0-10V或者4-20mA信号接到变频器或者电动调节阀上。三是设置PID参数比例增益Kc、积分时间Ti、微分时间Td。初始值可以设Kc0.5Ti10秒Td0然后通过现场整定调整。四是设定输出上下限防止PID输出饱和失控我建议输出上限设为90%下限设为10%留出安全余量。实际调试中最关键的是整定PID参数。我常用的方法是“临界比例度法”先把积分时间放到最大、微分关掉从小到大逐步增加比例增益直到系统开始等幅振荡记下此时的增益Kc和振荡周期Tc然后用经验公式算出PID参数P0.6KcTi0.5TcTd0.125Tc。这个方法是经典的Ziegler-Nichols法在液位大惯性系统里效果不错。不过对于这个项目最终我选择双限位控制作为主方案因为液位控制对稳态精度不是极端敏感双限位简单、可靠、易于调试足够满足要求。PID方案写出来是为了提供一个提升路径——如果后面要把这个系统改造为连续调节的流量配比控制PID就是必然选择了。3.5 报警与保护逻辑安全设计是不可忽视的一环。我加了以下几种保护逻辑下限报警液位低于20cm时蜂鸣器鸣叫组态王报警窗口弹出“低液位报警”并闪烁。这个逻辑为了防止水泵空转——水泵空转会损坏密封圈和叶轮。上限报警液位高于480cm时量程500cm蜂鸣器鸣叫同时强制停止水泵。这是双保险即使自动控制失灵上限保护也能防止水箱溢流。水泵过载热继电器常闭触点接入I0.0正常情况I0.0为ON一旦过载热继电器动作触点断开I0.0变OFF程序立即停止Q0.0输出并在组态王上显示“水泵过载故障”。这个故障必须手动复位热继电器后才能重新启动水泵。报警逻辑的程序设计还有一个细节报警信号要自锁就是报警条件消失后报警状态仍然保持直到操作员在组态王上点击“确认”按钮才复位。这样可以防止报警频繁闪烁干扰操作员注意力也符合工业报警管理的习惯做法。4. 组态王画面设计与通信连接4.1 组态王与S7-200通信配置组态王连接S7-200的步骤如下我踩过几次坑按这个顺序来做最稳妥第一步安装组态王驱动。组态王安装目录下有个“驱动”文件夹里面涵盖各品牌PLC的通信驱动。确保安装了“西门子_S7-200(TCP)”驱动如果用串口则选择“西门子_S7-200(PPI)”。安装驱动时最好先关闭杀毒软件否则某些动态库文件会被误删导致驱动加载失败。第二步新建工程定义设备。在组态王工程浏览器的“设备”节点下选择“新建”设备类型选择“PLC” - “西门子” - “S7-200” - “TCP”。关键参数IP地址为S7-200侧CP243-1模块的IP地址比如192.168.0.10端口号默认是102。采集周期我设为1000ms太快也没必要液位本身是大惯性过程。第三步定义变量。需要定义几个关键变量变量的寄存器类型和地址必须和PLC里的V区对应变量名类型连接设备寄存器读写属性液位实际值FLOATS7-200VD304只读液位设定值INTS7-200VW100读写水泵运行BITS7-200Q0.0只读水泵启动按钮BITS7-200M0.1读写水泵停止按钮BITS7-200M0.2读写报警确认BITS7-200M0.3读写注意一个要点PLC里的VD304是一个32位浮点数变量占了VW304、VW306四个字节。组态王里定义变量时寄存器地址就写VD304数据类型选FLOAT不能选INT否则数据读出来会乱码或者完全不对。第四步测试通信。组态王菜单栏有“设备调试”功能打开后可以看到通信状态和报文数据。设备正常连接时显示“通讯成功”收发帧计数会不停增加。如果通信失败首先ping一下PLC的IP地址确认网络通不通再看端口号是否正确最后看PLC侧的以太网模块是否配置了正确的IP地址和站地址。4.2 监控画面布局设计画面设计要以操作人员的视角来思考而不是以程序员视角。布局我分成四个区域左侧是工艺流程区画一个水箱剖面图水箱中间用蓝色液位动画显示液位随着实际值升降。组态王的“动画连接”功能可以做到双击液位填充图形在“水平/垂直填充”选项卡里设置表达式变量为“液位实际值”填充方向和量程范围对应好。这里有一个技巧填充方向的起点最好和水箱底部对齐否则液位上去之后动画填充的起始点不对看着就别扭。中间是数据显示区用文本显示液位实际值、设定值、泵状态。文本变量连接“液位实际值”变量显示格式设置为一位小数单位cm。泵状态可以直接输出字符串用“水泵运行”变量的值为1时显示“运行中”为0时显示“已停止”。组态王用“字符串变量”配合条件判断可以做到或者用两个文本图素分别设置隐藏/显示属性。右侧是操作区放置手动启动、手动停止、设定值输入框、报警确认按钮。这些按钮都连接到PLC的M区变量。这里要注意按钮动作类型选“按下时置1松开时置0”实际上是一个脉冲信号我习惯在PLC里用沿触发指令EU/ED来处理确保一次点击只触发一次动作。底部是报警信息区用组态王的报警窗口控件PLC上传的报警变量会在这个窗口实时滚动显示。报警优先级可以分级超低/超高是一级报警红色液位偏差大是二级报警黄色信息记录是三级白色。操作员看颜色就知道紧急程度。4.3 趋势曲线记录曲线功能是组态王的强项用“实时趋势曲线”控件可以观察液位变化过程。我把液位实际值和设定值放在同一个曲线控件里两条曲线颜色区分可以直观看到系统的跟踪效果。同时开启“历史趋势曲线”数据存到组态王自带的SQL数据库里方便事后分析。历史趋势存储的配置要注意数据保存间隔不要设太短1秒一条数据一天的记录量就是86400条对普通电脑硬盘虽然不算什么但查询和绘图会变慢。我一般设2到3秒保存一次对液位这种慢变量足够。很多做项目的人忽略了一个问题组态王运行期间如果电脑突然断电正在写入的历史数据库文件可能损坏导致后面打不开。解决办法是定期导出历史数据到Excel或者CSV文件并且在组态王工程里设置自动备份策略。5. 系统联调与运行效果5.1 实验室模拟调试没有真实水箱之前我用一个模拟量信号发生器代替液位变送器接在EM231通道上。旋转信号发生器旋钮改变电流值组态王画面上的液位数字和柱状动画同步变化。这个阶段主要验证三件事一是模拟量换算是否正确——将信号发生器电流调到12mA对应的液位应该正好是量程的一半250cm。如果不准检查SBR_0里的系数。二是通信是否稳定——让信号发生器连续变化一段时间观察组态王显示的数据是否平滑有没有跳动或卡顿。组态王画面刷新率设置为500ms理论上画面和数据应该跟随得很流畅。三是控制逻辑是否正确——把液位模拟值慢慢降到设定值以下看水泵是否会启动继续升高到设定值以上5cm看水泵是否停止。检查这几次动作PLC侧的Q0.0指示灯是否同步变化。使用信号发生器调试的好处是不用真实水系统可以快速反复验证逻辑而且不用担心漏水等问题。这个阶段的排错效率很高。5.2 现场试运行调试通过后接入真实水箱。现场试运行中发现了一个问题启动水泵的瞬间液位显示值会出现一个短暂的向上尖峰然后又回落到正常值。这个现象很快定位了原因水泵启动瞬间电流大造成电压波动影响了液位变送器的供电稳定性导致输出信号产生了扰动。解决方法是给液位变送器加一个独立的24V开关电源不和PLC的传感器供电混用同时在模拟量输入端并联一个100uF的电解电容和0.1uF的瓷片电容做成简单的RC滤波。加了滤波之后液位信号变得平滑稳定。这个经验后来我用到很多项目里。另外程序里我也加入了模拟量滤波功能。S7-200的模拟量滤波方式有两种一种是用模块的硬件滤波通过拨码设置另一种是在程序里做平均值滤波——连续采集10次去掉最大值和最小值然后求平均。我采用的是第二种效果更稳定而且灵活调整采样次数。5.3 运行数据记录与效果评估系统连续运行48小时后我导出了组态王的历史趋势曲线数据做分析。水箱液位基本稳定在设定值±3cm范围内水泵启动频率大约每小时2到3次每次运行时间在30秒到2分钟不等完全满足场景需求。对比双限位和PID两种方案的实际效果PID方案液位波动可以控制在±1cm以内水泵变频运行启停次数明显减少但对参数的整定要求高系统结构复杂成本也上去了。双限位方案简单直接、成本低、维护方便在允许液位有一定波动的场合完全够用。这个项目让我切身体会到控制方案的选择不能追求“最好”而要在满足需求的前提下追求“最合适”和“最可靠”。上了生产线稳定压倒一切。6. 常见问题与排查技巧6.1 通信故障排查组态王显示“通讯失败”这是最常见的问题。排查思路我建议按照顺序来先ping通PLC的IP不行就查网线、查IP设置再查组态王设备配置里的IP和端口然后看PLC侧CP243-1模块的RUN灯是否闪烁最后用组态王“设备调试”窗口查看收发的原始报文。有一次我遇到奇怪现象组态王能PING通PLC但通信测试总失败。后来发现是组态王设备配置里的“采集方式”设成了“按需采集”而没有勾选“周期采集”导致数据刷新异常。这个问题不仔细看根本发现不了。通信偶尔中断。排查发现是以太网线质量不好抗干扰差干扰导致丢包。换了一根工业级超五类屏蔽网线后通信非常稳定。在工业现场网线别省钱屏蔽层必须可靠接地。6.2 模拟量数据异常数据一直显示0或者满量程32000。通常原因一接线错误正负极接反或没接好原因二EM231拨码设置和实际信号类型不匹配原因三变送器供电没有接或者供电电压不足。逐一排查后80%以上的问题能解决。数据波动大。先检查是不是变频器干扰——水泵如果是变频驱动的强烈建议模拟量信号线使用双绞屏蔽线并且屏蔽层单端接地。另外模拟量信号线和动力线要分开走线槽不能绑在一起走。我见过一个项目现场信号线和变频器输出线走同一个线槽结果读数疯狂跳动分开走线后立竿见影。6.3 水泵控制异常水泵在自动模式下不启动。常见原因有三处一是液位确实没有低于启动阈值检查程序里的比较逻辑和阈值设定二是手动/自动切换开关没在自动位置I0.1没有接通三是Q0.0有输出但中间继电器或接触器故障用万用表顺着线路量就能定位。自动启动后又立刻停止。这个现象通常在现场调试初期出现往往是滞回区间设置得太小。比如设定了上下限差值为1cm水泵刚启动水还没有明显上升由于液位波动瞬间碰到上限就停了。把滞回区间加大到8-10cm后就正常了。6.4 常见问题速查表故障现象可能原因排查方向通信失败IP、端口、网线、驱动配置逐项检查设备调试窗口看报文液位显示不变化接线、供电、拨码、量程设置用信号发生器直接注入标准电流测试液位数值偏大/偏小量程换算系数不对用标准电流值验证换算结果水泵不动作模式开关、阈值、接触器分步骤检查PLC输出和外围电路液位波动频繁滞回区间太小、电源波动加大滞回宽度、加滤波电容组态王按钮无效变量地址不对、读写属性错误确认PLC侧地址类型检查读写标志历史曲线打不开数据库文件损坏、磁盘空间不足备份数据、清理磁盘、重启软件6.5 运行维护建议项目交付后不能一走了之。我在最后会给使用方留一份简短的运维手册核心内容就几条每季度检查一次液位变送器探头是否有结垢每月测试一次超限报警和急停功能保持控制柜内通风散热避免接触器长时间吸合发热组态王工程文件和PLC程序注意备份放到U盘留底遇到通信故障先重启以太网模块不行再重启电脑。这些看起来都是小事但工程现场很多大故障都是从小隐患积累起来的。定时巡检能省掉后面很多麻烦。7. 实操总结与改进方向7.1 项目经验沉淀做完了这套系统我自己的体会是S7-200和组态王的组合虽然“老”但它代表了一种非常经典的工控架构模式学习价值很高。通过这个项目我对PLC的数据类型和存储区理解更透了、对模拟量信号的处理不再惧怕、对组态王各种绑定方式也熟练了。这些基本功是可以平移到任何新平台上的。项目过程中踩过的坑也很多模拟量拨码、浮点和整数比较指令、组态王变量类型和PLC寄存器匹配、RC滤波抗干扰……每一个坑都是宝贵的经验这也是我坚持把过程记录下来的原因。7.2 系统扩展方向这套系统后续扩展的空间也不小。如果想提升控制精度可以加变频器实现PID连续调节水泵转速跟随液位偏差变化节能效果明显如果想把多个水箱或者多种设备温度、压力、流量都纳入监控扩展模拟量模块和数字量模块组态王里再建几个画面就可以如果想实现远程移动端监控组态王的Web发布功能可以支持网页查看不过安全性要提前规划好如果对数据追溯有更高要求可以对接SQL Server或者MySQL把历史数据和报警记录写入数据库以后做报表分析时就能直接调用。不管怎么扩展底层这套“PLC负责控制、组态王负责交互”的思路都不会变。这也是我最想通过这个案例传达给刚开始接触工控的朋友们的核心理念。7.3 给初学者的几条建议最后再说几句实在话。刚开始学PLC和组态王的新手最容易犯的错误就是急着写程序、画画面忽略了最基本的项目规划。我建议每接到一个任务先花四分之一的时间把需求理清楚、把I/O点列出来、把控制逻辑画成流程图再动手编程。磨刀不误砍柴工这个习惯能省很多返工的力气。再一个就是多做实验、多接实际设备。电脑里的仿真软件再逼真也模拟不了现场的干扰和不确定性。有条件就真刀真枪地接线调试踩过的坑长出来的经验比看十遍教程都管用。最后一点也是最重要的养成记录的习惯。每一步调试发生了什么都及时记下来不管是成功还是失败这些记录总有一天会成为你最有价值的资产。