Files
PLC_Library/plc_src/POU/Общие/STATUS_ANALOG_M_I.st
T

99 lines
5.0 KiB
Smalltalk
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
(*
===============================================================================
Project : PLC_Library
Device : -
Path : Общие
Name : STATUS_ANALOG_M_I
Type : FUNCTION_BLOCK
===============================================================================
*)
FUNCTION_BLOCK STATUS_ANALOG_M_I
(*
Модуль формирования статуса
Гистерезис по отключению и задержка по включению, вход типа INT
-1 - нет связи с датчиком
0 - не определено
1 - норма
2 - предупредительный по нижнему уровню
3 - аварийный по нижнему уровню
4 - предупредительный по верхнему уровню,
5 - аварийный по верхнему уровню
*)
VAR_INPUT
Input: INT; (* Контролируемое значение *)
fail_hi: INT:=32767; (* Порог аварии по верхнему уровню *)
delta_fail_hi: INT := 0; (* Гистерезис возврата из fail_hi (снятие при Input < fail_hi - delta_fail_hi) *)
time_fail_hi: TIME :=t#0s; (* Выдержка времени на срабатывание fail_hi *)
warn_hi: INT:=32767; (* Порог предупреждения по верхнему уровню *)
delta_warn_hi: INT := 0; (* Гистерезис возврата из warn_hi *)
time_warn_hi: TIME :=t#0s; (* Выдержка времени на срабатывание warn_hi *)
warn_low: INT:=-32768; (* Порог предупреждения по нижнему уровню *)
delta_warn_low: INT := 0; (* Гистерезис возврата из warn_low *)
time_warn_low: TIME :=t#0s; (* Выдержка времени на срабатывание warn_low *)
fail_low: INT:=-32768; (* Порог аварии по нижнему уровню *)
delta_fail_low: INT := 0; (* Гистерезис возврата из fail_low *)
time_fail_low: TIME :=t#0s; (* Выдержка времени на срабатывание fail_low *)
no_signal: INT:=-32768; (* Порог отсутствия связи с датчиком *)
delta_no_signal: INT := 0; (* Гистерезис возврата из no_signal *)
time_no_signal: TIME :=T#0S; (* Выдержка времени на срабатывание no_signal *)
In_fail_hi: BOOL := FALSE; (* Принудительная установка статуса fail_hi извне *)
In_warn_hi: BOOL := FALSE; (* Принудительная установка статуса warn_hi извне *)
In_warn_low: BOOL := FALSE; (* Принудительная установка статуса warn_low извне *)
In_fail_low: BOOL := FALSE; (* Принудительная установка статуса fail_low извне *)
In_no_signal: BOOL := FALSE; (* Принудительная установка статуса no_signal извне *)
END_VAR
VAR_OUTPUT
Status: AnalogValueState; (* Итоговый статус аналогового значения *)
END_VAR
VAR
fail_hi_st: BOOL;
warn_hi_st: BOOL;
normal_st: BOOL;
warn_low_st: BOOL;
fail_low_st: BOOL;
no_signal_st: BOOL;
TON_fail_hi: TON;
TON_warn_hi: TON;
TON_warn_low: TON;
TON_fail_low: TON;
TON_no_signal: TON;
END_VAR
(*----- IMPLEMENTATION -----*)
TON_no_signal(IN := (Input <= no_signal) OR In_no_signal, PT := time_no_signal);
IF TON_no_signal.Q THEN no_signal_st := TRUE; ELSIF (Input > no_signal + delta_no_signal) THEN no_signal_st := FALSE; END_IF;
TON_fail_low(IN := ((Input <= fail_low) AND NOT(no_signal_st)) OR In_fail_low, 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)) OR In_warn_low, 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)) OR In_fail_hi, 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)) OR In_warn_hi, 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