基于西门子PLC的空压机组储气风冷机组自动控制系统:“手动自动切换与多机组控制,实时监测与报警...
基于西门子plc的空压机组储气风冷机组自动控制系统 可以实现手动自动切换 三组空压机分别自动控制,自动检测三路压力 风冷机运行实时检测 报警查寻,参数设置等
上周刚把车间那套跑了快十年的空压机组控制系统给换了,用的是西门子S7-1200,总算不用每天定点蹲在控制柜跟前掐表启停空压机了——老系统全是硬接线按钮,压力低了就得手动开,压力高了忘关还能把储气罐顶炸,想想都后怕。今天就唠唠这个基于西门子PLC的空压机组+风冷机自动控制系统的实活细节,中间插点写代码的时候的碎碎念。

基于西门子plc的空压机组储气风冷机组自动控制系统 可以实现手动自动切换 三组空压机分别自动控制,自动检测三路压力 风冷机运行实时检测 报警查寻,参数设置等
首先说需求,甲方(其实就是车间主任)要求的东西不多,但都是刚需:
- 得有手动自动切换,手动的时候跟老系统一样用按钮启停,自动的时候完全不用管
- 三路储气罐分别自动控制,每一路都能自己根据压力启停空压机
- 得实时测三路压力,不能瞎猜罐子里有多少气
- 风冷机得跟着空压机走,还得监控有没有过载
- 得能查报警记录,哪天空压机罢工了能翻出来看看为啥
- 压力上下限这种参数得能改,不能硬焊在程序里
先搭个硬件架子
选了S7-1214C DC/DC/DC,自带14点DI和10点DO,够用来接三个空压机的启停按钮、状态反馈,再加个风冷机的控制。模拟量测压力用了SM1231 AI4*13bit,四路输入刚好测三个储气罐的压力加个备用的。触摸屏用了KTP700,不贵还能组态参数界面和报警弹窗,比买个文本显示器强多了。
核心控制代码,从梯形图转到SCL才是真香
一开始我习惯性用梯形图,写着写着发现三个空压机的压力判断逻辑几乎一模一样,光复制粘贴网络就占了半屏,后来改成SCL简直打开新世界大门,代码写起来又快又好改。先放一段核心的自动控制逻辑:
// 全局保持性DB块,上电不丢参数
VAR_GLOBAL RETAIN
// 三路储气罐压力,量程0~1MPa对应模拟量0~10V
Press1: REAL;
Press2: REAL;
Press3: REAL;
// 压力设定参数,车间平时用0.4~0.8MPa
Set_Low: REAL := 0.4;
Set_High: REAL := 0.8;
// 最多同时运行的空压机台数,防止电网过载
Max_Run: INT := 2;
// 空压机运行状态反馈
Comp1_Run: BOOL;
Comp2_Run: BOOL;
Comp3_Run: BOOL;
// 自动模式使能
Auto_Enable: BOOL;
END_VAR
// 自动控制主逻辑
IF Auto_Enable THEN
// 统计当前运行的空压机台数
Current_Run_Count := BOOL_TO_INT(Comp1_Run) + BOOL_TO_INT(Comp2_Run) + BOOL_TO_INT(Comp3_Run);
// 1号罐压力低于下限,且运行台数没超上限,就启动
IF (Press1 < Set_Low) AND NOT Comp1_Run AND (Current_Run_Count < Max_Run) THEN
Comp1_Start_CMD := TRUE;
// 压力高于上限,且正在运行,就停机
ELSIF (Press1 > Set_High) AND Comp1_Run THEN
Comp1_Stop_CMD := TRUE;
END_IF;
// 2号罐逻辑,复制改编号就行,省事儿
IF (Press2 < Set_Low) AND NOT Comp2_Run AND (Current_Run_Count < Max_Run) THEN
Comp2_Start_CMD := TRUE;
ELSIF (Press2 > Set_High) AND Comp2_Run THEN
Comp2_Stop_CMD := TRUE;
END_IF;
// 3号罐同理,不多啰嗦
IF (Press3 < Set_Low) AND NOT Comp3_Run AND (Current_Run_Count < Max_Run) THEN
Comp3_Start_CMD := TRUE;
ELSIF (Press3 > Set_High) AND Comp3_Run THEN
Comp3_Stop_CMD := TRUE;
END_IF;
// 风冷机逻辑:空压机运行30秒后再启动风机,防止频繁启停烧电机
Fan_Delay(IN := Comp1_Run OR Comp2_Run OR Comp3_Run, PT := T#30S);
Fan_Run := Fan_Delay.Q;
END_IF;
这段代码其实没什么花活,但都是踩过坑才加的细节。比如那个运行台数限制,一开始没加,结果车间用电高峰的时候三台空压机一起启动,把车间的总闸给跳了,后来加了Max_Run:=2,最多同时开两台,再也没出过这事儿。还有那个30秒的延时定时器,一开始风冷机跟空压机同步启停,结果空压机刚开就关,风机跟着频繁启停,烧了一个备用风机,后来加了TON延时,现在稳得一批。
新手最容易踩的模拟量转换坑
这个必须单独拎出来说!SM1231读回来的AIW是0~27648的整数,要转换成实际的压力值,得这么算:
// 把AIW0转换成1号罐的压力,单位MPa
Press1 := AIW0 / 27648.0 * 1.0;
// 要是测的是0~1.6MPa的压力,就把最后乘的1.0改成1.6就行
一开始我忘了除以27648,测出来的压力全是几千,调试的时候盯着屏幕看了半天以为压力传感器坏了,后来翻西门子的手册才反应过来,这坑咱替大家踩过了。
报警记录和参数设置
报警这块我做了个10条的循环缓冲区,把最近的报警都存起来,触摸屏上点一下就能看哪天哪个罐压力过低,哪天风冷机过载了。简化的代码大概是这样:
// 报警记录缓冲区,最多存10条
TYPE Alarm_Log:
STRUCT
Alarm_Time: DATE_AND_TIME;
Alarm_Code: WORD;
Alarm_Desc: STRING[20];
END_STRUCT
END_TYPE
VAR_GLOBAL RETAIN
Alarm_Buffer: ARRAY[1..10] OF Alarm_Log;
Alarm_Idx: INT := 1;
Old_Press1_Low: BOOL;
Old_Fan_Overload: BOOL;
END_VAR
// 1号罐压力过低报警,低于0.2MPa就触发,说明储气罐漏气了
IF (Press1 < 0.2) AND NOT Old_Press1_Low THEN
Alarm_Buffer[Alarm_Idx].Alarm_Time := LOCAL_DATE_TIME;
Alarm_Buffer[Alarm_Idx].Alarm_Code := 16#0001;
Alarm_Buffer[Alarm_Idx].Alarm_Desc := "1号罐压力过低";
Alarm_Idx := Alarm_Idx + 1;
IF Alarm_Idx > 10 THEN Alarm_Idx := 1; END_IF;
END_IF;
Old_Press1_Low := Press1 < 0.2;
参数设置就更简单了,在KTP700的组态里建几个输入域,直接关联PLC里的SetLow、SetHigh这些变量,改完点一下下载就生效,车间主任自己都能改,不用喊我跑过去改程序。
最后唠唠实际效果
现在三班倒的工友再也不用每隔一小时跑过来看压力表了,触摸屏上就能看到三路压力、各台空压机的状态,报警弹出来的时候手机还能收到短信提醒(加了个4G模块),就算不在车间也能知道啥时候出问题了。上周车间主任还夸我,说这玩意儿比之前的老系统好用十倍,其实也就是把常见的工控逻辑拼了拼,加了点自己踩坑攒的经验而已。

对了,最后补一句,要是有人跟我一样用S7-1200的话,记得程序里的变量要加RETAIN属性,不然上电之后参数都得重新设,血的教训。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)