简介:一份基于三菱PLC的中央空调控制源程序示例,面向刚接触可编程逻辑控制器编程的初学者,用于学习中央空调系统的温度控制、风速调节和湿度管理等环控逻辑。程序通过采集传感器数据、执行预设逻辑、控制冷却塔或阀门等设备,演示了从梯形图编程到设备联动的基本方法。压缩包仅约9KB,共3个文件,以两个htm说明文档和一个txt文本为主;htm文件通常用于讲解程序结构与控制流程,txt文件则是readme使用说明,便于初学者按步骤阅读和运行。目前已有1009人学习下载这一轻量入门资源。借助这份源程序,学习者可了解三菱PLC的指令写法、逻辑设计思路和基本调试方法,并利用配套文档理解程序模块之间的关系,包含从输入采集到输出驱动的完整链路,适合作为自动化控制入门阶段的小型练手案例。
1. 拿到plc中央空调源程序后,第一件事不是打开程序,而是核对工艺
很多从业者拿到一份plc中央空调源程序时会松一口气,以为打开工程软件、改几个温度设定值、点一下下装就能收工。我见过不少翻车现场:冷冻水泵的启停联锁没写进冷水机组需求信号里,冷机报警跳停了水泵还在转;压差旁通阀PID参数照搬旧项目,新系统管阻不一样,阀门在0到100之间来回跑。中央空调源程序不是通用软件,它是跟具体工艺流程绑定的工程产物,值钱的不是那几段程序文本,而是背后的工艺控制骨架——冷水机组群控、水系统联锁、传感器量程、手自动切换规则。接下来的内容只围绕一个目标:拿到源程序之后,怎么把它变成你能安全改、敢下装、能调试的东西,以及哪些地方最容易让你翻车。
2. 中央空调源程序在管什么:从冷冻站工艺到程序骨架
先统一一个认知:源程序的“长相”完全由冷冻站工艺决定。你拿到一份程序,程序里的功能块划分、输入输出点分配、启停顺序,本质上是在复述一套水系统工艺流程——几台冷机、一次泵还是二次泵、有没有板换、冷却塔是几台风机联动、末端有没有电动阀连锁。所以读程序的第一步不是看代码,而是把工艺图和设备清单摆在旁边。
2.1 先把控制对象和IO点分成四组:水侧、冷机侧、冷却侧、末端
我习惯把中央空调源程序里的控制对象先按系统侧分组,因为大多数PLC程序的功能块也就是照这个思路建的。第一组是冷冻水侧:冷冻水泵(一用一备或者多泵并联)、压差旁通阀、冷冻水供回水温度、压差传感器、水流开关、各支管电动阀。第二组是冷机侧:冷机的启停命令、运行反馈、故障信号,有些项目用干接点,有些项目用通讯报文直接读写冷机群控面板。第三组是冷却水侧:冷却水泵、冷却塔风机(风机的启停、多级调速)、冷却水供回水温度。第四组是末端侧:新风机组、组合式空调箱、风机盘管,末端设备在中小型项目里往往也写进同一套PLC源程序。
为了快速确认一份源程序覆盖了什么,拿到程序后先找IO映射表或者变量符号表,按下面这个表归类:
| 系统侧 | 典型数字量点 | 典型模拟量点 |
|---|---|---|
| 冷冻水侧 | 水泵手自动/运行反馈/故障、水流开关、阀门开关限位 | 供回水温度、供回水压差、冷冻水流量 |
| 冷机侧 | 冷机运行状态、故障、远程/本地模式 | 冷机负载率、电流、蒸发器/冷凝器温度 |
| 冷却水侧 | 冷却泵启停状态、冷却塔风机手自动 | 冷却水供回水温度、室外湿球温度 |
| 末端侧 | 新风机组风机状态、滤网压差报警、防冻开关 | 送风温度、回风温度、CO2浓度 |
把这份对应表列出来之后,你就能判断手上这份源程序是“只含冷源系统”还是“冷源加末端一体”。很多改造项目翻车,就是拿了一份只控冷源的程序,却以为它可以顺带管理末端新风机组,结果IO点根本对不上。
2.2 程序执行骨架:采集、转换、手自动、联锁、报警五段式
打开源程序的主动能块,多数中央空调程序的执行顺序都有固定的五段式。第一段是模拟量采集与工程量转换:把变送器送来的4-20mA或0-10V信号换算成实际的温度、压力、压差值,通常换算系数会放在一个专门的全局数据块里。第二段是手自动切换:手动模式下,程序会跳过自动启动条件,直接执行面板按钮或HMI下发的命令;自动模式下,启停完全听从联锁逻辑和时间表。第三段是设备顺序逻辑:冷却水泵、冷却塔风机、冷机、冷冻水泵之间按什么顺序启停,这是中央空调程序最核心的部分。第四段是群控与调节:冷水机组加减机判断、水泵变频PID运算、压差旁通阀控制。第五段是报警与汇总:把故障、超限、通讯超时统一置位,让上位机或触摸屏去显示。
这个顺序不是随意的,它直接影响你排查问题的方式。常见的问题是模拟量转换段如果放在了启停逻辑之后,那么在一个扫描周期里,联锁逻辑用的还是上一次的旧数值,调试时画面上的温度已经变了,设备却没有跟随动作。所以拿到源程序,先看主动能块里模拟量处理在什么位置。
2.3 冷机群控段:判断一套源程序自动化水平的“分水岭”
冷机群控逻辑是一份中央空调源程序里含金量最高的段落。它一般实现这么几件事:根据冷冻水回水温度或者系统负荷需求,决定当前运行几台冷机;加机时要同时满足“温度偏高、负荷偏大、延迟时间到”三个条件,减机时要满足“温度偏低、低负荷持续一段时间、冷机最小运行时间已到”。程序里还会有开机顺序轮换,让几台冷机的累计运行时间尽量平均,部分项目还会把每台冷机的小时数写到HMI页面上。
如何快速定位群控段?找几个特征变量:延时计时器、当前运行台数、加机请求、减机请求、累计运行时间。在符号表里搜索到这些名字,就找到了群控程序所在的功能块。
这里有一个判断标准:如果一套源程序里只有对单台冷机的启停控制,没有台数累加、没有延时判断、没有最小运行时间锁,那它只能算“单机联动程序”,不能算“群控程序”。改造旧系统时,我一般会先把这个问题判断清楚——很多业主以为源程序里有群控,实际运行了两年发现冷机就在那儿手动开着,程序从来没自动加过机。
3. 读源程序的正确顺序:先建点位表,再追联锁链路
读一套中央空调源程序,最怕的是拿到手就打开梯形图一段一段往前翻。程序动辄几百个网络段,翻到后面基本是黑匣子。我常用的顺序是先做三张表,把程序对应的现实世界“钉”住,再回头看逻辑,效率高很多。
3.1 读程序前先建三张表:点位对应表、设备清单、版本差异表
第一张表是点位对应表。把程序里的符号表或者变量表导出,对照竣工图纸上的IO清册逐点核对,确认每个输入信号对应的是哪台设备、哪个传感器、在哪个卡件的第几个通道。这一步如果漏了,后面所有逻辑分析都是空中楼阁。第二张表是设备清单。程序里出现的设备与现场实物逐项比对,特别注意旧程序里可能有“预留第三台冷机”“预留第二组冷却塔”的逻辑,现场根本没有这些设备,这些预留逻辑要在后续分析时直接跳过。第三张表是版本差异表。看源程序的生成时间和图纸的施工时间是否对得上,中间如果经历过几轮改造,程序文件里往往残留着旧设备的寻址,这些就是日后动作异常的定时炸弹。
三张表建好之后,你手里就有了一个“程序世界与现实世界”的坐标轴。后面改任何一个点,都能先问一句:这个点在哪个设备、哪个通道、哪个页面上。读程序最忌讳的就是在符号表里看到一个叫M120.3的位,却不知道它在现实世界里拧的是哪台冷却塔的风机。
3.2 用结构化文本读懂压差旁通阀功能块:一个可以照着练的实例
不同平台的源程序语言不一样,有些是梯形图,有些是结构化文本,但功能块风格大多类似。这里用一段压差旁通阀控制逻辑做示范。它的功能是:当冷冻水供回水压差高于设定值时,关小旁通阀;低于设定值时,开大旁通阀,把多余的水量从旁通管泄回。这是中央空调源程序里最常见、也最适合用来练手的段落。
FUNCTION_BLOCK FB_PressureBypass VAR_INPUT rDpSet : REAL; // 压差设定值,kPa rDpReal : REAL; // 压差实测值,kPa rKp : REAL; // 比例增益 rKi : REAL; // 积分增益 rTs : REAL; // 控制周期,秒 xEnable : BOOL; // 自动模式使能 END_VAR VAR_OUTPUT rValveOpen : REAL; // 旁通阀开度,0.0~100.0 END_VAR VAR rErr : REAL; rIntSum : REAL; END_VAR IF NOT xEnable THEN rValveOpen := 0.0; rIntSum := 0.0; ELSE rErr := rDpSet - rDpReal; rIntSum := rIntSum + rKi * rErr * rTs; rValveOpen := rKp * rErr + rIntSum; rValveOpen := LIMIT(0.0, rValveOpen, 100.0); END_IF这不是某份真实源程序的原文,而是按常见逻辑重述的等效读法,但结构上与工程现场的程序一致。读这一段时,先看输入输出接口:输入是压差设定和压差实测,输出是阀门开度,功能一目了然。再看使能条件:xEnable是自动模式,手动模式下直接把阀门关了,这是一个防呆设计。最后看算法:比例项让阀门跟随误差变化,积分项消除静态偏差,输出限幅在0到100之间。
这里有一个很多现场程序的隐藏坑:积分项rIntSum没有做抗积分饱和处理。当阀门开到100%时,如果压差仍然低于设定值,积分项会继续累积,等到压差恢复后阀门要很久才能关下来,现场表现就是压差一直过冲。调试时如果遇到旁通阀“只开不关”,优先检查积分项有没有同样的问题。
3.3 追一个水泵启动条件:串联触点与并联分支怎么读
在梯形图程序里读水泵启停逻辑,我一般从输出线圈往回逐个网络段看。比如“1号冷冻水泵自动启动”这个线圈,它前面的网络段通常是一个多条件表达式,转化为逻辑式大概是下面这个样子:
Pump1_AutoCmd := (xTimeZoneOn OR xRemoteStart) AND NOT xPump1Fault AND xFlowSwitchOK AND xNoFreezeAlarm AND (xPump1Running OR xMinIntervalDone);翻译成人话就是:时间表到点或者远程开机命令来了,且水泵没有故障,且水流开关正常,且没有防冻报警,且要么水泵已经在运行、要么距离上次停机已经过了最小间隔时间。其中最后一条就是防频繁启停的最小运行时间锁,在中央空调程序里几乎每台水泵都有,调试时不要因为它影响你手动启停就直接把它短接掉。
读这种逻辑的时候要注意梯形图里“串联是AND、并联是OR”的对应关系。从输出线圈往回追,先找直接连到线圈的那一条母线路径,路径上的每个常开触点是必要条件,每个常闭触点则是禁止条件。如果发现设备启动后立即被停掉,多半是某条并联分支上的自锁触点没有形成保持回路,或者常闭反馈点被强制了。这种强制点排查最快的方法是把整个程序交叉引用表导出来,看哪个位被强制写值。
4. 改源程序时真正要动的东西:群控温差、变频下限与PID整定
把源程序从旧项目搬到新项目,或者在同一套系统上做节能改造,最常改的不是逻辑结构,而是参数。中央空调源程序的可调参数集中在三个地方:冷水机组群控参数、水泵变频参数、手自动和时间表规则。这三处调对了,系统才能真正稳定运行。
4.1 冷水机组群控参数:加减机的门槛与延时
群控参数决定了一台冷机什么时候加进来、什么时候退出去。参数太多会让系统反应迟钝,太少又会让冷机频繁启停。下面是典型的群控参数表,实际值要根据冷机台数和水系统设计工况确定:
| 参数项 | 常见做法 | 注意点 |
|---|---|---|
| 加机回水温度阈值 | 设计回水温度+1~1.5℃ | 温度传感器装在回水干管,位置很关键 |
| 加机延时 | 10~20分钟 | 延时太短会反复加机 |
| 减机回水温度阈值 | 设计回水温度-1~2℃ | 需要与负载率联合判断 |
| 减机延时 | 15~30分钟 | 必须大于冷机最小运行时间 |
| 冷机最小运行时间 | 30~60分钟 | 防止短循环,影响压缩机寿命 |
| 启停间隔时间 | 15~30分钟 | 与冷机型号有关 |
调试时我有一个习惯:先把所有延时参数翻倍,让系统稳定跑一个完整负荷周期,再逐步缩短延时,找到临界值。加机逻辑如果只有回水温度一个条件,很容易出现“白天加了机、负荷一降又马上减机、傍晚再加回来”的三次折腾,遇到这种现场,先看减机延时和最小运行时间,通常问题出在这两个参数被设成了0。
4.2 水泵变频:压差PID与温差PID的选择及整定顺序
变频水泵的PID控制在源程序里有两种常见类型:一种是恒压差控制,以供回水压差为被调量;一种是温差控制,以冷冻水供回水温差为被调量。恒压差响应快,适合末端支路压差波动频繁的场合;温差控制节能潜力大,但系统滞后明显,参数难调。程序里调用的PID功能块,等效写法长这样:
// 二次泵变频压差控制:PID功能块调用等效示意 fbPumpPID( Run := xDpAutoMode, // 自动模式使能 SetPoint := rDpSetpoint, // 压差设定值,kPa Input := rDpFiltered, // 经滤波的压差实测值 Gain := rKpValue, // 比例增益 Ti := rTiValue, // 积分时间,默认300秒 Td := 0.0, // 微分时间,一般关闭 Cycle := tCtrlCycle, // 控制周期,常取1秒 Output => rFreqRaw // 原始频率输出 ); rFreqCmd := LIMIT(rFreqMin, rFreqRaw, rFreqMax);参数说明里最值得说的是整定顺序。先确认压差传感器量程在程序里转换正确,然后手动给定变频器一个固定频率,让水系统运行半小时,观察管网是否稳定。接着切到自动,把积分时间调到最大、比例增益调到一个小值,让阀门只做粗略跟随,不振荡。之后每调一次参数,让系统跑15分钟再观察曲线。微分项在中央空调水系统里基本不用,水流系统滞后大,微分会把泵频率逼到极限值,现场表现就是“频率来回甩”。
变频下限rFreqMin一般不能低于水泵允许的最低运行频率,多数水泵不低于30Hz。这个下限不仅写在PID限幅里,还要确认变频器内部参数也设了同样的值,否则程序限幅30Hz,变频器自己还允许8Hz运行,联调的时候水泵会出现低频喘振。
4.3 手自动切换与时间表:看着简单,改错最容易
手自动逻辑是所有中央空调源程序里最“绕”的段落。手动模式不是简单的“跳过自动给命令”,它要同时屏蔽:自动启动指令、联锁停机指令、PID输出信号。很多程序里的手自动切换是一个专用的切换功能块,里面有一个输出选择器,把所有自动通道的输出全部切到“手动模式下使用面板按钮值”。
时间表逻辑则包含工作日/周末表、节假日表、临时日程表。改时间表时要注意“跨天时段”的处理,比如晚上22点停机、早上6点开机,夜里有一个“运行状态保持”的判断,以免凌晨温度下降触发防冻。我见过一个项目,程序里时间表正确,但节假日表是空的,法定长假期间空调机组全部按工作日运行,白白转了一整周。拿到源程序后,先翻开时间表数据块,看看默认值有没有被清空过。
5. 源程序改造中的5个高频翻车点:从现象到解决
改完源程序之后的下装调试,是翻车最集中的阶段。下面这5类问题,基本覆盖了中央空调源程序改造中的绝大多数实际故障,每一条我都按现象、原因、解决来写。
5.1 点位错位、量程不对、通讯超时:先查这三处
现象一:下装后所有阀门乱动,水泵启动后几秒钟就跳停。原因:程序里的IO映射和现场实际接线错位,最常见的错位发生在数字量输出模块上,程序认为它在开一号冷却塔风机,实际开的可能是二号。解决:不要急看逻辑,先把每个DO点手动置位一次,派一个人到现场看对应设备有没有动作,按实际动作结果修正IO映射。
现象二:水温度显示值比实际高出一大截,或者到满量程。原因:模拟量工程量转换系数不对,变送器量程是4-20mA对应0-100℃,程序里却按0-50℃来换算。解决:在程序里找到模拟量转换功能块,核对量程上限和变送器标签上的量程,改完之后送一个标准信号源验证一遍。
现象三:冷机通讯数据全部为0,群控加不了机。原因:通讯参数不对,或者冷机群控面板地址与PLC侧的从站地址不匹配。解决:先查通讯握手状态字,再核对波特率、数据位、从站地址和报文类型。中央空调源程序里的冷机通讯段经常是整个程序里最脆弱的一段,因为冷机品牌一变,报文格式就全变,程序改起来要对着通讯协议手册逐字核对。
5.2 启停振荡、PID发疯、冬季防冻失效:逻辑层问题
现象四:冷冻水泵频繁启停,运行5分钟停20分钟,反复循环。原因:程序里的最小运行时间锁没有生效,或者被调试时人为短接掉了。还有一种可能是水流开关安装位置离水泵太近,启泵瞬间水流冲击导致开关抖动,把运行反馈断了一下,程序就认为是故障停机了。解决:先查最小运行时间参数是否为0,再查水流开关延时确认时间。现场如果水流开关信号抖动,在程序里对反馈信号加一个2~3秒的接通延时滤波。
现象五:冬季夜间防冻报警误报,或者防冻逻辑完全不动作。原因:时间表程序启用了节假日表,但表内数据为空白;或者防冻温度传感器量程设置错误,本来应该测回风温度,结果接到了室外温度上。解决:把时间表数据全部填充完整,包括工作日、周末、节假日三个表;逐点核对防冻传感器地址。防冻逻辑看着简单,却是中央空调源程序里最不能删的段落,因为冬季管道冻裂的代价远远高于改造一个控制逻辑的代价。
6. 用离线仿真验证改完的源程序:最小测试清单与习惯
改完源程序先别急着下装到现场PLC,先在自己的工程软件里跑一遍离线仿真,能拦住一半以上的低级错误。我常用的验证方式是按“设备单体、联锁关系、群控逻辑”三层递进测试,每一层都有固定的检查点。
6.1 建立仿真环境的最小操作流程
先建一个仿真实例,导入修改后的工程,编译通过后进入在线仿真模式。第一步做IO强制备用:把所有数字量输入、模拟量输入强制成正常工况值,比如供回水温度设置为设计值、压差传感器给一个合理数值。第二步测试手动模式:逐个置位手动按钮,观察对应输出有没有动作,这一步主要是验证IO映射没有改偏。第三步测试自动模式:把模式开关切到自动,观察设备启停顺序和延时时间是否遵循程序逻辑,比如冷却水泵启动后延时10秒再启动冷却塔风机。
6.2 一个仿真用临时测试块的写法
对于群控逻辑,我习惯加一个临时测试功能块,用计时器代替现场实况,验证加机减机的时序是否正常。示意代码如下:
// 仿真测试块:模拟回水温度上升触发加机 VAR rTestTemp : REAL := 12.0; tTestTimer : TIME; xTrigger : BOOL; END_VAR IF xTrigger THEN rTestTemp := rTestTemp + 0.5; // 每个扫描周期升高0.5℃ tTestTimer := tTestTimer + T#1S; // 模拟时间累计 IF rTestTemp > 13.5 THEN // 超过加机阈值 xAddMachineReq := TRUE; // 置位加机请求 END_IF; END_IF;这个块的作用是让群控逻辑在几分钟之内走完现场需要几小时才会出现的工况变化,方便观察加机请求是否在延时结束后正确触发。验证完成后把测试块从工程中删除,不要留在源程序里,否则现场运行时这个块会产生虚假的加机信号。
这么多年下来,我改别人留下的源程序,最大的习惯就是“下装前跑一轮仿真,下装后盯一个小时趋势”。注释可以骗人,图纸可能过时,只有你刚验证过的当前值不会骗人。希望帮到你。
本文还有配套的精品资源,点击获取