Почемуто у меня рассылка не пришла на видео главу 2 и главу три.. а я неделю жду прям измаялся продолжеения на обучение. На кодесис.РФ трудно оринтероваться где посмотреть бывшие главы, и перемсотреть видео. ((((((
Вид для печати
Почемуто у меня рассылка не пришла на видео главу 2 и главу три.. а я неделю жду прям измаялся продолжеения на обучение. На кодесис.РФ трудно оринтероваться где посмотреть бывшие главы, и перемсотреть видео. ((((((
Для обсуждения книги создал отдельную тему:
http://www.owen.ru/forum/showthread....1337#post91337
В программу встроен декрементный счетчик CTD который не работает. Где ошибка подскажите?
Вход LOAD не задействован.
Здравствуйте!
ПЛК считывает информацию с нескольких устройств по модбас. В конфигурации ПЛК есть один мастер сети, и все устройства описаны как универсальные устройства.
Если, к примеру, одно из устройств перестанет отвечать, как обнаружить, с которым из них произошел сбой связи? Ведь если следующее ответит, то переменная Last Error установится в ноль.
Или нужно каждый цикл ПЛК читать эту переменную, и если она не равна нулю, тогда Last Address даст нам адрес этого устройства?
Правильно я думаю, или ошибаюсь ?
upd
Сомнения собственно в чем - За один цикл контроллера идет опрос только одного устройства? Или сколько получится ?
Здравствуйте!
Время опроса устройств при настройке через конфигурацию к времени цикла не привязано, опрос выполняется в фоновом режиме и зависит от времени выставленном в параметре polling time (подэлмент Universal ModBus Device).
я сделал например вот так. но еще не тестил на стенде. Если найдете ошибку - поправьте.
IF LAST485ADR=12 AND LAST485ERR=81 THEN TIMER_MZD2(IN:=TRUE, PT:=T#1500ms);
ELSE MZD2_CON_ERR:=FALSE;
END_IF;
TIMER_MZD2();
MZD2_CON_ERR:=TIMER_MZD2.Q;
псевдокод: если последний адрес и последний код ошибки равны соответственно 12(адрес вашего устройства) и 81(код ошибки "нет связи"), то запустить таймер TON. Если по прошествии заданного времени PT условие продолжает фиксировать "LAST485ADR=12 AND LAST485ERR=81" То таймер дойдет до конца, выставит выход в true и переменной отвечающей за ошибку связи вашего модуля установится выходное значение таймера. В противном случае (если фиксируется сочитание отличное от заданного условия) переменная ошибки выставляется в FALSE. получается что у вас ничего не затирается и ошибка если есть пишется в спец.переменную
...но при выполнении следующей строки программы безусловным образом заменится на действующее значение TIMER_MZD2.Q.Цитата:
В противном случае (если фиксируется сочитание отличное от заданного условия) переменная ошибки выставляется в FALSE.
Вот такой вариант "на скорую руку", вроде бы, должен работать правильно:
IF LAST485ADR=12 AND LAST485ERR=81 THEN
ERR_ADR12:=TRUE;
END_IF;
IF LAST485ADR=12 AND LAST485ERR=0 THEN
ERR_ADR12:=FALSE;
END_IF;
TIMER_MZD2(IN:=ERR_ADR12, PT:=T#1500ms);
MZD2_CON_ERR:=TIMER_MZD2.Q;
Вместо булевской переменной ERR_ADR12 можно использовать SR-триггер, смысл от этого не изменится.
Лаконичнее надо.Не первый раз натыкаюсь на индусский код с булевыми на этом форуме. Народ зачем-то городит ветвления ифами и сравнивает булевые переменные с тру и фолс. Как-то так:Код:TIMER_MZD2(IN := LAST485ADR = 12 AND LAST485ERR = 81, PT := T#1500ms, Q => MZD2_CON_ERR)
И это вместо TIMER(IN := NOT X).Код:IF X = TRUE THEN
Y := FALSE;
END_IF
IF X = FALSE THEN
Y := TRUE;
END_IF
TIMER(IN := Y);