PDA

Просмотр полной версии : Как реализовать ошибку связи по Modbus?



Lyohin
24.03.2015, 15:04
Есть СПК207, 8 модулей ввода-вывода. Программа работает и опрашивает все модули по протоколу Modbus. Не знаю, как правильно реализовать ошибку связи с модулями. Ведь если нет связи, то это уже аварийная ситуация. Пользуюсь шаблонами в библиотеке Mx110 Assistant.

Sepsis
02.04.2015, 10:13
Тоже интересно, если у драйверов Modbus в CoDeSys'е служебные биты для диагностики. По-моему есть, я где-то видел, на одном из видео...
В любом случае, кустарно реализовать Heartbeat несложно. К примеру, у каждого модуля в/в ОВЕНа доступен для чтения регистр 'Addr' - хранящий, соответственно, адрес модуля в сети. Каждый цикл читаете этот регистр во внутреннюю переменную, сравниваете с нулем, обнуляете переменную. Если до обнуления переменная и была равна нулю - значит модуль выпал из сети. :D

vnkorol
08.04.2015, 08:48
Вам надо контролировать, есть ли связь с модулем?

Ставим библиотеку IoDrvModbus и пользуемся переменными:
название_модуля_в_проекте.Xerror - бульная переменная, true, когда ошибка связи

еще есть название_мастерпорта.xAllSlavesOk - тут наоборот, пока связь со всеми модулями есть - true

Еще можно использовать таймеры, чтобы на кратковременное пропадание связи не реагировать.

У меня вот так:

VAR
timer_trm138:TON;
timer_mdvv:TON;
timer_kms:TON;
timer_alldevices:TOF;
END_VAR


timer_trm138(IN:=TRM138.xError, PT:=T#5S, ET:=, Q=>trm138_connection_error);
timer_mdvv(IN:=MDVV.xError, PT:=T#5S, ET:=, Q=>mdvv_connection_error);
timer_kms(IN:=KMS.xError, PT:=T#5S, ET:=, Q=>kms_connection_error);
timer_alldevices(IN:=Modbus_Master_COM_Port.xAllSl avesOk, PT:=T#10S, ET:=, Q=>alldevices_connection_ok);

Lyohin
08.04.2015, 13:04
Так и сделал (переменная x.Error), все работает, обрыв связи определяется. Спасибо!

Эдуард_Н
09.04.2015, 08:49
Примеры можете выложить? Желательно в CFC.

vnkorol
09.04.2015, 16:15
Примеры можете выложить?

http://www.owen.ru/forum/showthread.php?t=20849&p=167399&viewfull=1#post167399