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

103 lines
3.5 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
Exported : 2026-07-31 11:16:16
===============================================================================
*)
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;
time_fail_hi: TIME :=t#0s;
warn_hi: INT:=32767;
delta_warn_hi: INT := 0;
time_warn_hi: TIME :=t#0s;
warn_low: INT:=-32768;
delta_warn_low: INT := 0;
time_warn_low: TIME :=t#0s;
fail_low: INT:=-32768;
delta_fail_low: INT := 0;
time_fail_low: TIME :=t#0s;
no_signal: INT:=-32768;
delta_no_signal: INT := 0;
time_no_signal: TIME :=T#0S;
In_fail_hi: BOOL := FALSE;
In_warn_hi: BOOL := FALSE;
In_warn_low: BOOL := FALSE;
In_fail_low: BOOL := FALSE;
In_no_signal: BOOL := FALSE;
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