This is topic таймаут на ожидание ответа по MODBUS TCP in forum TRACE MODE 6 бесплатная Базовая версия / TRACE MODE 6 free Base version at Форум TRACE MODE: техническая поддержка.
Здравствуйте! Можно ли как-то уменьшить таймаут на ожидание ответа от контроллера по MODBUS TCP?
Просто приходится опрашивать 15 устройств по 7 регистров в каждом, так вот если какого-то устройства в сети MODBUS нету то Узел RTM начинает висеть где-то по 1сек на каждом регистре, а это значит что задержка отображения данных в реальном времени равна 7*N сек (N - число выключенных устройств). Опрос сети MODBUS идет через MOXA, у нее мы выставили таймаут в 100мс так что скорее всего это TM ждет ответа, прежде чем посылать следующий запрос.
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Запросы по Modbus TCP посылаются только при наличии коннекта к соответствующему устройству. Возможно, в используемом преобразователе существует настройка, по которой он должен разорвать коннект МРВ к соответствующему устройству. В этом случае запросы к устройству посылаться не будут. Возможно, существуют настройки преобразователя, по которым он без задержки будет эмулировать ответ с сообщением об ошибке. В этом случае не будет ожидания ответа и не будет описанного Вами эффекта. Проверить, как ведет себя преобразователь в этой ситуации можно, если МРВ запустить с ключом DEBUG=400 в файле конфигурирования запуска узла TMcom_<ordinal>.cnf. Если никаких дополнительных настроек в преобразователе найти не удастся, в случае отсутствия какого-либо устройства надо отключать каналы, которые осуществляют с ним обмен. И подключать их тогда, когда станет известно о наличии устройства в сети. Обнаружить отсутствие устройства можно программным образом, анализируя атрибуты недостоверность соответствующих каналов.
Posted by Sheon (Участник № / Member № 5164) on :
Я попробовал запустить проект сконфигурировав его на отладку DEBUG=400 как вы посоветовали. Он мне выдал сообщения, для всех каналов привязанных к MODBUS TCP тегам не работающих устройств, следующего характера: (<время>) ERR_TCP:Modbus recieve zero bytes from <IP адрес> <имя канала> (причем интервал между ними приблизительно секунда, ну может чуть меньше). Не совсем понятно что это означает: то, что TM так и не дождался вообще никакого ответа от преобразователя, или все-таки ответ был, но нулевой (пустое сообщение по протоколу TCP). Если это первый случай, то это не соответствует истине, т.к. мы проверяли с помощью программы CommView иторию обмена между компьютером, на котором работает узел, и моксой, и было видно что она отвечает практически сразу же, даже если устройство с определенным адресом в сети MODBUS обнаружено не было.
По поводу программного отключения каналов... Как это реализовать я представляю в принципе, мне не понятен один момент: Ну допустим по атрибуту недостоверности я определю, что устройства нет и отключу канал, тем самым прекращу опрос соответствующего устройства, а как же я тогда узнаю что устройство появилось, ведь его опрос не ведется? Или при проверке бита достоверности в отдельном потоке посылается некоторая команда о запросе состояния связанного с этим каналом устройства?
И еще вопрос не касающийся MODBUS TCP. Запись в СПАД архив производится по изменению значения канала, а нельзя ли как-нибудь осуществить запись с определенной периодичностью (пусть даже только по изменению значения, но, допустим, не чаще чем раз в 30 сек)? Просто писать надо параметры с быстро изменяющимся значением в реальном времени (например температуры, изменения незначительны, но часты) ну и естественно архив забивается очень быстро, да и буфер тренда надо выделить сильно большой, чтобы отобразить данные за последние двое суток. Но при этом отображать данные на ГЭ надо в реальном времени с заданным циклом пересчета. В одной из тем (http://forum.adastra.ru/cgi-bin/ultimatebb.cgi/ubb/get_topic/f/32/t/000322.html?#000000 пост 5) вы посоветовали, как я понял, увеличить период пересчета, но разве в этом случае отображаемые на ГЭ данные не будут обновляться синхронно с записью в СПАД(т.е. раз в 30 сек)?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Сообщение (<время>) ERR_TCP:Modbus recieve zero bytes from <IP адрес> <имя канала> означает, что за время таймаута (около 1 с.) ответ получен не был. Если какое-то устройство не работает, то должны быть приняты меры по восстановлению его работоспособности и соответствующее оповещение персонала. Когда оператор получит соответствующее подтверждение, он включит обмен по этому устройству. Если организация обслуживания оборудования таких уведомлений не предусматривает, придется программным путем с некоторым периодом кратковременно включать хотя бы 1 канал обмена с данным устройством для проверки работоспособности устройства. Автоматически повторяется только запрос коннекта, если он потерян.
Можно ввести в канале процедуру трансляции, которая будет обновлять РЕАЛЬНОЕ значение в канале с нужным Вам периодом. С этим периодом и будет осуществляться архивирование параметра. А для остальных процедур реального времени можно использовать АППАРАТНОЕ значение канала.