Задание на создание функционального блока перезагрузки связи
Условие:
Есть два расходомера, с которых мы считываем данные по ModBus RTU.
Функциональный блок МВ_RTUuni_Master управляет обменом данных (модулем RS485). Два ФБ МВ_RTU_FС03 формируют команды на считывание данных с расходомеров, каждый со своего. При нормальном обмене данных с расходомерами выходные сигналы xBusy (только с блоков FC0З) появляются и пропадают. Была обнаружена проблема, что при потере связи, вместо появления сигнала хЕггог, у блока (с расходомером которого в момент появления проблемы были запрошены данные) бесконечно повисает сигнал xBusy в состоянии True.
Задание:
Написать собственный функциональный блок, который будет принимать два сигнала xBusy с обоих блоков FC0З и управлять двумя сигналами - xActivate у ФБ мастера (на картинке переменная MBMaster2Act) и у блоков обмена данными (DoExchange2). Причем функциональный блок изначально должен подавать сигнал True для того, чтобы обмен данными в принципе начался. А при перезагрузке - сначала перезагружать подичиненные блоки (FC0З), а затем мастер. Перезагрузку выполнять секундным выключением сигнала xActivate . Должна быть настройка времени отсутствия сигнала xBusy для инициации перезагрузки блоков.
Функциональный блок отладить в среде разработки на симуляции в RFC470.
Код самого ФБ писать на языке SТ.
Решение присылать в виде заархивированного проекта PCWorx для контроллераRFC470, подготовленный для симуляции. Ключ для активации полной версии PC WORX 6 на 30 дней: 17FF2-B1ED1-105AC-F065C-20A35-F56AA-262. Software - AX Software Suite 1.84.
Т.е. должны быть подключены переменные, которые можно изменять в ходе симуляции.
File ---> Save project as. Выбрать формат .zwt. Библиотеки не включать (снять галочку Zip User Libraries).
На оценку решения влияет:
- число строк кода;
- следование идеологии написания кода компании (на картинки сверху не обращать внимания, они были до создания стандарта);
- чистота кода, наличие достаточного (не чрезмерного) количества комментариев;
Текст Задания PDF
Решение
ФБ CheckErrors
MBmaster2Act:=TRUE;
DoExchange2:=TRUE;
TimerErr(IN:=FC03_01_xBusy OR FC03_02_xBusy AND (NOT flag),PT:=TimeError);
IF TimerErr.Q THEN
flag1:=TRUE;
else flag1:=FALSE;
END_IF;
IF NOT (MBmaster2Act and (FC03_01_xBusy OR FC03_02_xBusy)) THEN flag2:=TRUE;
else flag2:=false;
END_IF;
flag := flag1 and flag2;
TimerResetFC03(IN:=flag,PT:=t1);
TimerResetMB_RTU(IN:=flag,PT:=t2);
DoExchange2:=NOT TimerResetFC03.Q;
IF DoExchange2 AND TimerResetMB_RTU.Q then
MBmaster2Act:= NOT TimerResetMB_RTU.Q;
END_IF;
Скачать решение |