供暖公司输煤线连锁保护部分程序分享!
FUNCTION_BLOCK "连锁保护FB"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_IN_OUT
VDF_array : Array[*] of "VDF_data";
END_VAR
VAR
ArrayBuf_LEN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt;
IEC_Timer_0_Instance {OriginalPartName := 'IEC_TIMER'; LibVersion := '1.0'} : TON_TIME;
i { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int := 1; // 循环扫描
END_VAR
VAR_TEMP
j : Int;
k : Int; // 记录当前设备后面不参与连锁的设备数量
i1 : Int;
END_VAR
BEGIN
Region 连锁控制逻辑
(*
---为输煤线设计连锁保护停机程序,从煤库到锅炉前皮带,有多个设备如筛煤机、碎煤机、
斗提、皮带、取煤机等!
--- 要求在限制条件下从锅炉前皮带开始依次启动,运行后才可以启动下一个设备,非限制条件
时,可自由起停!
---连锁停机时从取煤机开始,依次延时停机!
---当连锁保护不为1时不参与连锁(个别设备不允许频繁起停)!
*)
#ArrayBuf_LEN := UPPER_BOUND(ARR := #VDF_array, DIM := 1);
(*
循环检测
*)
If #i > #ArrayBuf_LEN Then
#i := 1;
End_If;
If #i <= #ArrayBuf_LEN Then
#j := #i;
#k := 1;
(*
检测不参与连锁的设备(当前设备后面的),屏蔽不发停机命令!
*)
While #j - 1 > 0 And #VDF_array[#j - 1]."连锁保护" = 0 Do
#j := #j - 1;
#k := #k + 1;
End_While;
(*
停机延时设置
*)
If #VDF_array[#i].连锁保护 And #VDF_array[#i].状态位反馈 = 1 And #VDF_array[#i - #k].状态位反馈 = 0 And #VDF_array[#i - #k].连锁保护 = 1 Then
#IEC_Timer_0_Instance(IN := 1,
PT := t#3s);
End_If;
(*
判别后停机
*)
If #VDF_array[#i].连锁保护 And #IEC_Timer_0_Instance.Q And #VDF_array[#i].状态位反馈 = 1 Then
#IEC_Timer_0_Instance(IN := 0,
PT := t#3s);
#VDF_array[#i].起停控制 := 0;
If #i < #ArrayBuf_LEN Then
#i := #i + 1;
Else
#i := 1;
End_If;
End_If;
(*
连锁未保护,不执行停机!
*)
If #VDF_array[#i].连锁保护 = 0 Then
If #i < #ArrayBuf_LEN Then
#i := #i + 1;
Else
#i := 1;
End_If;
End_If;
(*
连锁保护,设备停机状态,不执行停机!
*)
If #VDF_array[#i].连锁保护 And #VDF_array[#i].状态位反馈 = 0 Then
If #i < #ArrayBuf_LEN Then
#i := #i + 1;
Else
#i := 1;
End_If;
End_If;
End_If;
End_Region
Region 数据记录及平均值
(*
---记录设备数据如电流,分别3分钟平均值(360点500ms记录),60分钟平均值(360点10s记录)历史故障等
*)
End_Region
Region 启动条件
(*
---启动条件为先启动前面设备,当启动后延时稳定后,才可以启动后面设备!
---如:"连锁保护"."THIS"[10].状态位反馈变为1时,"连锁保护"."THIS"[9].起停控制 按下才有效,依次类推.
*)
End_Region
Region 模拟电机启动
// 模拟测试时仿反馈状态信号
(*
状态位反馈(停止)=0;
状态位反馈(运行)=1;
状态位反馈(启动中...)=2;
状态位反馈(停止中...)=3;
*)
For #i1 := 0 To #ArrayBuf_LEN Do
If #VDF_array[#i1].起停控制 Then
#VDF_array[#i1].状态位反馈 := 1;
Else
#VDF_array[#i1].状态位反馈 :=0;
End_If;
End_For;
End_Region
END_FUNCTION_BLOCK