简介:这份资源是一套自编的空调压缩机PLC控制程序及配套上位机软件,面向工业自动化、PLC编程与C++桌面开发的初中级学习者。包内共58个文件,以h头文件、cpp源文件、obj编译中间文件为主,另含pdb调试符号、ico图标、rc资源脚本及exe可执行文件等,压缩包约2.64MB,覆盖PLC逻辑控制、上位机通信、数据采集与界面显示等模块。程序通过VC++开发上位机,读取PLC输入信号并分析压缩机运行状态,判断参数是否正常,涉及串行通信协议实现与数据解析处理。已有745人学习下载,读者可从中获取PLC程序结构、上位机与PLC通信的代码实现、数据管理与测试思路,以及完整的工程目录组织方式,适合作为工业控制系统与软件工程结合的参考实例。
1. 从一台“不听话”的压缩机说起:这套PLC程序到底能干什么
车间里那台老螺杆压缩机又跳停了,操作工跑过来喊“高压报警”,电工查了半天接触器也没毛病。这种场景在工控现场太常见了——机械和电气都正常,问题出在控制逻辑的时序和联锁上。这套自己编写的压缩机PLC程序,就是冲着这类“玄学故障”去的。它用梯形图实现了完整的加卸载控制、多机联锁轮换、温度压力保护以及故障自诊断,适合两类人:一是手头有压缩机设备、想替换掉老旧继电器柜的现场工程师;二是正在学PLC、需要一个真实工业对象练手的开发者。程序不依赖特定品牌,逻辑层可以直接移植到主流平台。
2. 程序架构拆解:从IO分配到主状态机的完整链路
2.1 硬件配置与IO地址规划
拿到一个PLC项目,我习惯先把IO表拉出来,而不是急着写逻辑。这套程序按一台典型喷油螺杆压缩机配置:数字量输入12点、数字量输出8点、模拟量输入4路、模拟量输出1路。下面这张表是核心IO分配,实际移植时按你的硬件地址改符号名就行。
| 地址 | 符号名 | 功能 | 类型 |
|---|---|---|---|
| I0.0 | Start_Btn | 启动按钮 | DI |
| I0.1 | Stop_Btn | 停止按钮 | DI |
| I0.2 | Emergency_Stop | 急停(常闭) | DI |
| I0.3 | Overload_Fault | 热继电器故障 | DI |
| I0.4 | Phase_Fault | 相序保护 | DI |
| I0.5 | Pressure_High | 高压开关 | DI |
| I0.6 | Pressure_Low | 低压开关 | DI |
| I0.7 | Temp_High | 排气温度高 | DI |
| I1.0 | Fan_Overload | 风扇过载 | DI |
| I1.1 | Remote_Local | 远程/就地 | DI |
| I1.2 | Oil_Level_Low | 油位低 | DI |
| I1.3 | Spare_DI | 备用 | DI |
| Q0.0 | Main_Contactor | 主接触器 | DO |
| Q0.1 | Star_Contactor | 星接触器 | DO |
| Q0.2 | Delta_Contactor | 角接触器 | DO |
| Q0.3 | Load_Valve | 加载电磁阀 | DO |
| Q0.4 | Unload_Valve | 卸载电磁阀 | DO |
| Q0.5 | Fan_Contactor | 风扇接触器 | DO |
| Q0.6 | Alarm_Lamp | 故障指示灯 | DO |
| Q0.7 | Run_Lamp | 运行指示灯 | DO |
| AIW0 | Pressure_AI | 排气压力4-20mA | AI |
| AIW2 | Temp_AI | 排气温度PT100 | AI |
| AIW4 | Current_AI | 主电机电流 | AI |
| AIW6 | Spare_AI | 备用 | AI |
| AQW0 | Load_Output | 加载比例阀输出 | AO |
注意:急停和热继电器必须接常闭点,程序里用常开触点取反,这样断线也能触发停机,这是血泪经验。
2.2 主状态机设计:停机、启动、加载、卸载、故障五个状态
压缩机控制的核心不是单个逻辑块,而是状态迁移。我用一个字节MW10做状态字,定义五个状态:0=停机、10=启动延时、20=加载运行、30=卸载运行、40=故障锁定。主程序每个扫描周期只做三件事:读状态、判断迁移条件、执行对应输出。这种写法比一堆置位复位指令清晰得多,后期改逻辑不用满程序找线圈。
// 状态迁移伪代码(梯形图逻辑用SCL描述) CASE #State OF 0: // 停机 IF #Start_Btn AND NOT #Fault_Any THEN #State := 10; #Start_Timer(IN:=TRUE, PT:=T#5S); END_IF; 10: // 启动延时(星三角转换) IF #Start_Timer.Q THEN #State := 20; END_IF; IF #Fault_Any THEN #State := 40; END_IF; 20: // 加载运行 IF #Pressure_High THEN #State := 30; END_IF; IF #Stop_Btn OR #Fault_Any THEN #State := 0; END_IF; 30: // 卸载运行 IF #Pressure_Low THEN #State := 20; END_IF; IF #Stop_Btn OR #Fault_Any THEN #State := 0; END_IF; 40: // 故障锁定 IF #Reset_Btn AND NOT #Fault_Any THEN #State := 0; END_IF; END_CASE;这段状态机的关键参数是启动延时T#5S,对应星三角转换时间,实际按电机功率调整,一般7.5kW以下3秒,30kW以上8到10秒。压力高低的判断用模拟量比较,而不是压力开关,这样能设置回差,避免在阈值附近频繁加卸载。故障锁定状态必须手动复位,这是强制安全要求,不能自动恢复。
2.3 模拟量处理:压力与温度的标定和滤波
模拟量读进来是0到27648的整数,直接比较会跳变。我一般做两步:先线性变换成工程量,再滑动平均滤波。压力传感器4-20mA对应0到1.6MPa,温度PT100对应0到150度。下面这段SCL是压力处理的标准写法。
// 压力标定与滤波 #Raw_Pressure := WORD_TO_INT(#AIW0); // 线性变换:4mA对应0,20mA对应27648 #Pressure_MPa := INT_TO_REAL(#Raw_Pressure - 5530) * 1.6 / 22118.0; // 限幅 IF #Pressure_MPa < 0.0 THEN #Pressure_MPa := 0.0; ELSIF #Pressure_MPa > 1.6 THEN #Pressure_MPa := 1.6; END_IF; // 一阶滤波,系数0.2 #Pressure_Filtered := #Pressure_Filtered * 0.8 + #Pressure_MPa * 0.2;5530是4mA对应的原始值,22118是20mA与4mA的差值,这两个数按你的模块精度微调。滤波系数0.2意味着新值占两成,响应稍慢但显示稳定,如果用于联锁保护,滤波后的值还要加一个快速通道,直接用原始值判断超限,避免滤波延迟导致保护滞后。
2.4 多机联锁与轮换逻辑
如果现场是多台压缩机并联,程序里要加轮换和联锁。轮换逻辑用一个运行时间累加器,每台机运行一小时加一,启动时选运行时间最短的那台。联锁逻辑是:任意一台故障,备用机自动投入;总管压力低于下限,按顺序启动。这部分我用一个数组和循环实现,避免写重复代码。
// 多机轮换选择(伪代码) FOR #i := 0 TO 3 DO IF #Comp_Run_Time[#i] < #Min_Time AND #Comp_Ready[#i] THEN #Min_Time := #Comp_Run_Time[#i]; #Selected_Comp := #i; END_IF; END_FOR; // 启动选中机组 #Comp_Start[#Selected_Comp] := TRUE;运行时间数组每台机一个元素,单位是小时,用定时器累加。轮换周期一般设24小时或一周,按保养要求定。联锁的优先级要明确:急停最高,故障次之,压力再次,最后才是轮换。优先级用状态机里的判断顺序保证,先判急停再判其他。
3. 从零跑起来:编程环境搭建与程序下载调试
3.1 平台选择与工程创建
这套逻辑不绑定品牌,我用过几个主流平台移植。如果你手头是西门子S7-1200,用TIA Portal建一个FC块,把状态机写成SCL,IO用PLC变量表定义。如果是三菱FX系列,用GX Works2,状态机用SFC或者步进梯形图。国产台达、汇川也类似,指令名不同但逻辑一样。新建工程时注意:扫描周期设10ms,压缩机控制不需要太快,太快反而容易受干扰误动作。
3.2 下载与在线监控
下载程序前先确认PLC在STOP模式,下载后切RUN。在线监控时重点看三个变量:状态字MW10、压力滤波值、故障字。调试时我习惯先强制IO,模拟启动按钮和压力信号,看状态迁移对不对。比如强制I0.0为1,状态应该从0跳到10,5秒后跳到20,加载阀Q0.3输出。如果状态卡在10不动,检查启动定时器是不是没使能,或者故障字里有位没复位。
# 以西门子TIA为例的下载步骤(命令行方式仅作示意) # 实际用图形界面操作 # 1. 编译项目 # 2. 选择PLC -> 下载到设备 # 3. 切换RUN模式 # 4. 打开监控表,添加MW10、MD20等变量提示:第一次下载前把程序备份一份,现场调试改乱了能快速恢复,这是后悔药。
3.3 空载测试与带载调试
空载测试不接主电机,只给控制回路送电,按启动按钮看接触器动作顺序:主接触器先吸合,星接触器吸合,5秒后星断开角吸合,然后加载阀打开。这个顺序错了会短路,必须用万用表确认。带载调试先手动加载,观察压力上升速率,如果压力到设定值还不卸载,检查压力传感器标定和比较指令。温度保护测试用热风枪吹PT100,看是否在设定值停机。
4. 避坑与排查:现场调试最容易翻车的五个点
4.1 星三角转换时间太短导致跳闸
现象:启动时主接触器吸合后几秒就跳闸,热继电器动作。原因:星三角转换时间设太短,电机还没降速就切角运行,冲击电流大。解决:把启动延时从3秒加到6到8秒,按电机功率调整,同时确认星接触器和角接触器有机械互锁,程序里也要加软件互锁,两个输出不能同时为1。
4.2 压力传感器标定偏差导致频繁加卸载
现象:压力显示和机械表差0.2MPa,压缩机在设定值附近反复加载卸载。原因:模拟量线性变换的偏移量没按实际模块校准,或者传感器本身有零点漂移。解决:用标准压力源校准,先调零点再调满度,程序里加回差,比如加载压力0.6MPa,卸载压力0.8MPa,中间0.2MPa的死区。
4.3 急停复位后自动重启
现象:拍下急停再复位,压缩机自己启动了。原因:启动按钮用了自锁或者状态机在故障恢复后直接回到运行状态。解决:故障锁定状态必须手动按启动按钮才能退出,急停复位只清除故障字,不改变状态字。程序里急停用常闭点,断线也停机。
4.4 模拟量滤波导致保护滞后
现象:排气温度已经超限,但程序里滤波后的值还没到,停机晚了,机头已经冒烟。原因:一阶滤波系数太小,响应慢。解决:保护判断用原始值,显示用滤波值,两路并行。原始值加一个突变判断,比如一个扫描周期内变化超过10度直接触发保护。
4.5 多机轮换时通信中断
现象:两台机并联,一台通信断了,另一台还在等它信号,结果都不启动。原因:轮换逻辑依赖通信数据,没有超时处理。解决:通信加心跳检测,超时3秒认为对方离线,自动跳过。轮换数组里把离线机组标记为不可用,不参与选择。
5. 二次开发:把程序改成你需要的模样
这套程序最值钱的地方不是代码本身,而是状态机的框架。你要改功能,基本不用动主结构,只改对应状态的迁移条件和输出。比如加一个远程启停,就在状态0和状态20里加Remote_Local的判断;要加变频控制,把加载阀输出改成模拟量输出,状态20里根据压力偏差做PID。我一般会留一个备用状态字和几个备用定时器,现场临时加逻辑不用重新下载整个程序。
移植到不同品牌时,注意几个差异点:西门子的定时器是背景数据块,三菱的是线圈加寄存器,欧姆龙又是另一种。我的做法是把定时器封装成一个功能块,输入使能和设定值,输出Q和当前值,这样换平台只改功能块内部。模拟量标定也封装成FC,输入原始值、量程上下限,输出工程量,所有通道调用同一个块。
验证改造是否成功,我习惯用三个测试用例:正常启停、故障停机、压力循环。正常启停看状态迁移和时间;故障停机模拟每个故障点,看是否都能锁死;压力循环用信号发生器给模拟量,看加卸载回差和响应时间。这三个过了,基本就能上现场。
从那以后我每次改完程序,都强制走一遍空载测试再带载,不管多急。希望帮到你。
本文还有配套的精品资源,点击获取