ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

热交换站PLC控制系统设计与PID整定实战:从S7-200到组态王

热交换站PLC控制系统设计与PID整定实战:从S7-200到组态王

开干。这活儿我在现场调试过好几回,一说热交换站控制,外行觉得不就是个换热器加几个泵嘛,但真正搞过的人都知道,这玩意儿在整个供热系统里就是个心脏。一次侧高温热水进来,二次侧循环水送出去,中间隔着一层板换,压力、温度、流量相互耦合。控制好了,整个热网稳稳当当;控制不好,要么温度忽高忽低用户投诉,要么补水泵频繁启停把机械密封搞漏,严重的能把二次网压力打崩,整个系统直接瘫痪。

我当年在某供暖改造项目里,用的就是西门子S7-200 PLC配组态王这套组合。S7-200的CPU224,配上两个EM231模拟量输入模块和一个EM232模拟量输出模块,机柜里再装几个继电器、断路器、接触器,组态王跑在工控机上。这套配置现在看是有点老了,但在当时的改造项目里已经算靠谱的。今天我把当时写过的控制方案和代码逻辑扒拉出来,把核心思路、PID参数整定的实际经验、以及组态王画面开发时踩过的坑,一次性聊透。

1. 热交换站控制系统的整体框架

1.1 热交换站的核心控制对象

想搞懂控制方案,先得搞清楚现场有什么东西。一个典型的热交换站,主要设备有板式换热器、一次侧电动调节阀、二次侧循环泵(一般是两用一备或一用一备)、补水泵(通常一用一备)、各种压力变送器、温度传感器、流量计,还有一个落地膨胀水箱或者定压罐。

流程说起来简单:一次网的高温热水(大概110℃左右,具体看热力公司调度)经过电动调节阀进入板换的一次侧,把热量传给二次侧的循环水,二次侧回水通过循环泵加压送回各楼栋用户。补水系统负责维持二次网的压力稳定,因为跑冒滴漏难免,压力低了就得补水。

这些设备不是孤立的。调节阀开度直接影响换热量,换热量决定二次供水温度;二次供水温度升高,用户暖气片散热量增大,回水温度上升;循环泵频率改变系统的流量分布,流量变小后供回水温差拉大。这些都是强耦合关系,所以控制策略必须有一个清晰的骨架,不能头痛医头脚痛医脚。

1.2 为什么选S7-200 PLC配合组态王

到今天还有人问我,现在都是S7-1200/S7-1500的天下,干嘛还用S7-200?道理很简单——存量市场太大,而且S7-200的可靠性是真的经得住考验。我当时做的那批热交换站,很多都在老旧小区的地下室里,环境潮湿、温度高、灰尘大,甚至有些站里还漏过水,S7-200照样稳稳跑了好几个采暖季,没出过什么大毛病。

更重要的是,S7-200的指令系统简单,逻辑扫描一次也就几毫秒到几十毫秒。供热控制不像运动控制那样需要微秒级响应,温度变化带本来就慢,100ms的扫描周期完全够用。再加上它的PID向导写起来顺手,模拟量处理直观,实时时钟、定时器、计数器都齐全,做热交换站这种中等复杂度的过程控制很合适。

组态王这侧,当时选它是因为它和S7-200的通信驱动成熟,通过PC/PPI电缆或者CP243-1以太网模块都能稳定通讯。而且组态王在国产组态软件里确实积累了大量用户,历史曲线、报表、报警这些功能都做得比较顺手,现场运维工人上手也快。工期紧的时候,稍微改改就能用,不用从零开发。

提示:这套方案的核心经验就是“稳定压倒一切”。热交换站不是上新技术的地方,散热器用户末端管网水力工况本来就复杂,控制方案要稳、要容易排查,不要整太花哨的东西。

2. 核心控制逻辑的实现细节

2.1 二次供水温度控制与PID调节

热交换站控制的核心,就是二次供水温度。用户家里暖不暖和,直接看这个指标。控制思路很直接:用一次侧电动调节阀的开度来调节二次供水温度。温度高于设定值,阀门关小;温度低于设定值,阀门开大。

但这里面的门道在于PID调节。S7-200的PID指令要求所有输入输出都归一化成0.0到1.0之间的实数。比如温度变送器量程是0到100℃(对应4到20mA信号),AIW0读出来的是0到32000的整数,PID指令里用的温度PV值就必须是实际温度除以量程,比如实测50℃,归一化后就是50/100=0.5。设置值也按同样比例计算,比如设定供水温度60℃,SP值就是0.6。

PID输出也要反过来处理。S7-200的PID输出是一个0.0到1.0的实数,需要乘以32000得到整数后,再写到AQW口输出给调节阀。调节阀如果接收的是4到20mA信号,输出0对应4mA,输出32000对应20mA,阀全关到阀全开,线性关系。

我当时用PID向导生成PID0块,输入反馈接AIW0归一化后的值,设定值根据分时段和外网温度修正综合算出来,输出映射到AQW0。采样时间设了2秒。为什么设2秒?供热系统温度变化惯性大,采样太快反而容易抖动,而且S7-200的PID指令需要手动安排采样周期,用定时中断来执行。

比较关键的一点是积分饱和控制。热交换站刚启动时,或者室外气温骤降时,二次供水温度和设定值差距很大,PID的积分项会一直累积,输出飙到100%。等实际温度达到设定值时,积分项已经很大了,需要很长时间才能退回来,这就会导致温度过冲,用户端忽冷忽热。

解决积分饱和的办法是让调节阀全开或全关时限制PID的输出,把PID输出上限设到95%或98%。实际调试中还发现,启动初期用手动方式控制阀门开度,先把系统循环建立起来,再切到自动模式,能有效减少过冲。

2.2 二次网压差控制与循环泵变频

二次网的压力控制分两个部分:一个是压差——保证最远端用户也有足够的资用压头把热水顶上去;另一个是补水定压——保证系统不亏水不漏水。

循环泵变频器的频率给定值,由二次网供水压差变送器的反馈来决定。设定压差根据建筑层高和末端设备来确定。我记得有一片区域的楼是六层,大概18米,压差设定在0.15MPa左右。运行中如果发现远端用户不热,就要适当调高压差。

压差控制本身也用PID,但比温度控制简单得多。循环泵频率范围锁定在25到45Hz之间,低于25Hz容易造成泵过热(因为电机自带风扇风量不够),高于45Hz噪音太大而且对管网冲击大。给变频器的频率信号通过模拟量模块输出,对应0到50Hz。

压差PID的更新周期比温度PID快一些,设了1秒。因为水的压力传播速度接近声速,压差变化的响应比较快,如果采样太慢,泵的调整会有明显的滞后感。

还有一个要点是循环泵的启停顺序。系统启动时先启循环泵,让水循环建立起来,再把一次侧调节阀投入;停机时反过来,先全关一次侧阀门,再停循环泵,防止板换局部过热损伤密封垫。这个顺序用PLC程序里的步进逻辑来控制,加上定时器延时,保证每一步动作稳定。

2.3 补水控制与安全联锁逻辑

补水系统负责维持二次网的静压。静压设定值一般是系统最高点加5到10米水柱,算下来比如系统最高点25米,那补水压力就设定在0.30到0.35MPa。供水压力低于下限时补水泵启动,达到上限时停止,有需要时还要加自动排气阀配合运行。

补水控制我用的是双液位加压力联锁的方式。核心保护逻辑有这几条:

  • 补水箱液位低时禁启补水泵,防止泵空转烧机械密封;
  • 二次网供水压力低于下限(0.15MPa)时,补水泵自动启动;
  • 压力升到上限(0.35MPa)时停泵;
  • 如果压力继续升到超限报警值(0.45MPa),打开泄压电磁阀;
  • 补水泵连续运行超过20分钟压力还没上来,系统判断可能是管网泄漏过大,设备自动停泵并报警,防止空打浪费时间磨损设备。

这里容易踩的坑是压力取样的位置和时间点。补水泵启动瞬间,压力信号会有一个突然的跃升,如果PID或者逻辑判断太灵敏,就会误触发超压报警。所以程序里加了一个延时判断,压力信号持续3秒以上才做动作。

2.4 分时段与室外温度补偿策略

供热系统不是不管白天黑夜都烧一样的供水温度。白天上班上学的人多,晚上回来了对温度的需求高;室外温度高的时候,供水温度可以低一点;室外温度骤降的时候,供水温度要提前升上去。这靠单纯手工设定一个固定值肯定不够。

S7-200自带实时时钟,用系统的内部时钟读取当前时间,通过时间段比较指令,判断当前处于白天时段还是夜间时段。白天时段可以设定一个基础设定温度,后半夜跟凌晨则降低设定温度,既能保证不冷又节省了热量输入。加上室外温度变送器的信号,还可以做一个室外温度补偿——温度越低设定值越高,形成一个简单的分段线性关系。

这一块代码不难,难的是现场参数怎么定。每个小区的围护结构、散热器片数、管道保温状态都不一样,不能照抄隔壁站的参数。第一次投运时我通常把白天的设定值定得保守一些,实际观察用户回水温度趋势,再逐步调整。

3. S7-200核心代码解析

3.1 模拟量采集与工程值转换

手写S7-200的梯形图(LAD)或者语句表(STL)之前,先要处理模拟量转换。模拟量输入模块把4到20mA转换为0到32000的整数,这个整数要换算成温度、压力这些工程值。我当时在程序里用浮点指令来做转换,核心逻辑如下:

LD SM0.0 MOVW AIW0, LW0 // 读取原始模拟量整数 ITD LW0, LD4 // 转换为双整数 DTR LD4, LD8 // 转换为实数 MOVR LD8, LD12 /R 32000.0, LD12 // 归一化到0.0~1.0 MOVR LD12, VD100 // 存储归一化温度值

如果要显示实际温度,就把归一化值乘以量程上限(比如100.0摄氏度)。我这里会建议在触摸屏或者组态王画面上直接显示归一化后的值乘以量程,避免PLC程序里去多次转换、损失精度。

3.2 温度PID与本地面板参数调整

LD SM0.0 MOVR VD100, VD204 // PV反馈值送入PID的PV输入 MOVR VD200, VD208 // SP设定值送入PID的设定值 CALL PID0 // 执行PID0指令 MOVR VD212, VD300 // 取出PID输出(0.0~1.0) *R 32000.0, VD300 // 转换为输出整数比例 TRUNC VD300, VD304 // 转换为双整数 MOVW VD304, AQW0 // 写入模拟量输出模块

这里VD200是设定值,VD204是反馈值,VD212是PID计算后的输出。S7-200的PID指令使用M0.0的方式调用,需要先在程序里手工置位M0.0来使能。我一般都把PID运行使能放在SM0.0上,让它每个扫描周期都在运行,但PID的输出要经过手自动切换逻辑判断以后再送到AQW0。

手自动切换很关键,现场调试时必须能在自动失灵的情况下切到手动模式进行应急操作。我在组态王画面上放了一个切换按钮,PLC里的M10.0代表自动状态。自动状态时PID输出送AQW0;手动状态时,操作员在画面上输入的开度百分比乘以32000后送AQW0。

3.3 压差变频输出与泵启停控制

循环泵变频器的频率给定逻辑与PID类似,但多了几个保护条件。

LD I0.0 // 远程启动命令 A M20.0 // 泵允许运行标志 = Q0.0 // 循环泵1接触器

泵的启动条件包括进线电源正常、变频器无故障、手动/自动切换状态正确、所有联锁保护条件满足。泵停止时还有一个滞后停机时间,防止一次侧阀门还没关完泵就停了,导致热水局部过热。

3.4 实时时钟与分时段控制

用S7-200的READ_RTC指令读取PLC内置时钟。本地时间的小时值可以用于判断当前处于哪个运行时段。

LD SM0.0 CALL READ_RTC, VB400 // 读取时钟到VB400开始区域 LD >= VB401, 6 // 6点及以上 A <= VB401, 22 // 22点及以下 = M40.0 // 白天时段标志

然后用这个时段标志去修改PID设定值的来源。白天时段用预设日间设定值,夜间时段用夜間设定值。

4. 组态王画面开发与通信配置

4.1 通信连接设置

组态王和S7-200之间的通信,我建议用PC/PPI电缆,优点是成本低、接线简单,缺点是速率不算高,但画面刷新率要求不高的话完全够用。通信参数里注意将波特率设为9600或者和PLC侧一致,PLC的站地址默认2,组态王定义的设备地址要对应得上。

如果距离远,比如工控机离PLC机柜超过50米,PC/PPI电缆就不行了,只能换CP243-1以太网模块。组态王里选对应的S7-TCP驱动,填IP地址。两种方式我都用过,PPI方式更省事,TCP方式更抗干扰、速度更快。

4.2 IO变量定义与地址映射

组态王里的变量类型要跟S7-200的内存区对应好。温度、压力这种浮点数值的工程值,我一般存放在VD区,组态王定义对应的I/O实数变量,访问地址就填VD100、VD104这些。泵的手自动状态、运行状态这种开关量,存放在M区,组态王定义I/O离散变量。

有个容易出错的地方是字节顺序。S7-200的数据是高字节在前,组态王默认也是高字节在前,但如果出现数值错乱的情况,就是字节顺序选错了。定义变量时一定要确认数据格式,检查好数值会不会明显不符合实际工程值范围。

4.3 画面设计与操作员权限

组态王画面开发时我坚持一个原则:一屏看全所有关键运行参数。主画面就放二次供回水温度、一次供回水温度、二次供回水压力、循环泵频率反馈、调节阀开度反馈、补水泵状态,实时曲线和历史趋势放一块,报警信息窗口单独放一块。

报警处置要配上权限等级管理。普通运行人员只能看数据、不能改设定值;班长可以调整温度设定值;技术员或者工程师才能改PID参数。组态王的用户权限功能里可以配置不同级别账号,避免操作失误导致整个系统出问题。

5. 调试经验与问题排查实录

5.1 温度控制PID参数整定的全过程

现场调PID参数是最考验经验的地方。先说结论:供热系统温度控制是被控对象惯性很大的系统,纯比例控制容易产生漫长等幅振荡,比例加积分是主力,微分项基本用不上。

我的整定步骤是这样的:先把PID积分时间设到很大(比如9999秒),微分时间设0,比例增益从0.2开始。观察温度变化趋势,如果温度爬升慢、稳态误差大,适当增加比例增益;如果温度上下振荡,减小比例增益。调到一个基本稳定但稍微有点小波动的状态后,逐步减小积分时间,让稳态误差消失。一般情况下比例增益落在0.5到1.5之间,积分时间落在50到200秒之间,具体取决于板换面积和二次网水容量。

调试时最有效的办法是先用手动模式干活。比如把调节阀开到40%,观察二次供水温度稳定在什么数值。等一切稳下来了,再切到自动,让PID设定值跟当前实际温度相近,让系统平稳切入自动控制。

5.2 信号干扰与现场故障排查

热交换站里有变频器、接触器、继电器这些干扰源,模拟量信号线如果跟动力电缆走一个线槽,那画面上的压力值就像过山车一样跳。我后来要求所有模拟量信号必须用屏蔽双绞线,屏蔽层在PLC柜侧单端接地;信号线远离动力电缆,至少保持20厘米间距;变频器输出侧加电抗器或者磁环,输入侧加EMC滤波器。这几个措施做完,信号基本就干净了。

有一次现场温度显示总是比实际值高十几度,排查后发现是一个温度变送器的地线接错了,导致地环路电压叠加在信号线上。还有一次压力波动很规律,每隔几秒跳一次,最后查到是补水泵的机械密封泄漏,压力周期性波动被变送器捕捉到了,这是设备问题不是信号问题。

5.3 常见故障速查表

故障现象可能原因处理办法
调节阀不受控制阀卡死、信号线断、手自动切错先切手动,现场扳手扳动阀门看是否正常,再查信号回路
PID输出极值振荡比例增益过大或积分时间过短切换到手动稳定工况,重新整定PID参数
二次供水温度过高设定值偏差、PID输出过大、阀门实际开度大检查设定值来源,切到手动关小阀门观察变化
补水泵频繁启停系统泄漏、压力设定下限过高、信号不稳定查系统是否漏水,调整压力上下限,检查压力变送器信号质量
组态王画面数值乱码变量数据类型不对、字节顺序错误核对变量地址、类型、字节顺序,重新建立连接

5.4 停电恢复与上电自启逻辑

热交换站停电后重新来电,设备不能自己闷头启动。我见过不少站因为电源恢复后泵自动启动,造成启动电流叠加,导致整个配电柜跳闸的。正确的顺序是先让控制系统低压上电,PLC运行正常以后,再手动/自动执行启动顺序:先启循环泵,建立循环,再开补水泵定压,最后开调节阀。

程序里需要加一个“上电初始化”逻辑。PLC上电第一次扫描时,把所有Q输出复位,输出模块的模拟量全部清零,再运行主程序。等操作员确认现场无故障后,按启动按钮才进入正常运行流程。

6. 最后一Proc经验体会

这套S7-200加组态王的方案,这套热交换站控制系统,我前后投运了差不多有六七个项目。说实在的,方案本身并不是多高端多先进的东西,它的价值在于把复杂的供热控制需求拆解清晰,然后用最简单、最稳定的方式实现。PLC程序的逻辑并不复杂,组态王画面也就七八个界面,真正的功力体现在控制策略设计、PID参数整定、现场细节处理上。

最后再分享一个小技巧:热交换站的控制系统一定保留一个纯硬件的“应急运行开关”。万一PLC出故障了,操作员可以切到应急模式,用一个简单的继电器回路把循环泵和补水泵直接启动起来,虽然不能自动调节温度,但至少能保证用户端不倒灌、不爆管。这个小回路花不了几个钱,但关键时候能顶大用。我见过太多项目把全部鸡蛋放在PLC一个篮子里,PLC一坏整个站就瘫痪了,属于典型的控制过度依赖单一环节。这个经验贴出来,希望对正在搞或者准备搞热交换站控制项目的同行有点参考价值。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进