diff --git a/PLC_Library.library b/PLC_Library.library index 6a696e0..4889938 100644 Binary files a/PLC_Library.library and b/PLC_Library.library differ diff --git a/plc_src/POU/Fastwel/AIM725_Status.st b/plc_src/POU/Fastwel/AIM725_Status.st index ec8a50e..905af8f 100644 --- a/plc_src/POU/Fastwel/AIM725_Status.st +++ b/plc_src/POU/Fastwel/AIM725_Status.st @@ -34,7 +34,8 @@ VAR_INPUT time_warn_low: TIME :=t#0s; (* Выдержка времени на срабатывание warn_low *) fail_low: REAL:=-3.402823466E+38; (* Порог аварии по нижнему уровню *) 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; (* Байт статуса модуля АЦП (биты диагностики по каналам) *) Chanel_num: BYTE; (* Номер канала модуля (1 или 2), определяет какие биты Modul_status проверяются *) END_VAR @@ -47,6 +48,7 @@ VAR TON_warn_hi: TON; TON_warn_low: TON; TON_fail_low: TON; + TON_no_signal: TON; fail_hi_st: BOOL; warn_hi_st: BOOL; normal_st: BOOL; @@ -55,22 +57,22 @@ VAR no_signal_st: BOOL; END_VAR (*----- 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); -IF no_signal_st THEN T_mod := - INT#500; ELSE T_mod := REAL_TO_INT(Input); END_IF; +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 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); -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_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; -TON_warn_low(IN := ((Input <= warn_low) AND NOT(no_signal_st) 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; +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; -TON_fail_hi(IN := ((Input >= fail_hi) AND NOT(no_signal_st)), 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; +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; -TON_warn_hi(IN := ((Input >= warn_hi) AND NOT(no_signal_st) 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; +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; -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 Status := AnalogValueState.no_signal; diff --git a/plc_src/POU/Общие/QUEUE_I16.st b/plc_src/POU/Общие/QUEUE_I16.st new file mode 100644 index 0000000..7fda3ec --- /dev/null +++ b/plc_src/POU/Общие/QUEUE_I16.st @@ -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