Берем мою разработку за основу. Я ее успешно внедрил уже на нескольких объектах, в том числе и на котельной.
1) Делаем ФБ
Область объявления:
Код:
FUNCTION_BLOCK Get_Modules_Errors
VAR_INPUT
err:WORD;
END_VAR
VAR_OUTPUT
stat:BOOL:=0;
END_VAR
VAR
rt: R_TRIG;
tim_err: TIME := T#5s;
t: TON;
END_VAR
Тело ФБ:
Код:
(*Тригер прихода ошибки*)
rt(CLK:=WORD_TO_BOOL(err));
(*Если пришла ошибка, запускаем таймер*)
IF rt.Q THEN
t(IN:=TRUE , PT:=tim_err);
END_IF
(*Вызываем таймер*)
t;
(*Если таймер не запущен и ошибки нет, то аварии нет*)
IF t.IN=FALSE AND err=0 THEN
stat:=FALSE;
END_IF
(*Если таймер запущен, а ошибка ушла, то была помеха, отключаем аварию и таймер*)
IF t.IN AND err=0 THEN
t(IN:=FALSE , PT:=tim_err);
stat:=FALSE;
END_IF
(*Если таймер отработал, а ошибка не ушла - беда, ищем ваши гвозди ))) *)
IF t.Q THEN
stat:=TRUE;
t(IN:=FALSE , PT:=tim_err);
END_IF
RETURN;
В основной программе делаем следующее:
Область объявления:
Код:
PROGRAM PLC_PRG
VAR
(*Обработка гвоздей, грызунов, монтажников, и солнечного затмения*)
er_32: Get_Modules_Errors;
er_48: Get_Modules_Errors;
er_64: Get_Modules_Errors;
er_80: Get_Modules_Errors;
er_112:Get_Modules_Errors;
(*Каждому модулю даем свою ошибку*)
mod_32:BOOL:=0;
mod_48:BOOL:=0;
mod_64:BOOL:=0;
mod_80:BOOL:=0;
mod_112:BOOL:=0;
END_VAR
В теле пишем следующее:
Код:
CASE Last_adr OF
32:
er_32(err:=Last_err , stat=> mod_32);
48:
er_48(err:=Last_err , stat=> mod_48);
64:
er_64(err:=Last_err , stat=> mod_64);
80:
er_80(err:=Last_err , stat=> mod_80);
112:
er_112(err:=Last_err , stat=> mod_112);
END_CASE;
Все гениальное просто.