西门子PLC常用底层逻辑块分享_电磁阀

本文详细介绍了如何使用自定义数据类型和FB功能块在PLC中编写单输出和双输出电磁阀的控制程序,包括状态切换逻辑、超时处理、故障复位以及各种操作模式下的阀门控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

  • 前言
  • 一、功能概述
  • 二、程序编写
    • 1.创建“电磁阀数据类型”
    • 2.创建FB功能块“电磁阀”
    • 3.编写程序


前言

本文分享一个自己编写的电磁阀控制逻辑块。


一、功能概述

  1. 手动状态、自动状态、机旁状态、强制状态、检修状态自由切换;
  2. 具有开阀超时、关阀超时报警功能;
  3. 手动状态下,按开阀按钮开阀,按关阀按钮关阀;
  4. 自动状态下,根据程序连锁要求自动开阀关阀;
  5. 强制状态下,忽视所有条件,强制显示开阀或关阀到位;
  6. 检修状态下,自动关阀,且按下开阀按钮不允许开阀;
  7. 具有开阀连锁,关阀连锁功能,只有连锁条件满足时,才能开、关阀;
  8. 具有连锁解除功能,接触连锁后,手动状态下可自由开、关阀。

二、程序编写

1.创建“电磁阀数据类型”

在这里插入图片描述

2.创建FB功能块“电磁阀”

建立如下引脚变量:
在这里插入图片描述

3.编写程序

代码如下:

REGION 赋值
    #Valve.Rdy_DI := #Rdy_DI;
    #Valve.Lcl_DI := #Lcl_DI;
    #Valve.Lcl_DO := #Valve.Lcl_DI;
    #Valve.Flt := #Flt;
    #Valve.OpnInterlock := #OpnInterlock;
    #Valve.ClsInterlock := #ClsInterlock;
    #Valve.ValStyle := #ValStyle;
    #Opn_DO := #Valve.Opn_DO;
    #Cls_DO := #Valve.Cls_DO;
    IF NOT #Valve.EmgManual_DO THEN
        #Valve.Opn_DI := #Opn_DI;
        #Valve.Cls_DI := #Cls_DI;
    END_IF;
END_REGION


REGION 时间转换
    #OpnTime := DINT_TO_TIME(REAL_TO_DINT(#Valve.OpnTSet * 1000.0));
    #ClsTime:=DINT_TO_TIME(REAL_TO_DINT(#Valve.ClsTSet * 1000.0));
END_REGION

REGION 故障处理
    #Valve.AllFlt := #Valve.Flt OR #Valve.OpnTOut OR #Valve.ClsTOut OR #Valve.LimitFlt;
    
    #Open_IEC(IN := #Valve.Opn_DO AND NOT #Valve.HMICls AND NOT #Valve.Opn_DI AND NOT #Valve.LimitFlt,
              PT := #OpnTime); //开阀延时
    #Close_IEC(IN := #Valve.Cls_DO AND NOT #Valve.HMIOpn AND NOT #Valve.Cls_DI AND NOT #Valve.LimitFlt,
               PT := #ClsTime); //关阀延时
    #Limit_IEC(IN := #Valve.Opn_DI AND #Valve.Cls_DI,
               PT := #LimitTime); //限位超时
    
    IF #Open_IEC.Q THEN
        #Valve.OpnTOut := 1;
        #Valve.Opn_DO := 0;
    END_IF; //开阀超时输出
    IF #Close_IEC.Q THEN
        #Valve.ClsTOut := 1;
        #Valve.Opn_DO := 0;
    END_IF; //关阀超时输出
    IF #Limit_IEC.Q THEN
        #Valve.LimitFlt := 1;
        #Valve.Opn_DO := 0;
        #Valve.Cls_DO := 0;
    END_IF; //限位故障输出
    
    IF #Valve.HMIRst THEN
        #Valve.AllFlt := 0;
        #Valve.LimitFlt := 0; //复位限位故障输出
        #Valve.OpnTOut := 0; //复位开阀超时输出
        #Valve.ClsTOut := 0; //复位关阀超时输出
    END_IF;
    
    IF #Valve.AllFlt THEN
        #Valve.Opn_DO := 0;
        #Valve.Cls_DO := 0;
    END_IF;
END_REGION

REGION 手动状态显示
    IF #Valve.HMIManual AND NOT #Valve.HMIAuto AND NOT #Valve.HMIEmgManual AND NOT #Valve.HMIPause AND NOT #Valve.Lcl_DO THEN
        #Valve.Manual_DO := 1;
        #Valve.Auto_DO := 0;
        #Valve.EmgManual_DO := 0;
        #Valve.Pause_DO := 0;
    END_IF;
    IF NOT #Valve.Auto_DO AND NOT #Valve.Pause_DO AND NOT #Valve.Lcl_DO AND NOT #Valve.EmgManual_DO THEN
        #Valve.#Manual_DO := 1;
        #Valve.#Auto_DO := 0;
        #Valve.#EmgManual_DO := 0;
        #Valve.Pause_DO := 0;
    END_IF;
END_REGION

REGION 自动状态显示
    IF #Valve.HMIAuto AND NOT #Valve.HMIManual AND NOT #Valve.HMIEmgManual AND NOT #Valve.HMIPause AND NOT #Valve.Lcl_DO THEN
        #Valve.#Manual_DO := 0;
        #Valve.#Auto_DO := 1;
        #Valve.#EmgManual_DO := 0;
        #Valve.Pause_DO := 0;
    END_IF;
END_REGION

REGION 强制状态显示
    IF #Valve.HMIEmgManual AND NOT #Valve.HMIManual AND NOT #Valve.HMIAuto AND NOT #Valve.HMIPause AND NOT #Valve.Lcl_DO THEN
        #Valve.Manual_DO := 0;
        #Valve.Auto_DO := 0;
        #Valve.EmgManual_DO := 1;
        #Valve.Pause_DO := 0;
    END_IF;
END_REGION

REGION 休止状态显示
    IF #Valve.HMIPause AND NOT #Valve.HMIManual AND NOT #Valve.HMIAuto AND NOT #Valve.HMIEmgManual AND NOT #Valve.Lcl_DO THEN
        #Valve.#Manual_DO := 0;
        #Valve.#Auto_DO := 0;
        #Valve.#EmgManual_DO := 0;
        #Valve.#Pause_DO := 1;
    END_IF;
END_REGION

REGION 手动状态下开阀、关阀
    IF #Valve.Rdy_DI AND (#Valve.OpnInterlock OR #Valve.HMIInterlock) AND #Valve.HMIOpn AND #Valve.Manual_DO AND NOT #Valve.HMICls AND NOT #Valve.AllFlt AND NOT #Valve.Lcl_DO THEN
        #Valve.Opn_DO := 1;
        #Valve.Cls_DO := 0;
    END_IF;
    IF #Valve.Rdy_DI AND (#Valve.ClsInterlock OR #Valve.HMIInterlock) AND #Valve.HMICls AND #Valve.Manual_DO AND NOT #Valve.HMIOpn AND NOT #Valve.AllFlt AND NOT #Valve.Lcl_DO THEN
        #Valve.Opn_DO := 0;
        #Valve.Cls_DO := 1;
    END_IF;
END_REGION

REGION 自动状态下开阀、关阀
    IF #Valve.Rdy_DI AND #Valve.AutoOpn AND NOT #Valve.AutoCls AND #Valve.Auto_DO AND NOT #Valve.AllFlt AND NOT #Valve.Lcl_DO THEN
        #Valve.Opn_DO := 1;
        #Valve.Cls_DO := 0;
    END_IF;
    IF #Valve.Rdy_DI AND #Valve.AutoCls AND NOT #Valve.AutoOpn AND #Valve.Auto_DO AND NOT #Valve.AllFlt AND NOT #Valve.Lcl_DO THEN
        #Valve.Opn_DO := 0;
        #Valve.Cls_DO := 1;
    END_IF;
END_REGION

REGION 强制开、关阀到位信号
    IF #Valve.EmgManual_DO AND #Valve.HMIOpn THEN
        #Valve.Opn_DI := 1;
        #Valve.Cls_DI := 0;
    END_IF;
    IF #Valve.EmgManual_DO AND #Valve.HMICls THEN
        #Valve.Opn_DI := 0;
        #Valve.Cls_DI := 1;
    END_IF;
END_REGION

REGION 休止状态下关阀
    IF #Valve.Rdy_DI AND #Valve.Pause_DO AND NOT #Valve.Lcl_DO THEN
        #Valve.Opn_DO := 0;
        #Valve.Cls_DO := 1;
    END_IF;
END_REGION

REGION 双输出电磁阀,开关阀到位后,开阀关阀不再输出
    IF #Valve.ValStyle THEN
        IF #Valve.Opn_DI THEN
            #Valve.Opn_DO := 0;
        END_IF;
        IF #Valve.Cls_DI THEN
            #Valve.Cls_DO := 0;
        END_IF;
    END_IF;
END_REGION

REGION 按钮自复位
    IF NOT "AlwaysFALSE" THEN
        #Valve.HMIOpn := 0;
        #Valve.HMICls := 0;
        #Valve.HMIManual := 0;
        #Valve.HMIAuto := 0;
        #Valve.HMIRst := 0;
        #Valve.HMIEmgManual := 0;
        #Valve.HMIPause := 0;
    END_IF;
END_REGION
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值