91 lines
4.5 KiB
Smalltalk
91 lines
4.5 KiB
Smalltalk
(*
|
||
===============================================================================
|
||
Project : PLC_Library
|
||
Device : -
|
||
Path : Fastwel
|
||
Name : AIM725_Status
|
||
Type : FUNCTION_BLOCK
|
||
===============================================================================
|
||
*)
|
||
|
||
FUNCTION_BLOCK AIM725_Status
|
||
(*
|
||
Модуль формирования статуса
|
||
Гистерезис по отключению и задержка по включению
|
||
|
||
-1 - нет связи с датчиком
|
||
0 - не определено
|
||
1 - норма
|
||
2 - предупредительный по нижнему уровню
|
||
3 - аварийный по нижнему уровню
|
||
4 - предупредительный по верхнему уровню,
|
||
5 - аварийный по верхнему уровню
|
||
*)
|
||
VAR_INPUT
|
||
Input: REAL; (* Контролируемое значение *)
|
||
fail_hi: REAL:=3.402823466E+38; (* Порог аварии по верхнему уровню *)
|
||
delta_fail_hi: REAL := 0; (* Гистерезис возврата из fail_hi *)
|
||
time_fail_hi: TIME :=t#0s; (* Выдержка времени на срабатывание fail_hi *)
|
||
warn_hi: REAL:=3.402823466E+38; (* Порог предупреждения по верхнему уровню *)
|
||
delta_warn_hi: REAL := 0; (* Гистерезис возврата из warn_hi *)
|
||
time_warn_hi: TIME :=t#0s; (* Выдержка времени на срабатывание warn_hi *)
|
||
warn_low: REAL:=-3.402823466E+38; (* Порог предупреждения по нижнему уровню *)
|
||
delta_warn_low: REAL := 0; (* Гистерезис возврата из warn_low *)
|
||
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 *)
|
||
Modul_status: BYTE; (* Байт статуса модуля АЦП (биты диагностики по каналам) *)
|
||
Chanel_num: BYTE; (* Номер канала модуля (1 или 2), определяет какие биты Modul_status проверяются *)
|
||
END_VAR
|
||
VAR_OUTPUT
|
||
Status: AnalogValueState; (* Итоговый статус аналогового значения *)
|
||
T_mod: INT; (* Значение Input, приведенное к INT; -500 при отсутствии связи (no_signal) *)
|
||
END_VAR
|
||
VAR
|
||
TON_fail_hi: TON;
|
||
TON_warn_hi: TON;
|
||
TON_warn_low: TON;
|
||
TON_fail_low: TON;
|
||
fail_hi_st: BOOL;
|
||
warn_hi_st: BOOL;
|
||
normal_st: BOOL;
|
||
warn_low_st: BOOL;
|
||
fail_low_st: BOOL;
|
||
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_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_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_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_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;
|
||
|
||
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));
|
||
|
||
IF no_signal_st THEN
|
||
Status := AnalogValueState.no_signal;
|
||
ELSIF fail_hi_st THEN
|
||
Status := AnalogValueState.fail_hi;
|
||
ELSIF fail_low_st THEN
|
||
Status := AnalogValueState.fail_low;
|
||
ELSIF warn_hi_st THEN
|
||
Status := AnalogValueState.warn_hi;
|
||
ELSIF warn_low_st THEN
|
||
Status := AnalogValueState.warn_low;
|
||
ELSIF normal_st THEN
|
||
Status := AnalogValueState.normal;
|
||
ELSE
|
||
Status := AnalogValueState.undefined;
|
||
END_IF;
|
||
END_FUNCTION_BLOCK
|