Files

50 lines
2.2 KiB
Smalltalk

(*
===============================================================================
Project : PLC_Library
Device : -
Path : Общие
Name : ALARM_3
Type : FUNCTION_BLOCK
===============================================================================
*)
FUNCTION_BLOCK ALARM_3
(* Функциональный блок проверяет входное значение X на принадлежность [LO_1HI_1] [LO_2HI_2] [LO_3HI_3] *)
VAR_INPUT
X : REAL; (* Контролируемое значение. *)
LO_1 : REAL; (* Нижний предел 1. *)
HI_1 : REAL; (* Верхний предел 1. *)
LO_2 : REAL; (* Нижний предел 2. *)
HI_2 : REAL; (* Верхний предел 2. *)
LO_3 : REAL; (* Нижний предел 3. *)
HI_3 : REAL; (* Верхний предел 3. *)
HYS : REAL; (* Значение гистерезиса (берется как HYS/2 отностительно середины) *)
END_VAR
VAR_OUTPUT
Q1_LO : BOOL := FALSE; (* Флаг «значение меньше нижнего предела 1». *)
Q1_HI : BOOL := FALSE; (* Флаг «значение больше верхнего предела 1». *)
Q2_LO : BOOL := FALSE; (* Флаг «значение меньше нижнего предела 2». *)
Q2_HI : BOOL := FALSE; (* Флаг «значение больше верхнего предела 2». *)
Q3_LO : BOOL := FALSE; (* Флаг «значение меньше нижнего предела 3». *)
Q3_HI : BOOL := FALSE; (* Флаг «значение больше верхнего предела 3». *)
END_VAR
VAR
tmp: REAL;
END_VAR
(*----- IMPLEMENTATION -----*)
tmp := X - HYS * 0.5;
IF tmp > LO_1 THEN Q1_LO := FALSE; END_IF;
IF tmp > LO_2 THEN Q2_LO := FALSE; END_IF;
IF tmp > LO_3 THEN Q3_LO := FALSE; END_IF;
IF tmp > HI_1 THEN Q1_HI := TRUE; END_IF;
IF tmp > HI_2 THEN Q2_HI := TRUE; END_IF;
IF tmp > HI_3 THEN Q3_HI := TRUE; END_IF;
tmp := tmp + HYS;
IF tmp < LO_1 THEN Q1_LO := TRUE; END_IF;
IF tmp < LO_2 THEN Q2_LO := TRUE; END_IF;
IF tmp < LO_3 THEN Q3_LO := TRUE; END_IF;
IF tmp < HI_1 THEN Q1_HI := FALSE; END_IF;
IF tmp < HI_2 THEN Q2_HI := FALSE; END_IF;
IF tmp < HI_3 THEN Q3_HI := FALSE; END_IF;
END_FUNCTION_BLOCK