1. 这个换热站项目到底要解决什么问题
先说结论:这套系统就是把老式换热站里人工盯着温度表、跑上跑下拧阀门的工作,改成由PLC自动判断、组态王画面远程监控的操作方式。我在做过的换热站项目里,十个里面至少有八个都是同一个痛点——一次侧高温热水进站之后,二次侧给住户供暖的水温很难稳住,楼层高低不一样、白天晚上负荷不一样,如果全靠换热站值班员手动调,温度波动能超过七八度,住户投诉电话能打爆。
这套S7-200 PLC和组态王的换热站监控系统,解决的就是三件事:第一,二次供水温度按设定曲线自动调节;第二,循环泵、补水泵和阀门之间的联锁保护;第三,把换热站里的温度、压力、泵启停状态全部送到组态王画面上,让值班人员在电脑前就能看到整个站的情况。说白了,就是给换热站装上一套“自动巡航加仪表盘”。
2. 硬件基础:I/O点表、模块选型与接线图设计
2.1 现场设备清单和I/O点表规划
做换热站项目很容易犯一个错误,就是一上来就画梯形图。实际上我每次都会先把设备清单和I/O点表做出来,因为点表定了,CPU被选多大、模拟量模块买哪个、控制柜要留多少端子,这些全跟着定了。
一套典型的小型换热站,现场设备大概是这样的:
- 一次侧进站电动调节阀,一个,用来调节高温热水流量
- 一次侧流量计、二次侧流量计各一台
- 二次侧供水温度、回水温度传感器(PT100热电阻)
- 一次侧供水温度、回水温度传感器
- 二次侧供水压力、回水压力变送器(4-20mA信号)
- 循环泵两台,一用一备,带变频器
- 补水泵一到两台,给二次管网补水
- 水箱液位开关或者液位变送器
对照这个清单,I/O点表大致是:
| 信号类型 | 用途 | 数量 |
|---|---|---|
| AI(模拟量输入) | PT100温度信号或4-20mA温度变送器 | 4-6路 |
| AI(模拟量输入) | 压力变送器4-20mA | 2-4路 |
| DI(数字量输入) | 泵的运行反馈、故障反馈、手自动状态 | 6-10路 |
| DO(数字量输出) | 泵启停命令、阀门开/关/调节命令 | 4-8路 |
| AO(模拟量输出) | 变频器频率给定、电动调节阀开度给定 | 2-3路 |
很多新手容易漏掉两种信号:一种是泵的变频器反馈频率和运行电流,另一种是电动调节阀的实际反馈开度。这两种信号虽然不影响基本控制,但组态王画面上如果没有这些数据,值班员根本不知道泵实际在跑多少转速、阀门到底开了多大。所以只要预算和通道够,我都建议把这它们加上,宁可点位冗余,不要后期不够用。
2.2 CPU选型和模拟量模块选择
S7-200这个系列现在西门子已经停售了,但存量项目特别大,二手市场也很活跃,而且好多老旧换热站都是S7-200在跑,所以我做这类改造项目的时候还是会用它。选型原则很简单:
- 如果只有数字量,基本没有模拟量,CPU 222或224够用
- 只要有模拟量通道,最少选CPU 224XP或者CPU 226,前者自带两路模拟量输入一路模拟量输出,后者完全没有模拟量,但IO点数扩展能力更强
- 模拟量通道需求超过4路,就必须挂EM231(热电阻型或4-20mA型)或EM235模拟量混合模块
我以前给一个两台循环泵的换热站做过选型,当时的点位是8DI、4DO、4AI、1AO,选了CPU 224XP加一块EM231,理由是CPU 224XP自带的两路AI接两个压力变送器,EM231的4路AI接四路PT100温度信号,CPU自带的AO直接给变频器做频率给定。这样模块数量最少,柜子里走线简单,通讯也更稳。
选模块时还要注意一个细节:EM231的热电阻版本和电流版本是分开的,热电阻版本不能直接接4-20mA信号。要是现场信号既有PT100又有变送器,很多时候需要买两种模块拆开接。为了避免这个问题,把所有的温度信号统一用温度变送器转成4-20mA,就可以全部用电流型模块,统一接线方式,检查和维护都方便不少。
2.3 接线图和原理图的关键细节
接线图和原理图这块,我踩过的坑比程序调试多好几倍。画图的时候看着没问题,到了现场接线才发现,很多问题全是图上没标注清楚造成的。
先说电源分配。S7-200 CPU本体是24V直流供电,但现场往往同时存在220V电动调节阀和380V水泵电机,哪怕有控制柜,也见过把24V地和220V零线捋在一起的接线方式,一送电模块就冒烟。所以接线图里必须单画一页电源分配图,标明总断路器、24V开关电源、各回路断路器的层级关系。经验做法是24V开关电源只带PLC模块和传感器,泵、阀的供电回路全部走独立的继电器/接触器控制回路。
然后是模拟量信号线。压力变送器用两线制接法:正极接模块输入通道的AI+,负极接模块的M端,同时把变送器的屏蔽层单端接地。RTD热电阻用三线制接法,A、B、B三根线对应模块的端子。把屏蔽层一端接柜内接地排,另一端悬空,不要两端都接地,要不然会在两个接地点之间形成地环路电流,干扰数值会明显变大。
数字量输入那边,如果是220V的中间继电器触点信号,就选用24V中间继电器转接一次再接PLC输入。输入端的公共端COM要统一接24V正或负,这个在接线图上必须明确标明,我见过接反了整排输入灯全亮的情况,排查的时候一对图纸才发现公共端标错了。
控制柜接地也必须在图纸上体现。PLC模块的M端子、24V开关电源的负极、模拟量模块的GND、柜体接地排这四者怎么连接,不同的项目有不同的推荐方式。我习惯的做法:柜体接地排单独接到大地,24V电源负极和PLC的M端在同一个端子排短接,然后信号屏蔽层单独接接地排。整体思路是不要让动力回路的接地和信号回路混在一起形成回路。
3. 梯形图程序:从结构框架到核心控制逻辑
3.1 程序架构设计
S7-200的程序结构分主程序、子程序、中断程序三个层级。换热站控制程序我习惯这样分:主程序只管调用和状态机切换,模拟量采集和工程量换算单独放一个子程序,泵和阀的联锁逻辑放另一个子程序,PID调节放在主程序里定时执行,报警处理单独建一个子程序。
这样拆分有个明显的好处:调试的时候可以先屏蔽联锁逻辑,单独测PID;或者停用报警程序,单独试泵启停。如果所有逻辑全堆在主程序循环里,中途改一处可能要翻几百行梯形图。
程序扫描周期方面,S7-200默认扫描很快,对于换热站这种温度变化缓慢的系统,完全不需要跑那么快。我一般用定时中断或者直接在主程序里做延时——把PID计算和报警检测放到比如5秒钟执行一次的子程序里,其它时间让PLC空跑。这样省不了多少CPU,但对防止模拟量数值抖动引发的误动作特别有效,很多新手的温度忽高忽低导致频繁起停泵,就是因为扫描周期太快、滤波没做好。
3.2 模拟量采集与工程量转换:从A/D值到实际工程单位的换算
模拟量转换是所有PLC程序里第一个要处理的环节。S7-200的模拟量模块把4-20mA信号转换成0-32000或0-27648的整数,温度变送器出来的实际温度和这个整数之间是线性关系。
比如说,一个温度变送器量程是0到100℃,对应4-20mA,模块量程是0到32000,那么当前温度的计算公式是:
实际温度 = (AIW读取值 × 100) / 32000
这段用梯形图写,就需要用整数除法或者浮点数运算。S7-200有个很方便的指令,把AIW0的值用I_DI指令转成双整数,再转成实数,然后用浮点指令做乘除运算。这里我专门强调一下:新搜到的热搜词里有一条“S7-200中将10进制转换为16进制的程序梯形图”——很多调试人员在实际项目里会遇到进制换算的问题。
比如做显示、组态王通信时,有些设备的通信报文里报文帧长度或者校验值需要十六进制,S7-200没有直接的十进制转十六进制指令,通常的处理方式是用查表法或循环移位拼接法。十进制转十六进制最常用的思路就是除16取余法,梯形图里可以用除法指令和传送指令组合实现。不过在这里要说得直白一点:对于组态王和S7-200之间的浮点数通信,一般不用操心十六进制的事,组态王里定义成实数变量,驱动自己会处理转换。只有当你需要做MODBUS报文、和一些特殊仪表做自由口通信时,才需要自己拼十六进制字节。所以如果你只是因为在做换热站监控项目而搜到这条热搜,大可以先把这个知识点记下来备用,主程序里大多数情况下用不上。
工程量转换这段做完,程序里要再做一次模拟量滤波。最简单的做法是连续采五个周期,去掉最大值最小值,取中间三个的平均值。这个逻辑用梯形图写起来有点绕,核心思路就是先用比较指令找出最大最小,然后累加减掉最大最小,最后除以三。在现场没有专用信号隔离器的情况下,这个滤波逻辑能明显减轻传感器信号不稳的问题。
3.3 循环泵联锁与手自动切换控制
两台循环泵一用一备的控制逻辑,是换热站梯形图里最典型的一段。核心要求有几个:
- 两台泵不能同时启动
- 工作泵故障时,备用泵需要自动投入
- 泵启动前需要满足“无故障且允许启动”条件
- 手自动切换时不能造成现场设备突然启停
梯形图实现的时候,我用了一个很经典的写法:先建立“泵A允许启动”网络,内容包括“泵B不在运行且泵B没有故障且补水箱液位正常”;再建立“泵A运行输出”网络,内容是“允许启动加手动启动按钮,或者自动模式下的启动条件维持”。泵B的逻辑完全对称。
自动投入的逻辑,要用一个“运行泵故障记忆”中间继电器来做。比如泵A在运行、泵B在备用,突然泵A故障反馈断开,PLC的程序在下一个扫描周期就会检测到,然后置位“泵A故障”标志,同时复位泵A输出、置位泵B输出。这里需要注意一点:泵的启动命令发出之后,接触器吸合、泵实际转动起来需要大概一两秒,所以程序中要做“启动延时确认”——发出启动命令后,设定一个例如5秒的定时器,如果定时器到时间还没收到运行反馈,就判定为启动失败,输出故障报警。
手自动切换要特别注意,不能直接在“手动”状态下去强制中间继电器——因为一旦强制了,切回自动后这个继电器状态可能失控。正确做法是:手动模式下,直接对输出点进行操作;自动模式下,对控制字操作,最后统一经过“手自动切换中间继电器”串联到输出。切换的瞬间,用一个“切换确认按钮”加延时,防止误碰和抖动。
循环泵的开停还要和一次侧电动调节阀做“低限保护”。如果一次侧温度过低、或者一次侧流量太小,而循环泵还在全力运行,会造成二次侧供水温度严重不足,所以在循环泵启动条件里,要加入一次侧温度下限联锁。低于下限时,就算自动逻辑发出启动指令,泵也不能启动。
3.4 温度PID调节与补水阀逻辑
二次供水温度控制,是整个换热站自动化水平的体现。控制对象是一次侧电动调节阀,被控量是二次供水温度。
S7-200的标准PID功能块(PID指令)使用起来不复杂,但有几个细节必须处理好。首先,PID指令的输入量需要归一化到0.0到1.0之间的实数,比如设定温度是60℃、量程0-100℃,给定值就是0.6;过程变量PV实测温度也要先换算成实数,再除以100.0归一化。然后输出也需要从0.0-1.0的比例映射成4-20mA信号,通常是用MUL_R乘上32000再转成整数给AQW输出。
PID的参数整定方面,换热站这种大滞后对象,直接套用书上推荐的“P=2、I=30秒”之类的参数往往不理想。我在现场一般用“两步法”:第一步,把积分时间设得很大、微分关掉,只留比例,增大P值直到温度开始等幅振荡,记下此时的比例增益;第二步,把P降到临界值的一半左右,再设积分时间为振荡周期的1/1.2到1/1.6倍。实际调下来,常见参数是P在1.5到3.0之间、I在60到180秒之间。换热站温度变化本身就慢,不用追求快速响应,稳定优先。
补水阀逻辑相对简单:二次回水压力低于设定下限时开阀补水,高于设定上限时关阀停止补水。这里要注意一个常见的坑——不要直接把比较结果填到输出上,那样阀门会在开关限位点附近来回抖动。必须加回差,也就是说,开阀点在0.25MPa,关阀点在0.30MPa,中间0.25到0.30这段区域是死区,阀门保持原状态。回差至少要有0.02到0.05MPa,否则阀门一天能动作几十次,阀芯很快就磨损了。
3.5 报警处理和数据保持
报警逻辑不复杂,但直接影响站里的安全性。我做的换热站程序里,报警点一般包括:二次供水温度超上限、二次回水压力超下限、水箱液位低、循环泵故障、补水泵故障、调节阀反馈丢失。
梯形图写法是用比较和置复位做“报警锁存”。比如温度超上限,置位一个“温度高报警”中间继电器,同时在组态王显示一个红色闪烁块。温度恢复正常后,需要人工在复位按钮上确认、或者组态王远程复位,报警才能解除。锁存的意义在于,温度瞬间闪了一下你不会知道曾经超标过,锁存后连过去有没有异常都看得清清楚楚。
特殊记忆方面,S7-200的M存储区断电会丢数据,V存储区带电池可以保持。所以那些运行累计时间、故障历史记录、PID整定参数,全部要放到V区。并且要预先在系统块里把“断电数据保持”范围设定好,比如VB100到VB200范围保持。新装PLC如果不做这一步,程序下进去后一断电参数全清零。
4. 组态王6.60组态画面开发与通讯配置
4.1 组态王版本选择与S7-200通讯搭建
组态王做换热站监控画面已经是很成熟的路径了。网上一搜能看见“组态王6.60sp4下载”“组态王安装教程”这些热搜,说明现在大部分人用的还是6.60系列。我这么说:如果手里有正版授权,用6.60sp4就行;如果是旧项目维护,版本不必追新,关键是驱动要匹配好操作系统和电脑位数。
组态王与S7-200通讯,最常用的方式是MPI通讯或PPI通讯。老的上位机插一块CP5611板卡,走MPI电缆连接S7-200的编程口。现在很多新电脑已经没有PCI插槽了,我用的比较多的是通过以太网模块(如CP243-1)或串口服务器转以太网,然后在组态王的“设备配置向导”里选择“西门子S7-200 TCP”驱动。这样做的好处是组态王和PLC之间可以走网络连接,不用占用电脑的串口。
配置S7-200 TCP驱动时需要注意的是,组态王设备地址通常要填成PLC的IP地址,比如192.168.0.2,而不是插槽号或机架号。S7-200和S7-300/400不一样,它没有复杂的硬件组态概念,填IP就对了。通讯超时时间建议设到3秒以上,换热站数据刷新率不是特别高,如果把超时时间设太短,偶发的通讯抖动会让组态王报一堆“设备失败”。这不算程序问题,但现场看到这个提示会很慌。
4.2 数据词典变量定义与映射方式
组态王里所有和PLC交换的数据,都要先在数据词典里定义变量。变量类型主要用I/O实数、I/O整数和I/O离散。我的习惯是:
- 温度、压力、频率这些模拟量,全部用I/O实数
- 泵启停状态、阀门开关状态、故障报警状态,用I/O离散
- 一些累计量,比如累计流量、运行时间,用I/O整数或长整数
变量连接时有个容易搞混的地方:组态王驱动里访问S7-200的V区地址时,要填写数据长度和寄存器格式。比如PLC侧的VW100是一个16位整数,组态王里就要选择“V”寄存器,地址填101(注意组态王和STEP 7的地址偏移有所不同)。如果不小心把整数读成实数,数值会变得非常离谱——由于两个字节的排列顺序不一致,或是数据类型长度不匹配。我的经验是,每定义完一个变量,先切换系统进入运行态,看那个变量的实时值是否合理,再批量定义,省得到后面几百个变量一起建完才发现全是错位数据。
还有一件事必须提醒:组态王变量的“采集频率”不要设得太密。温度压力这些不要求毫秒级响应,设2秒一次足够。设成100毫秒一次的话,通讯链路一直处于高速请求状态,画面切换和操作按钮的响应反而会受影响,还会加重PLC的通讯负担。这在换热站这种慢过程系统里没有任何收益。
4.3 换热站监控画面制作与图库使用
组态王的画面开发,说白了两件事:画得像,数据对。
画得像,是指要让值班人员一眼看懂这个站。换热站的工艺流程图其实很固定:左上角是一次侧高温热水入口,经过电动调节阀进入板式换热器,换热器右侧是二次侧供水管,往下回到二次侧回水管,循环泵在回水侧,旁边接一个补水箱和补水泵。照着这个流程画,再放上泵、阀门、管道、仪表图符,就是一张基本合格的换热站画面。
画面里的管道用组态王自带的管线工具来画,需要能根据实时状态变色。比如供水管正常时红色,停泵时变灰。这个功能是通过“管线”的动画连接属性做的:选择管道,关联“线色”动画连接,条件表达式是“循环泵运行==1,颜色红色;循环泵停止==0,颜色灰色”。温度超过上限时,可以用类似的方法让温度显示数字变红闪烁。
仪表图符方面,热搜里有“组态王图库”这个词——组态王自带一个图库管理器,里面有泵、风机、阀门、液位计、压力表等几百个现成的图元,可以直接拖到画面上。这些图元做得挺精致的,比自己画强太多。不过图库里的泵默认是矢量的二维卡通样式,如果想要更工程化的外观,可以自己画一个简单的矩形加圆点,再关联旋转动画。我的经验是,图库里那些带旋转叶片的泵动画(叶片旋转速度随频率变化)特别适合循环泵,因为值班人员看着叶轮转得快慢,能直观判断泵的负载情况。
4.4 报警、趋势曲线和历史报表功能
组态王做换热站的报警显示,属于“便宜又管用”的功能。在画面开发系统里新建一个报警窗口,选择显示哪些报警变量,配置报警优先级和报警声音,运行时就能实时弹出报警记录。报警变量在信息里要设置“报警优先级”,比如温度超限是1级(最重要),液位低是2级,这样值班人员不用看一大堆无关报警。
报警变量关联到PLC侧的报警锁存M或V位,组态王一旦读到1就触发报警。需要注意,组态王报警是以“变量从0变1产生报警,从1变0报警恢复”这种逻辑工作的。所以组态王侧的报警变量应该定义成“I/O离散”类型,直接映射PLC的报警位。PLC里做了人工复位后报警位清零,组态王画面报警能同步自动恢复。
趋势曲线有实时曲线和历史趋势曲线两种。实时曲线比较简单,在画面里拉一个“实时趋势曲线”控件,把二次供回水温度、压力变量加进去就行。历史趋势曲线要提前在“系统配置”里建立历史数据库,设置数据保存路径和保存周期。换热站运行数据建议保存周期设成10秒或30秒,太密的周期会占用大量磁盘空间。一旦出现住户投诉温度不达标,调出历史曲线,能非常清楚地看到当天的供水温度波动过程,回看现场情况就快多了。
历史报表也一样,用组态王的报表系统配置一个日报表模板,记录每天的平均温度、最高最低温度、泵累计运行时长。这一步在换热站竣工验收时特别有用,因为很多甲方要这些数据来评估设备效率和供热质量。直接把内存变量替换成I/O变量,报表系统就能自动生成,不需要额外写程序。
5. 现场联调的经验与踩坑记录
5.1 通讯连不上时的排查链路
做这套系统时,绝大多数问题都出在通讯环节,而不是逻辑本身。把组态王和S7-200通信不上这一问题的排查顺序理一遍:
第一步,先查物理链路。用STEP 7-Micro/WIN软件直接连PLC,看能否上传下载程序。如果能,说明PLC侧和链路正常,问题在组态王配置;如果不能,说明是电缆、驱动或者PLC端口设置的问题。这步能直接砍掉一半的排查方向。
第二步,查PLC的通讯口设置。S7-200的编程口在Micro/WIN系统块里默认是PPI协议,站地址默认2,波特率9600。如果之前被改过,或者被以太网模块占用了端口,组态王就通讯不上。先把PLC的站地址、波特率记下来,组态王那边必须完全一致。
第三步,查组态王的设备驱动。打开组态王“设备”树里的IO设备,看设备是否显示为“活动”状态。如果显示“停止”,右键启动;如果反复掉线,检查PLC地址是否填错(IP或站号),以及通讯超时和重试次数设置是否过短。通讯超时设成1秒是常见的坑,S7-200响应慢的时候,经常刚超时就报设备失败。
第四步,不要一上来就怀疑是通讯问题。也许变量配置错导致数据读取异常,看起来就像通讯断了。跑到组态王的数据词典里手动看一下变量实时值,看看是不是“???”这种无效值。无效值通常说明地址或数据类型不匹配,而通讯状态是正常的。
5.2 模拟量数值跳动与地环路的处理
现场调试时最让人头疼的就是温度压力数值来回跳。用万用表量变送器输出信号,稳定在12mA,但组态王上显示的是11.8到12.3之间晃。这种问题大多是信号参考地电位不一致造成的。
我排查的顺序是:先看变送器供电是不是和PLC共用一个24V电源,电源负极是否接到了PLC模块的M端。如果各变送器供电源倒是同一个,但电源负极没有和PLC内部参考地连接,那模拟量模块的M和变送器负极之间就存在电位差,读数自然会漂。
另外,模拟量信号线和动力线千万不要在同一个线槽里长距离并行走线。我记得有个项目,二次压力变送器的信号线和一台7.5kW循环泵的变频器输出线在一根桥架里叠着走了将近两米,压力数值每秒跳0.1MPa。后来把信号线单独穿了金属软管、屏蔽层单端接柜壳,数值才稳定下来。经验是模拟量电缆和设备动力电缆保持至少30厘米的距离,穿线走向必须交叉而不是平行。
实在不行要给信号加隔离器的话,最好在每一路模拟量输入前加一只信号隔离器。几年前隔离器还要挑品牌,现在国产的就够用了,把电源、信号、地完全隔开,锅炉房里那些变频器谐波干扰基本都能压住。
5.3 阀门动作异常的排查思路
电动调节阀的故障,十次有九次是反馈和接线的问题,真正阀体卡死的反而少。现象就是组态王上给50%开度,阀门反馈显示只有20%,或者阀门永远在5%喂和95%之间慢慢爬。
先查AO的输出回路,用钳表量模块的AO端子输出电流,是不是4-20mA范围、和给定值是否对应。如果输出正常但阀门反馈不对,再量阀门的反馈电位器或霍尔传感器。70%的故障出在反馈信号和模块输入的接线或量程不匹配上——比如反馈是0-10V的,但模块输入配的是4-20mA,信号类型都不一样,反馈值肯定不对。
阀门的PID调节还有一个容易忽略的问题:组态王画面设置的目标温度、和PLC内部的设定温度,两个变量是否处于同一个数据源。我有一次调了一个多小时发现温度一直偏低,最后打开PLC在线监视发现PID给定是48℃,而组态王画面上显示的设定是55℃——原来组态王里那个“设定温度”框连接的变量和PLC程序里的给定值根本不是同一个地址。这种低级问题,写程序的时候一定要统一变量清单,所有画面变量和PLC变量一张表对清楚。
5.4 总结一个调试步骤模板
其实每次做换热站项目,我收尾前都会按固定顺序跑一遍调试清单:
- 空点测试:所有DI信号逐一点亮,AI信号逐个加标准信号,确认采集通道正确
- 单设备测试:手动模式下单独启停每台泵、开关每个阀,确认输出传动正常
- 联锁测试:模拟泵故障,确认备用泵能自投;模拟温度超限,确认调节阀动作方向正确
- 自动闭环测试:切自动模式,给定一个目标温度,看温度曲线是否稳定,微调PID
- 通讯持久测试:组态王挂在现场连续跑24小时,看是否有通讯掉线、报警误报
- 断电恢复测试:切掉PLC电源,再上电,确认程序能正常启动、参数不丢、泵不会突然自启
这六步走完,基本可以放心把站交给甲方。我个人的体会是,一般最容易出问题的就是“顺序不对”——很多人先联调逻辑再测试接口,结果接口有问题时,逻辑怎么调都显得是错的,越找越糊涂。先从物理通道和单设备层面压一遍,再做整套逻辑,出问题时能快速定位是采集层给的信号就有问题,还是运算层逻辑的问题——这样调试效率会高一个数量级。