文章目录
- 前言
- 一、功能概述
- 二、程序编写
- 1.创建“电磁阀数据类型”
- 2.创建FB功能块“电磁阀”
- 3.编写程序
前言
本文分享一个自己编写的电磁阀控制逻辑块。
一、功能概述
- 手动状态、自动状态、机旁状态、强制状态、检修状态自由切换;
- 具有开阀超时、关阀超时报警功能;
- 手动状态下,按开阀按钮开阀,按关阀按钮关阀;
- 自动状态下,根据程序连锁要求自动开阀关阀;
- 强制状态下,忽视所有条件,强制显示开阀或关阀到位;
- 检修状态下,自动关阀,且按下开阀按钮不允许开阀;
- 具有开阀连锁,关阀连锁功能,只有连锁条件满足时,才能开、关阀;
- 具有连锁解除功能,接触连锁后,手动状态下可自由开、关阀。
二、程序编写
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