前言
本文分享一个自己编写的电机控制逻辑块。
一、功能概述
- 手动状态、自动状态、机旁状态、强制状态、检修状态自由切换;
- 具有启动超时报警功能;
- 手动状态下,按启动按钮启动,按停止按钮停止;
- 自动状态下,根据程序连锁要求自动启停;
- 强制状态下,忽视所有条件,强制显示电机运行、停止运行信号;
- 检修状态下,自动停止,且按下启动按钮不允许启动;
- 具有启动连锁,停止连锁功能,只有连锁条件满足时,才能启动、停止;
- 具有连锁解除功能,接触连锁后,手动状态下可自由启动、停止。
二、程序编写
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