前言
在某些应用场景下,如水泵房,一般有两台抽水泵电机,正常情况下主电机运行,当主电机故障停机时,备用电机应自动投入运行,即主备互投。本文给出一种基于西门子SCL语言实现的电机主备互投方法。
一、功能概述
- 电机分为一主一备,可自由选择哪台电机优先启动;
- 当满足主电机启动条件时,主电机启动;
- 当满足备用电机启动条件时,备用电机启动;
- 当满足备用电机停止条件时,备用电机停止;
- 当满足主电机停止条件时,主备用电机均停止;
- 当主电机故障停机时,备用电机自动启动;
- 当主设备故障,备用设备优先启动;
- 当一定时间后,主备自动换序,时间可自由设置;
- 默认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
- “设备运行数量统计”的程序逻辑,参考了文章十二、SCL核心应用课项目实战_运行设备累计功能实现;
- "运行时间累计"FC块,请参考文章西门子PLC常用底层逻辑块分享_设备运行时间统计。
其中,输入引脚“Clock_1Hz”表示1Hz的脉冲信号,可在外部程序块中编写如下程序实现,如图3中程序段1所示。
4.调用程序
图3
图4
图5
- 程序段2和程序段3调用了水泵的标准块程序,这里不再赘述;
- 程序段5表示主泵和备泵的启停条件,可根据实际工艺要求修改。
总结
本文基于西门子SCL语言,实现了电机主备互投功能。实际应用中,可在上位机画面添加按钮关联“EnSwitch”变量,用于投入/取消主备互投功能,并添加“选项组”控件,关联“Select ”变量,用于选择哪台电机优先启动,具体操作这里不再赘述 。