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


前言

在某些应用场景下,如水泵房,一般有两台抽水泵电机,正常情况下主电机运行,当主电机故障停机时,备用电机应自动投入运行,即主备互投。本文给出一种基于西门子SCL语言实现的电机主备互投方法。


一、功能概述

  1. 电机分为一主一备,可自由选择哪台电机优先启动;
  2. 当满足主电机启动条件时,主电机启动;
  3. 当满足备用电机启动条件时,备用电机启动;
  4. 当满足备用电机停止条件时,备用电机停止;
  5. 当满足主电机停止条件时,主备用电机均停止;
  6. 当主电机故障停机时,备用电机自动启动;
  7. 当主设备故障,备用设备优先启动;
  8. 当一定时间后,主备自动换序,时间可自由设置;
  9. 默认1号泵为主泵。

二、程序编写

1.新建数据类型“Primary/ReserveType”

在这里插入图片描述
图1

2.新建FB块“Primary/Reserve”

建立如下内部变量:
在这里插入图片描述
图2

3.编写程序

代码如下

REGION 初始化
    #Pump."1#RunSta" := #"1#RunSta";
    #Pump."2#RunSta" := #"2#RunSta";
    #Pump."1#Flt" := #"1#Flt";
    #Pump."2#Flt" := #"2#Flt";
    #"1#StrCmd" := #Pump."1#StrCmd";
    #"1#StpCmd" := #Pump."1#StpCmd";
    #"2#StrCmd" := #Pump."2#StrCmd";
    #"2#StpCmd" := #Pump."2#StpCmd";
    
    IF #NumRun = 0 THEN
        #RegMotor := 0;
    END_IF;
    
    IF #Pump.#"1#RunSta" AND NOT #Pump.#"2#RunSta" THEN
        #RegMotor := 1;
    END_IF;
    
    IF #Pump.#"2#RunSta" AND NOT #Pump.#"1#RunSta" THEN
        #RegMotor := 2;
    END_IF;
    
    IF #Pump.#"1#RunSta" AND #Pump.#"2#RunSta" THEN
        #RegMotor := 3;
    END_IF;
    
    #Motor_Array[1] := #Pump.#"1#RunSta";
    #Motor_Array[2] := #Pump.#"2#RunSta";
    
END_REGION

REGION 设备运行数量统计
    
    #Num := 0;
    FOR #N := 1 TO 2 DO
        IF #Motor_Array[#N] THEN
            #Num := #Num + 1;
        END_IF;
    END_FOR;
    #NumRun := #Num;
    
END_REGION

REGION 无设备运行时,复位启动命令
    
    IF (NOT #Pump.MastAutoStrCmd OR NOT #Pump.StandbyAutoStrCmd) THEN
        #Pump.#"1#StrCmd" := 0;
        #Pump.#"1#StpCmd" := 0;
        #Pump.#"2#StrCmd" := 0;
        #Pump.#"2#StpCmd" := 0;
    END_IF;
         
END_REGION


REGION 无设备运行时启动1#或2#水泵
    
    IF (#NumRun = 0) AND #Pump.#Select = 1 AND #Pump.#MastAutoStrCmd  THEN
        #Pump.#"1#StrCmd" := 1;
        #Pump.#"1#StpCmd" := 0;
    END_IF;
    
    IF (#NumRun = 0) AND #Pump.#Select = 2 AND #Pump.#MastAutoStrCmd THEN
        #Pump.#"2#StrCmd" := 1;
        #Pump.#"2#StpCmd" := 0;
    END_IF;
    
    IF (#NumRun = 0) AND #Pump.#Select = 1 AND #Pump.#MastAutoStrCmd AND #Pump.#EnSwitch AND #Pump."1#Flt" THEN
        #Pump.#"2#StrCmd" := 1;
        #Pump.#"2#StpCmd" := 0;
    END_IF;
    
    IF (#NumRun = 0) AND #Pump.#Select = 2 AND #Pump.#MastAutoStrCmd AND #Pump.#EnSwitch AND #Pump."2#Flt" THEN
        #Pump.#"1#StrCmd" := 1;
        #Pump.#"1#StpCmd" := 0;
    END_IF;
    
END_REGION

REGION 主设备故障停机,启用备用设备
    
    IF (#RegMotor = 1) AND #Pump.#EnSwitch AND NOT #Pump."1#RunSta" AND NOT #Pump.#MastAutoStpCmd THEN
        #Pump.#"2#StrCmd" := 1;
        #Pump.#"2#StpCmd" := 0;
        #Pump.#"1#StrCmd" := 0;
        #Pump.#"1#StpCmd" := 1;
    END_IF;
    
    IF (#RegMotor = 2) AND #Pump.#EnSwitch AND NOT #Pump."2#RunSta" AND NOT #Pump.#MastAutoStpCmd THEN
        #Pump.#"1#StrCmd" := 1;
        #Pump.#"1#StpCmd" := 0;
        #Pump.#"2#StrCmd" := 0;
        #Pump.#"2#StpCmd" := 1;
    END_IF;
    
END_REGION

REGION 主设备运行中,启用备用设备
    
    IF #Pump.#"1#RunSta" AND (#NumRun = 1) AND #Pump.#StandbyAutoStrCmd THEN
        #Pump.#"2#StrCmd" := 1;
        #Pump.#"2#StpCmd" := 0;
    END_IF;
    
    IF #Pump.#"2#RunSta" AND (#NumRun = 1) AND #Pump.#StandbyAutoStrCmd THEN
        #Pump.#"1#StrCmd" := 1;
        #Pump.#"1#StpCmd" := 0;
    END_IF;
    
END_REGION

REGION 主设备运行中,停止备用设备
    
    IF (#RegMotor = 3) AND #Pump.#Select = 1 AND #Pump.#StandbyAutoStpCmd THEN
        #Pump.#"2#StrCmd" := 0;
        #Pump.#"2#StpCmd" := 1;
    END_IF;
    
    IF (#RegMotor = 3) AND #Pump.#Select = 2 AND #Pump.#StandbyAutoStpCmd THEN
        #Pump.#"1#StrCmd" := 0;
        #Pump.#"1#StpCmd" := 1;
    END_IF;
    
END_REGION

REGION 主设备、备用设备停止
    
    IF #NumRun > 0 AND #Pump.#MastAutoStpCmd THEN
        #Pump.#"1#StrCmd" := 0;
        #Pump.#"1#StpCmd" := 1;
        #Pump.#"2#StrCmd" := 0;
        #Pump.#"2#StpCmd" := 1;
    END_IF;
    
END_REGION

REGION 设备运行时间统计
    
    "运行时间累计"(Start := #Pump."1#RunSta",
             Clock_1Hz := #Clock_1Hz,
             "Time" := #Pump."Time"[1]);
    
    #Pump.RunTime[1] := #Pump."Time"[1].Day * 24 * 60 * 60 + #Pump."Time"[1].Hour * 60 * 60 + #Pump."Time"[1].Min * 60 + #Pump."Time"[1].Second;
    
    "运行时间累计"(Start := #Pump."2#RunSta",
             Clock_1Hz := #Clock_1Hz,
             "Time" := #Pump."Time"[2]);
    
    #Pump.RunTime[2] := #Pump."Time"[2].Day * 24 * 60 * 60 + #Pump."Time"[2].Hour * 60 * 60 + #Pump."Time"[2].Min * 60 + #Pump."Time"[2].Second;
    
END_REGION

REGION 换序
    
    #ExchangeCmd_R_TRIG[1](CLK := #Pump.RunTime[1] >= #Pump.ExchangeTSet);
    #ExchangeCmd_R_TRIG[2](CLK := #Pump.RunTime[2] >= #Pump.ExchangeTSet);
    
    IF #Pump.ChangeSwitch AND #ExchangeCmd_R_TRIG[1].Q AND #Pump.#Select = 1 THEN
        #Pump.#Select := 2;
    END_IF;
    
    IF #Pump.ChangeSwitch AND #ExchangeCmd_R_TRIG[2].Q AND #Pump.#Select = 2 THEN
        #Pump.#Select := 1;
    END_IF;
    
    #Pump."Time"[1].Clear := NOT #Pump."1#RunSta";
    
    #Pump."Time"[2].Clear := NOT #Pump."2#RunSta";
    
END_REGION
  1. “设备运行数量统计”的程序逻辑,参考了文章十二、SCL核心应用课项目实战_运行设备累计功能实现
  2. "运行时间累计"FC块,请参考文章西门子PLC常用底层逻辑块分享_设备运行时间统计

其中,输入引脚“Clock_1Hz”表示1Hz的脉冲信号,可在外部程序块中编写如下程序实现,如图3中程序段1所示。

4.调用程序

在这里插入图片描述
图3
在这里插入图片描述
图4
在这里插入图片描述
图5

  1. 程序段2和程序段3调用了水泵的标准块程序,这里不再赘述;
  2. 程序段5表示主泵和备泵的启停条件,可根据实际工艺要求修改。

总结

本文基于西门子SCL语言,实现了电机主备互投功能。实际应用中,可在上位机画面添加按钮关联“EnSwitch”变量,用于投入/取消主备互投功能,并添加“选项组”控件,关联“Select ”变量,用于选择哪台电机优先启动,具体操作这里不再赘述 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值