(* =============================================================================== 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 *) time_no_signal: TIME :=T#0S; (* Выдержка времени на срабатывание no_signal *) 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; TON_no_signal: 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 -----*) 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(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(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(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(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(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; 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