做流程控制这些年,单容液位应该是我做过最多的对象,也是带新人入门绕不开的第一个实战项目。一个水箱、一台变送器、一只调节阀,配上一套S7-200 PLC和组态王上位机,这套配置放在今天依然能打。虽然S7-200已经停产多年,但存量项目一大堆;组态王更是国内工控软件的常青树,几乎每个做上位机的人都会碰。这篇文章我打算把一个真实项目从硬件配置、PLC程序到组态王画面一步步拆开讲,适合刚接触工控的新手,也适合准备从零搭一套液位控制系统的朋友。
这种项目的核心需求其实不复杂:让水箱液位稳定在设定值,进水阀自动调节,操作员在上位机画面上看到实时液位、改设定值、切换手自动。但越基础的架构,越要注意细节,因为现场和书本最大的区别就是干扰多、通讯乱、参数难调。下面我把整个配置过程揉碎了说清楚。
1. 项目概况与整体方案选型
1.1 单容液位控制到底在控制什么
所谓单容,是指对象只有一个储存容积,水箱本身就属于典型的一阶惯性对象。液位的变化只取决于进水量和出水量之差,没有中间环节,所以相比温度、成分等被控对象,单容液位算是最容易控制的系统之一。但容易归容易,如果不理解它的特性,调试的时候照样一头雾水。
这个项目的工艺结构大致是:水箱顶部或侧面装一台液位变送器,测量水箱当前液位;进水管上装一只电动调节阀,通过开度控制进水量;出水管可以有一台泵或者手动阀门,形成排水负荷。控制任务就是不管出水量怎么变,水箱液位始终稳定在操作员设定的数值上。
现场常见的干扰有两个来源。一个是出水量突变,比如下游突然开大用水,液位会先下降,然后调节阀逐渐开大把液位拉回来;另一个是进水管压力波动,导致同样阀位下进水量不同。这两类干扰都需要控制器有足够的积分作用去消除余差,这也是为什么液位控制基本都用带积分的PI控制,很少用纯P或PD。
1.2 为什么这套组合至今经典
有人会问,现在都流行S7-1200/1500配WinCC,为什么还要用S7-200加组态王。答案很简单:第一,存量设备量大,很多工厂的液位、泵站、小型水处理系统还在用S7-200,设备维护和改造需求一直在;第二,S7-200指令集简单、定时中断可靠、PID指令完全够用,中小规模单回路项目杀鸡用牛刀反而浪费;第三,组态王上手门槛低,全中文环境,驱动库覆盖几乎所有主流PLC,工期紧的时候开发效率非常高。
这套架构的层级也很清晰。最底层是现场仪表,变送器把液位转成4到20毫安信号;中间层是S7-200 PLC,负责采集信号、做PID运算、输出阀位指令;上层是工控机上跑的组态王,负责显示数据、下发设定值、切换工作方式、记录趋势和报警。层与层之间通过模拟量信号和PPI或以太网通讯连接起来。
我一直认为,项目选型不是越贵越好,而是匹配需求。单容液位控制这种单回路、慢过程、监控点数少的场景,S7-200加组态王就是合理且性价比极高的组合。后面讲的配置过程,也适用于其他类似的小型过程控制项目。
2. 硬件配置与模拟量采集细节
2.1 仪表选型与量程确定
液位变送器我选的是扩散硅压力变送器,安装在罐体底部取压。用压力变送器测液位,本质上是测静压,密度稳定的液体精度完全没问题,而且价格便宜、可靠性高。量程按照罐体实际高度选,比如罐高5米,就选0到5米或0到50千帕的规格,输出4到20毫安二线制信号。
如果水箱里是污水、有泡沫或者腐蚀性介质,我一般会改用超声波液位计或者雷达液位计,非接触式安装更方便维护。但需要注意超声波有盲区,安装高度要留够;雷达成本高一些,在有蒸汽和粉尘的场合稳定性更好。这个项目介质是清水,所以用压力变送器最省事。
调节阀这块,我选的是电动单座调节阀,配的是4到20毫安输入信号,执行器接受PLC输出的电流控制开度。电动阀的好处是现场不需要气源,接线也简单;坏处是动作速度比气动阀慢,但对于液位这种慢对象没有任何问题。如果工艺要求的是开关控制,那可以换电磁阀加泵,程序逻辑也跟着改成位式控制,思路会不同,这里我们先按照连续调节来讲。
2.2 PLC选型与IO分配
PLC我选的是S7-200 CPU226,模拟量扩展模块用EM235。EM235一块模块集成了4路模拟量输入加1路模拟量输出,对这个项目来说刚好够用,而且不需要单独买EM232做输出。CPU226本身的I/O点数远远用不完,但胜在通讯能力强,支持PPI和以太网扩展,后续升级也方便。
IO分配如下表所示:
| 信号 | 地址 | 说明 |
|---|---|---|
| 液位变送器输入 | AIW0 | 4-20mA,对应液位0-5米 |
| 调节阀输出 | AQW0 | 4-20mA,对应阀位0-100% |
| 手自动切换 | I0.0 | 0=手动,1=自动 |
| 高液位报警输出 | Q0.0 | 液位超过上限时置位 |
| 低液位报警输出 | Q0.1 | 液位低于下限时置位 |
| 运行指示灯 | Q0.2 | PLC运行状态指示 |
关于模拟量模块,这里有一个容易踩的坑:EM235侧面的量程卡必须拨到对应位置。比如你用的是4到20毫安信号,量程卡铜片位置要拨到0到20毫安这一档,而不是留在默认的电压档。很多现场送电后发现读数不对,排查半天最后发现是量程卡没拨。
接线方面,二线制变送器的正极接模块的RA端子,负极接A+,RA和A+之间还需要用短接片短接;调节阀接收到的电流信号接在模块的I+和I-。信号线必须用屏蔽双绞线,屏蔽层单端接地,尽量远离动力电缆。这个细节直接决定模拟量读数稳不稳,不要为了省几米线留下麻烦。
2.3 模拟量工程量换算怎么做
S7-200的模拟量输入模块分辨率是12位,对应数字量范围0到32000。电流信号4到20毫安时,数字量是6400到32000。也就是说,变送器输出4毫安(液位0米)时,AIW0读出来的数是6400;输出20毫安(液位5米)时,AIW0读出来是32000。
从原始数字量到工程量的换算公式是:
H = (AIW0 - 6400) × (20.0 - 0.0) / (32000 - 6400) + 0.0
这个公式说白了就是线性缩放,把6400到32000这一段映射到0到5米。注意AIW0读出来是整数,必须先转成32位实数再参与浮点运算,否则梯形图里一除就把小数全丢了,液位显示永远都是整数,控制精度也会大打折扣。
梯形图里我的习惯运算顺序是:先用I_DI指令把AIW0转成双整数,再用DI_R指令转成实数,然后做减法、乘法、除法。计算完成后,把液位存放成实数格式放到VD100,上位机组态王直接读VD100就行。这里不建议PLC里存整数上位机再去换算,因为两边维护两套换算逻辑,出问题的时候排查起来很痛苦。
3. PLC程序逻辑拆解
3.1 程序整体框架怎么搭
S7-200的程序虽然简单,但框架要清晰。我的做法是分几个功能块来组织,分别是模拟量采集与工程转换、PID运算、手自动切换、报警输出。主程序只管调用,不在主程序里堆逻辑,这样才能保证后续维护和排查问题的时候快速定位。
模拟量采集放到主程序每个扫描周期执行一次即可,因为液位信号变化慢,没必要和PID一样做成中断。但PID运算必须在定时中断里调用,不能放在主程序里,因为主程序的扫描周期不是恒定的,PID的采样间隔不稳,积分项计算出来就是错的,系统会一直晃。这一点新手特别容易忽略。
报警逻辑放在主程序末尾,用比较指令和置位复位指令实现高低限报警。高报警和低报警分别设置了死区,避免液位在报警临界点附近波动时报警触点反复跳动。死区的思路很简单:液位超过上限置位报警,回落到上限减去0.1米以下才复位,这个0.1米就是死区。
3.2 PID控制逻辑配置要点
S7-200的PID指令可以用向导生成,我建议直接用Micro/WIN的PID向导来做,比自己写PID指令省心得多。向导里设置回路0,设定值范围0到5,输入量程对应AIW0的6400到32000,输出类型选择模拟量输出,PID增益和积分时间先填一组保守值,后面现场再整定。
单容液位对象我用的是PI控制,D项一般不启用。原因在于液位本身的惯性已经起到滤波作用,微分项对高频扰动敏感,容易放大信号里的噪声,把调节阀搞得来回乱动。只有对响应速度要求极高的场合才考虑加微分,比如某些压力控制。
PID参数整定我习惯用临界比例法。先把积分时间设到最大,微分关闭,逐渐增大比例增益,让系统出现等幅振荡,记下临界增益Kc和振荡周期Tc,然后按经验公式算:P值取0.45倍的Kc,积分时间取0.85倍的Tc。这样出来的参数虽然不是最优,但已经能稳定运行,足够应付大部分液位项目。
有一个细节要注意,PID输出要限幅。调阀的接受范围就是4到20毫安对应的0到100%开度,如果PID输出超限,阀就会一直在全开或全关位置,等到反向偏差积累够了再动,系统会出现大幅振荡。向导里会生成输出上下限参数,我一般把输出下限设成0,上限设成100,靠近阀的物理限位。
3.3 手自动无扰切换的实现
手自动切换是现场操作员用得最多的功能。自动模式下阀位由PID算出来,手动模式下阀位由操作员在组态王画面里直接给。难点在于切换瞬间不能导致阀位跳变,否则液位会突然受到一个大扰动,工艺上可能出问题。
自动切手动的时候,要求手动给定值在切换前自动跟踪当前的PID输出值。也就是说,操作员在自动状态下把画面上的手操值改成当前阀位值,切到手动后阀位不会跳,操作员再在此基础上微调。手动切自动的时候,则要在切过去前把PID的给定值跟踪到当前液位,同时让PID输出从当前阀位起步,避免积分饱和。
梯形图里我用了一个中间变量存放当前阀位PV值,手自动切换时做数值搬运:
// 自动切手动前,把手动设定值更新为当前阀位 LDN I0.0 MOVR VD104, VD112 // 手动切自动前,把PID给定值更新为当前液位,避免偏差突跳 LD I0.0 MOVR VD100, VD108这里的VD104是阀位输出值,VD112是手动阀位设定值,VD108是PID给定值。虽然PLC扫描周期很短,这个跟踪逻辑看上去很简单,但正是这个细节决定了切换顺不顺手。很多项目默认不做无扰切换,结果操作员一切模式整个系统就乱套,最后只能把自动功能给屏蔽掉,那就失去意义了。
3.4 报警与安全联锁
报警逻辑不要做得太复杂,但要可靠。我设置了高报警、高高报警、低报警、低低报警四档,其中高和低用于提醒操作员关注,高高和低低用于联锁动作。高高报警时直接对调节阀输出强制关闭信号,防止液位溢出;低低报警时关停出水泵,防止水泵空转烧毁。
联锁的优先级一定要高于自动控制。也就是说,即使PLC处于自动模式且PID计算要求阀门开大,只要高高报警条件触发,阀门输出必须被联锁条件强制切断。这个逻辑要用物理上的常闭触点思维去写,或者用互锁电路保证,不能只靠软件判断,软件跑飞了联锁还在硬件层面生效才叫可靠。
报警值设置时还要考虑工艺实际。比如罐高5米,高高报警设在4.8米,高报警设在4.5米,低报警设在0.5米,低低报警设在0.3米。如果水池有溢流管,高高报警值就要低于溢流口位置,留出反应时间。
4. 组态王画面组态核心步骤
4.1 组态王工程与设备通讯配置
组态王开发的第一步是新建工程。组态王有一个工程管理器,新建工程时填好工程名称和保存路径,然后进入开发系统。开发系统和运行系统是分开的,画面对应的是开发系统里的画面文件,运行系统才是现场操作员看到的界面。
接下来是定义设备。组态王的设备其实指的是外部通讯对象,也就是PLC。在工程浏览器左侧树形菜单里找到设备,新建一个设备,选择PLC > 西门子 > S7-200系列 > TCP,通讯方式选择以太网。填入PLC的IP地址,这里有个细节,S7-200本体不带以太网口,需要挂CP243-1以太网模块,模块上设置的IP地址要和组态王里填的一致,比如192.168.0.1。
也有用PPI电缆走串口通讯的,设备类型选S7-200系列PPI,设置COM口号和波特率。串口方案成本低,但通讯速度慢,画面刷新率一般只能到几百毫秒,而且笔记本调试时经常遇到串口被占用的问题。如果现场条件允许,我优先用以太网方案,调试方便、数据刷新快,组态王运行起来也明显更流畅。
设备建好之后有个非常重要的操作:测试通讯。在设备属性里点击测试,如果能读到PLC的CPU版本号和站号,说明通讯链路已经通了。这一步通过之后再去做数据词典和画面,能省掉后面一大半的排查工作量。
4.2 数据词典配置与变量规划
数据词典是组态王的核心,所有画面上显示的、操作员能控制的数据都要先在这里定义。这个项目我定义的变量如下:
| 变量名 | 变量类型 | 连接设备 | 寄存器 | 数据类型 | 说明 |
|---|---|---|---|---|---|
| 液位PV | I/O实数 | S7200 | VD100 | FLOAT | 当前液位 |
| 阀位MV | I/O实数 | S7200 | VD104 | FLOAT | 当前阀位 |
| 设定值SP | I/O实数 | S7200 | VD108 | FLOAT | PID给定 |
| 手操值M | I/O实数 | S7200 | VD112 | FLOAT | 手动阀位 |
| 手自动 | I/O离散 | S7200 | V120.0 | BIT | 工作模式 |
这里关键是数据类型要匹配。PLC里VD100存的是实数,组态王变量类型就要选I/O实数,寄存器填VD100,数据类型选FLOAT。如果PLC里存的是整数,组态王选SHORT或LONG,两边对不上读出来的就是乱码。
还有一个常见的坑是寄存器地址冲突。VD100这个地址,占用的是V区100到103四个字节,如果另一个变量用了VW102,就会重叠,数据互相覆盖,调试时非常难发现。我在做变量表时习惯给每个变量留足间隔,比如液位用VD100,阀位用VD104,设定值用VD108,相邻变量之间隔开4个字节以上,杜绝冲突。
手自动这个离散变量,我在PLC里用的是V120.0这个位。组态王里I/O离散变量的读写状态正好对应位,切换操作员点一下按钮就把这个位翻转了。实际操作时要注意,PLC程序里如果对这个位还有别的读写逻辑,一定要确认没有歧义,我曾经见过同一地址在程序和组态王里都被使用,导致按钮点了没反应,最后排查是PLC里某段逻辑把位又覆盖回去了。
4.3 画面绘制与动画连接
画面组态是整个上位机开发里最出活的部分。我一般先把画面背景色改成浅灰,看起来更清爽,然后从图库里调用现成的储罐、阀门、管道元件,没有合适的就自己用矩形和椭圆拼。
画水箱的时候,可以先画一个储罐轮廓,然后在罐体内部画一个矩形,作为液位填充的载体。这个矩形要在动画连接里设置填充属性。选中矩形,右键打开动画连接,选择填充,表达式填\本站点\液位PV,填充方向选择自下而上,填充范围设0到5,对应液位0到5米。这里最关键的是填充最大值要和变量量程一致,否则液位显示和实际高度对不上,比如变量量程0到5,填充最大值填了10,那液位到顶时画面只显示半罐水,看着很别扭。
数值显示用文本旁边的模拟值输出,表达式同样填\本站点\液位PV,设置小数位1位,显示格式是带单位的形式,比如在文本后面直接打一个“米”。组态王支持字符串拼接,这样做出来画面干净又不占空间。
趋势曲线是过程控制画面里必有的元件。我用的方法是插入一个实时趋势曲线控件,然后把液位PV和阀位MV都添加进曲线列表,分别设置不同的颜色,黑色背景是为了让曲线更明显。实时趋势能看到最近几分钟的调节过程,正好用来观察PID响应曲线。
报警窗口也需要配置。组态王的报警系统需要在数据词典里给变量定义报警属性和上下限值,然后在画面里插入报警窗口控件,运行时会自动显示实时报警和报警历史,支持确认和筛选,比在PLC里写一堆报警程序简单太多。
操作按钮方面,我做了一个设定值输入框,操作员运行时在输入框里敲数字回车就能修改给定值;另外做了手自动切换按钮,按钮上显示当前状态,点击切换。按钮的弹起动作里写命令语言:
\\本站点\手自动 = !\\本站点\手自动;这一行就完成了模式翻转。要注意按钮的许可条件,我习惯限制只有操作权限的管理员才能切换模式,防止现场误触。
4.4 运行画面与开发画面不一致的处理
组态王运行画面和开发画面不一致,这个问题被问得太多了。最常见的原因是开发系统默认画面大小是1024乘以768,而运行电脑的屏幕分辨率是1920乘以1080,组态王运行起来画面只有中间一小块,四周要么黑边要么被拉伸变形。
解决办法有两个。一是在开发系统里把画面属性设置成适合当前显示器分辨率的大小,画面右下角有个画面属性窗口,可以填宽度高度,按运行电脑的实际分辨率来设;二是用组态王的画面适应功能,在运行系统里有一个显示选项,勾选画面自动适应窗口,画面比例会按长宽比缩放,但要注意这个功能如果显示器宽高比和画面差别太多,还是会被拉扁。
我现在习惯先把所有画面做成宽屏比例,比如1920乘以1080,然后在现场运行电脑上再统一调整。这样开发机上看到的布局和现场几乎一致,操作员换班后也不会因为画面变形而找不到按钮。
5. 联调过程与通讯问题排错
5.1 现场通讯联调的步骤
设备全部安装到位后,联调的顺序是有讲究的。我从来不会一上来就开组态王,而是先用Micro/WIN软件连接PLC,确认CPU能正常通信、程序下载进去、监控数值没问题。PLC侧确认无误后,再用组态王建立设备、定义变量,打开运行系统看数据是否正常刷新。
组态王的数据词典里,每个I/O变量都有一个状态,运行时如果通讯正常,数值会不停地刷新;如果通讯失败,变量的值会显示为0或者保持初始值不变,同时系统消息窗口里会出现“设备通讯失败”之类的提示。看到这个提示,先ping一下PLC的IP,能通说明物理链路没问题,问题多半出在组态王设备参数上;ping不通,就要检查网线、交换机、CP243-1模块的IP配置。
还有一个隐蔽的问题,很多工控机的Windows防火墙默认拦截S7通讯端口,组态王读不上数据但ping又能通。解决办法是把防火墙关掉,或者添加入站规则放行对应端口。这个问题在Windows 10和Windows 11上尤其常见,现场排查过不少次。
5.2 组态王安装和运行环境踩坑
组态王安装时报错也是高频问题,特别是提示“explorer.exe与.cab不匹配”。这个报错的根源通常是系统时间异常导致安装程序无法验证cab包,或者之前安装过其他版本的组态王残留了注册表信息,又或者是杀毒软件拦截了安装过程中的临时文件释放。
我处理这个问题的经验是三步走。第一步,把系统时间改成当前正确的日期,有些破解版和旧版本对时间校验很敏感,时间不对直接安装失败;第二步,用控制面板卸载掉旧版本,清理安装目录和注册表里残留的KingView项;第三步,安装过程中暂时退出杀毒软件,包括Windows Defender的实时保护,装完再开启。按这个顺序操作,大部分安装类报错都能解决。
另外,组态王不同版本对操作系统的兼容性差异很大,6.53在Windows XP和Windows 7 32位下最稳定,6.60以上版本对Windows 10支持更好。给新项目配工控机的时候,先确认组态王版本再装系统,省得装完了运行起来各种崩溃。
5.3 PID现场调试流程
程序下进去、通讯通了、画面能显示能操作,接下来才是真正考验耐心的阶段:PID参数整定。我的调试流程是先把系统切到手动,操作员手动给定一个阀位,让液位稳定在一个安全值,比如2.5米,然后观察液位变化的趋势,确认变送器读数和实际液位一致。
确认测量没问题后切到自动,按照前面说的临界比例法整定参数。我先用一组保守参数起步,比如增益0.8、积分时间120秒,如果系统没有明显振荡,就逐步加大增益,每次增加0.2,观察液位曲线;如果出现等幅振荡,记录临界增益和振荡周期,按公式算出最终参数,然后再微调。
液位控制现场最容易碰到的问题就是数据跳动。液位数值本身应该是缓慢变化的,但串入电磁干扰后,AIW0读出来的数会在实际值附近来回跳,PID跟着乱算,阀位也跟着抖。这个问题要从源头解决,检查信号屏蔽层接地、模拟量线是否和动力线走在一起、变送器电源是否稳定。实在不行就在PLC里加一个软件滤波,把连续几次采样取平均值再做工程量换算,效果立竿见影。
6. 常见问题速查表与经验心得
6.1 常见问题速查表
把我在类似项目里遇到的典型问题整理成一张表,方便你现场对照排查:
| 现象 | 可能原因 | 处理方法 |
|---|---|---|
| 液位显示0或满量程 | 变送器接线错误、量程卡档位不对、安全栅故障 | 用万用表测变送器输出电流,确认4-20mA信号是否正常 |
| 液位数值乱跳 | 屏蔽层未接地、信号线和动力电缆并行走线、变送器电源纹波大 | 信号线穿管、屏蔽层单端接地、更换稳压电源、加软件滤波 |
| 组态王读不到数据 | 防火墙拦截、设备IP填错、CP243-1模块未配置 | 先ping通,再检查组态王设备参数和Windows防火墙 |
| 运行画面和开发画面不一致 | 画面分辨率设置不对、显示比例被拉伸 | 按运行电脑分辨率设置画面大小,或开启画面适应 |
| 手动切自动瞬间液位波动大 | 切换时PID给定值和当前液位偏差大 | 确保手动切自动前将给定值跟踪到当前液位 |
| 自动状态下阀位来回震荡 | PID增益太大、积分时间太短、输出上限太小 | 降低增益、增大积分时间,把输出限幅留出合理余量 |
| 报警反复触发 | 报警死区设置过小 | 在报警逻辑中增加死区和延时确认 |
| 组态王安装报explorer.exe与.cab不匹配 | 系统时间不对、旧版本残留、杀毒软件拦截 | 校正时间、彻底卸载旧版、临时关闭杀毒软件 |
6.2 几个值得长期坚持的工程习惯
做完这个项目,让我最有感触的几个习惯一定要分享给做工控的朋友。
第一,所有软件工程文件必须定期备份。S7-200的程序和组态王工程,做好一个版本就压缩存档,命名要带上日期和修改内容。现场设备跑五年十年,可能换了好几任维护工程师,没有存档意味着以后改程序只能对着运行中的PLC盲操作,痛苦程度难以想象。
第二,PLC程序里注释要写清楚。S7-200自带符号表,每个地址都要定义有意义的符号名,比如液位PV、阀位MV、手自动切换,而不是VW100、VW104这些裸地址。组态王里变量命名也要统一前缀,方便管理和查找,我习惯用液位、阀位、设定、报警这样的中文命名。
第三,报警和联锁逻辑必须独立测试。不要等到整个系统联动的时候才验证报警动作,单独强制变送器信号,逐个触发电接点,确认每一个报警输出和联锁动作都正确,再恢复现场。这个环节花的时间不多,但能避免设备损坏和工艺事故。
第四,通讯异常的处理要循序渐进。先看硬件指示灯,再看软件状态,最后看防火墙和配置。不要一上来就重装软件,很多时候重装完问题依旧,反而把原本正常的通讯参数搞乱了。
做这套项目的时候,我也遇到过一次很不顺的调试经历。PID参数怎么调都振荡,后来发现是调节阀本身存在较严重的死区,执行器接收到小信号变化时根本没动作,等到累积偏差变大又突然窜一大步。后来在阀位输出处加了一个一阶惯性环节,相当于把PID输出做平滑处理后送到执行器,问题才解决。现场问题千奇百怪,参数整定之前一定要先确认执行机构和测量元件是好的,否则再好的PID算法也救不回来。
这套S7-200加组态王的组合,如果你完整走一遍,等于把工控里最常用的几块技能全部练了一遍:模拟量采集与换算、PID控制、PLC编程、上位机组态、现场调试。以后再接触DCS、其他品牌PLC,思路都是相通的。希望这篇文章能帮你少踩几个我当年踩过的坑,也欢迎在评论区交流你遇到的项目问题。