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


前言

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


一、功能概述

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

二、程序编写

1.创建“电机数据类型”

在这里插入图片描述

2.创建FB功能块“电机”

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

3.编写程序

代码如下:

REGION 赋值
    #Motor.Rdy_DI := #Rdy_DI;
    #Motor.Lcl_DI := #Lcl_DI;
    #Motor.Lcl_DO := #Motor.Lcl_DI;
    #Motor.EStop_DI := #EStop_DI;
    #Motor.Flt := #Flt;
    #Motor.StaInterlock := #StaInterlock;
    #Motor.StpInterlock := #StpInterlock;
    #Sta_DO := #Motor.Sta_DO;
    #Stp_DO := #Motor.Stp_DO;
    IF NOT #Motor.EmgManual_DO THEN
        #Motor.Running_DI := #Running_DI;
    END_IF;
END_REGION

REGION 时间转换
    #StaTime := DINT_TO_TIME(REAL_TO_DINT(#Motor.StaTSet * 1000.0));
END_REGION

REGION 故障处理
    #Motor.AllFlt := #Motor.Flt OR #Motor.StaTOut OR #Motor.EStop_DI;
    #Sta_IEC(IN := #Motor.Sta_DO AND NOT #Motor.Running_DI AND NOT #Motor.HMIStp,
             PT := #StaTime);
    IF #Sta_IEC.Q THEN
        #Motor.StaTOut := 1;
        #Motor.Sta_DO := 0;
        #Motor.Stp_DO := 1;
    END_IF;
    IF #Motor.HMIRst THEN
        #Motor.AllFlt := 0;
        #Motor.StaTOut := 0;
    END_IF;
    IF #Motor.AllFlt THEN
        #Motor.Sta_DO := 0;
        #Motor.Stp_DO := 1;
    END_IF;
END_REGION

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

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

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

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

REGION 手动状态下电机启动、停止
    IF #Motor.Rdy_DI AND (#Motor.StaInterlock OR #Motor.HMIInterlock) AND #Motor.HMISta AND #Motor.Manual_DO AND NOT #Motor.HMIStp AND NOT #Motor.AllFlt AND NOT #Motor.Lcl_DO THEN
        #Motor.Sta_DO := 1;
        #Motor.Stp_DO := 0;
    END_IF;
    IF #Motor.Rdy_DI AND (#Motor.StpInterlock OR #Motor.HMIInterlock) AND #Motor.HMIStp AND #Motor.Manual_DO AND NOT #Motor.HMISta AND NOT #Motor.AllFlt AND NOT #Motor.Lcl_DO THEN
        #Motor.Sta_DO := 0;
        #Motor.Stp_DO := 1;
    END_IF;
END_REGION

REGION 自动状态下电机启动、停止
    IF #Motor.Rdy_DI AND #Motor.AutoSta AND NOT #Motor.AutoStp AND #Motor.Auto_DO AND NOT #Motor.AllFlt AND NOT #Motor.Lcl_DO THEN
        #Motor.Sta_DO := 1;
        #Motor.Stp_DO := 0;
    END_IF;
    IF #Motor.Rdy_DI AND #Motor.AutoStp AND NOT #Motor.AutoSta AND #Motor.Auto_DO AND NOT #Motor.AllFlt AND NOT #Motor.Lcl_DO THEN
        #Motor.Sta_DO := 0;
        #Motor.Stp_DO := 1;
    END_IF;
END_REGION

REGION 强制电机启动、停止信号
    IF #Motor.EmgManual_DO AND #Motor.HMISta THEN
        #Motor.Running_DI := 1;
    END_IF;
    IF #Motor.EmgManual_DO AND #Motor.HMIStp THEN
        #Motor.Running_DI := 0;
    END_IF;
END_REGION

REGION 休止状态下电机停止
    IF #Motor.Pause_DO AND NOT #Motor.Lcl_DO THEN
        #Motor.Sta_DO := 0;
        #Motor.Stp_DO := 1;
    END_IF;
END_REGION

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值