Добавил QUEUE_I16, поправил AIM725_Status
This commit is contained in:
Binary file not shown.
@@ -34,7 +34,8 @@ VAR_INPUT
|
|||||||
time_warn_low: TIME :=t#0s; (* Выдержка времени на срабатывание warn_low *)
|
time_warn_low: TIME :=t#0s; (* Выдержка времени на срабатывание warn_low *)
|
||||||
fail_low: REAL:=-3.402823466E+38; (* Порог аварии по нижнему уровню *)
|
fail_low: REAL:=-3.402823466E+38; (* Порог аварии по нижнему уровню *)
|
||||||
delta_fail_low: REAL := 0; (* Гистерезис возврата из fail_low *)
|
delta_fail_low: REAL := 0; (* Гистерезис возврата из fail_low *)
|
||||||
time_fail_low: TIME :=t#0s; (* Выдержка времени на срабатывание fail_low *)
|
time_fail_low: TIME :=T#0S; (* Выдержка времени на срабатывание fail_low *)
|
||||||
|
time_no_signal: TIME :=T#0S; (* Выдержка времени на срабатывание no_signal *)
|
||||||
Modul_status: BYTE; (* Байт статуса модуля АЦП (биты диагностики по каналам) *)
|
Modul_status: BYTE; (* Байт статуса модуля АЦП (биты диагностики по каналам) *)
|
||||||
Chanel_num: BYTE; (* Номер канала модуля (1 или 2), определяет какие биты Modul_status проверяются *)
|
Chanel_num: BYTE; (* Номер канала модуля (1 или 2), определяет какие биты Modul_status проверяются *)
|
||||||
END_VAR
|
END_VAR
|
||||||
@@ -47,6 +48,7 @@ VAR
|
|||||||
TON_warn_hi: TON;
|
TON_warn_hi: TON;
|
||||||
TON_warn_low: TON;
|
TON_warn_low: TON;
|
||||||
TON_fail_low: TON;
|
TON_fail_low: TON;
|
||||||
|
TON_no_signal: TON;
|
||||||
fail_hi_st: BOOL;
|
fail_hi_st: BOOL;
|
||||||
warn_hi_st: BOOL;
|
warn_hi_st: BOOL;
|
||||||
normal_st: BOOL;
|
normal_st: BOOL;
|
||||||
@@ -55,22 +57,22 @@ VAR
|
|||||||
no_signal_st: BOOL;
|
no_signal_st: BOOL;
|
||||||
END_VAR
|
END_VAR
|
||||||
(*----- IMPLEMENTATION -----*)
|
(*----- IMPLEMENTATION -----*)
|
||||||
no_signal_st := (Input <= - REAL#200 OR ((Modul_status.0 OR Modul_status.4 OR Modul_status.5) AND Chanel_num = 1) OR ((Modul_status.1 OR Modul_status.6 OR Modul_status.7) AND Chanel_num = 2) OR Modul_status.2 OR Modul_status.3);
|
TON_no_signal(IN := (Input <= - REAL#200 OR ((Modul_status.0 OR Modul_status.4 OR Modul_status.5) AND Chanel_num = 1) OR ((Modul_status.1 OR Modul_status.6 OR Modul_status.7) AND Chanel_num = 2) OR Modul_status.2 OR Modul_status.3), PT := time_no_signal);
|
||||||
IF no_signal_st THEN T_mod := - INT#500; ELSE T_mod := REAL_TO_INT(Input); END_IF;
|
IF TON_no_signal.Q THEN T_mod := - INT#500; no_signal_st := TRUE; ELSE T_mod := REAL_TO_INT(Input); no_signal_st := FALSE; END_IF;
|
||||||
|
|
||||||
TON_fail_low(IN := ((Input <= fail_low) AND NOT(no_signal_st)), PT := time_fail_low);
|
TON_fail_low(IN := ((Input <= fail_low) AND NOT(TON_no_signal.Q)), PT := Time_fail_low);
|
||||||
IF TON_fail_low.Q THEN fail_low_st := TRUE; ELSIF (Input > fail_low + delta_fail_low) THEN fail_low_st := FALSE; END_IF;
|
IF TON_fail_low.Q THEN fail_low_st := TRUE; ELSIF (Input > fail_low + Delta_fail_low) THEN fail_low_st := FALSE; END_IF;
|
||||||
|
|
||||||
TON_warn_low(IN := ((Input <= warn_low) AND NOT(no_signal_st) AND NOT(TON_fail_low.Q)), PT := time_warn_low);
|
TON_warn_low(IN := ((Input <= warn_low) AND NOT(TON_no_signal.Q) AND NOT(TON_fail_low.Q)), PT := Time_warn_low);
|
||||||
IF TON_warn_low.Q THEN warn_low_st := TRUE; ELSIF (Input > warn_low + delta_warn_low) THEN warn_low_st := FALSE; END_IF;
|
IF TON_warn_low.Q THEN warn_low_st := TRUE; ELSIF (Input > warn_low + Delta_warn_low) THEN warn_low_st := FALSE; END_IF;
|
||||||
|
|
||||||
TON_fail_hi(IN := ((Input >= fail_hi) AND NOT(no_signal_st)), PT := time_fail_hi);
|
TON_fail_hi(IN := ((Input >= fail_hi) AND NOT(TON_no_signal.Q)), PT := Time_fail_hi);
|
||||||
IF TON_fail_hi.Q THEN fail_hi_st := TRUE; ELSIF (Input < fail_hi - delta_fail_hi) THEN fail_hi_st := FALSE; END_IF;
|
IF TON_fail_hi.Q THEN fail_hi_st := TRUE; ELSIF (Input < fail_hi - Delta_fail_hi) THEN fail_hi_st := FALSE; END_IF;
|
||||||
|
|
||||||
TON_warn_hi(IN := ((Input >= warn_hi) AND NOT(no_signal_st) AND NOT(TON_fail_hi.Q)), PT := time_warn_hi);
|
TON_warn_hi(IN := ((Input >= warn_hi) AND NOT(TON_no_signal.Q) AND NOT(TON_fail_hi.Q)), PT := Time_warn_hi);
|
||||||
IF TON_warn_hi.Q THEN warn_hi_st := TRUE; ELSIF (Input < warn_hi - delta_warn_hi) THEN warn_hi_st := FALSE; END_IF;
|
IF TON_warn_hi.Q THEN warn_hi_st := TRUE; ELSIF (Input < warn_hi - Delta_warn_hi) THEN warn_hi_st := FALSE; END_IF;
|
||||||
|
|
||||||
normal_st := (NOT(no_signal_st) AND NOT(fail_low_st) AND NOT(warn_low_st) AND NOT(warn_hi_st) AND NOT(fail_hi_st));
|
normal_st := (NOT(TON_no_signal.Q) AND NOT(fail_low_st) AND NOT(warn_low_st) AND NOT(warn_hi_st) AND NOT(fail_hi_st));
|
||||||
|
|
||||||
IF no_signal_st THEN
|
IF no_signal_st THEN
|
||||||
Status := AnalogValueState.no_signal;
|
Status := AnalogValueState.no_signal;
|
||||||
|
|||||||
@@ -0,0 +1,66 @@
|
|||||||
|
(*
|
||||||
|
===============================================================================
|
||||||
|
Project : PLC_Library
|
||||||
|
Device : -
|
||||||
|
Path : Общие
|
||||||
|
Name : QUEUE_I16
|
||||||
|
Type : FUNCTION_BLOCK
|
||||||
|
===============================================================================
|
||||||
|
*)
|
||||||
|
|
||||||
|
FUNCTION_BLOCK QUEUE_I16
|
||||||
|
(*
|
||||||
|
Очередь FIFO на 16 элементов типа INT
|
||||||
|
*)
|
||||||
|
VAR_INPUT
|
||||||
|
Din : INT; (* Переменная для записи в очередь *)
|
||||||
|
E : BOOL := TRUE; (* Включение очереди *)
|
||||||
|
POP : BOOL; (* Извлечение из очереди *)
|
||||||
|
PUSH : BOOL; (* Добавление в очередь *)
|
||||||
|
RST : BOOL; (* Сброс *)
|
||||||
|
END_VAR
|
||||||
|
VAR_OUTPUT
|
||||||
|
Dout : INT; (* Значение, извлеченное из очереди *)
|
||||||
|
EMPTY : BOOL := TRUE;
|
||||||
|
FULL : BOOL;
|
||||||
|
END_VAR
|
||||||
|
VAR
|
||||||
|
queue : ARRAY[0..n] OF INT;
|
||||||
|
Head : INT; (* индекс чтения *)
|
||||||
|
Tail : INT; (* индекс записи *)
|
||||||
|
Count : INT; (* количество элементов *)
|
||||||
|
END_VAR
|
||||||
|
VAR CONSTANT
|
||||||
|
n : INT := 15; (* 16 элементов *)
|
||||||
|
END_VAR
|
||||||
|
(*----- IMPLEMENTATION -----*)
|
||||||
|
IF RST THEN
|
||||||
|
Head := 0;
|
||||||
|
Tail := 0;
|
||||||
|
Count := 0;
|
||||||
|
EMPTY := TRUE;
|
||||||
|
FULL := FALSE;
|
||||||
|
Dout := 0;
|
||||||
|
ELSIF E THEN
|
||||||
|
(* Извлечение *)
|
||||||
|
IF POP AND NOT EMPTY THEN
|
||||||
|
Dout := queue[Head];
|
||||||
|
Head := Head + 1;
|
||||||
|
IF Head > n THEN
|
||||||
|
Head := 0;
|
||||||
|
END_IF;
|
||||||
|
Count := Count - 1;
|
||||||
|
END_IF;
|
||||||
|
(* Добавление *)
|
||||||
|
IF PUSH AND NOT FULL THEN
|
||||||
|
queue[Tail] := Din;
|
||||||
|
Tail := Tail + 1;
|
||||||
|
IF Tail > n THEN
|
||||||
|
Tail := 0;
|
||||||
|
END_IF;
|
||||||
|
Count := Count + 1;
|
||||||
|
END_IF;
|
||||||
|
EMPTY := (Count = 0);
|
||||||
|
FULL := (Count = n + 1);
|
||||||
|
END_IF;
|
||||||
|
END_FUNCTION_BLOCK
|
||||||
Reference in New Issue
Block a user