Modbus контроль ошибок соединения
Допустим к ПЛК подключен МВА8. Связь сконфигурирована в CoDeSys PLC-configuration как Modbus(master) RS-485 - MVA8
Вот ПЛК отправляет запрос, а ответа, допустим, нет. Нет секунду, нет минуту, нет час. И чего будет?
Если ничего не будет, так будет совсем плохо. Не уж то всё писать через SysLibCom?
Готовое решение. Бери и используй. Анализ ошибок на RS-485.
Берем мою разработку за основу. Я ее успешно внедрил уже на нескольких объектах, в том числе и на котельной.
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;
Все гениальное просто.