基于西门子plc的空压机组储气风冷机组自动控制系统 可以实现手动自动切换 三组空压机分别自动控制,自动检测三路压力 风冷机运行实时检测 报警查寻,参数设置等

上周刚把车间那套跑了快十年的空压机组控制系统给换了,用的是西门子S7-1200,总算不用每天定点蹲在控制柜跟前掐表启停空压机了——老系统全是硬接线按钮,压力低了就得手动开,压力高了忘关还能把储气罐顶炸,想想都后怕。今天就唠唠这个基于西门子PLC的空压机组+风冷机自动控制系统的实活细节,中间插点写代码的时候的碎碎念。

基于西门子plc的空压机组储气风冷机组自动控制系统 可以实现手动自动切换 三组空压机分别自动控制,自动检测三路压力 风冷机运行实时检测 报警查寻,参数设置等

首先说需求,甲方(其实就是车间主任)要求的东西不多,但都是刚需:

  1. 得有手动自动切换,手动的时候跟老系统一样用按钮启停,自动的时候完全不用管
  2. 三路储气罐分别自动控制,每一路都能自己根据压力启停空压机
  3. 得实时测三路压力,不能瞎猜罐子里有多少气
  4. 风冷机得跟着空压机走,还得监控有没有过载
  5. 得能查报警记录,哪天空压机罢工了能翻出来看看为啥
  6. 压力上下限这种参数得能改,不能硬焊在程序里

先搭个硬件架子

选了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里的SetLowSetHigh这些变量,改完点一下下载就生效,车间主任自己都能改,不用喊我跑过去改程序。

最后唠唠实际效果

现在三班倒的工友再也不用每隔一小时跑过来看压力表了,触摸屏上就能看到三路压力、各台空压机的状态,报警弹出来的时候手机还能收到短信提醒(加了个4G模块),就算不在车间也能知道啥时候出问题了。上周车间主任还夸我,说这玩意儿比之前的老系统好用十倍,其实也就是把常见的工控逻辑拼了拼,加了点自己踩坑攒的经验而已。

对了,最后补一句,要是有人跟我一样用S7-1200的话,记得程序里的变量要加RETAIN属性,不然上电之后参数都得重新设,血的教训。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐