PDA

Просмотр полной версии : ПЛК200 и модули Мх110 по Modbus RTU



permoby
04.07.2023, 19:48
Имеется конфигурация - один ПЛК200-01 и десять модулей МВ110-32ДН, подключенные по линии RS-485. Обмен ПЛК с модулями реализован по протоколу Modbus RTU (скорость 115200 бод, формат 8N1) на основе библиотек OwenCommunication (COM_Control, MB_SerialRequest). Программа ПЛК производит запрос только битовой маски входов из двух регистров (32bit) каждого модуля. Функция обмена вынесена в отдельную задачу с временем цикла 1мс. Итоговый период опроса всех модулей составляет ~160мс. Можно попробовать посчитать теоретическое время цикла (без учета вспомогательных бит обмена): скорость линии - 115200 бод = 11520 байт/с, пакет запроса - 8 байт, пакет ответа - 9 байт, задержка ответа модуля - 2мс, время цикла ПЛК 1мс, время между фреймами (по стандарту > 0.143мс) пусть 2мс, получается время цикла опроса = (8 байт + 9 байт) / 11520 байт/с + 0,002 с + 0,001 с + 0,002 с = 0,00648 секунды * 10 модулей = 65 мс, что далеко от реальности.
Почему фактическое время цикла намного больше расчётное и как его уменьшить?

Евгений Кислов
04.07.2023, 20:02
Почему фактическое время цикла больше расчётного

1. MB_SerialRequest выполняется в течение нескольких циклов контроллера - он асинхронный.
2. Интервал задачи в 1 мс может быть недостижим для вашего проекта + надо учитывать джиттер - см. информацию онлайн-мониторинга конфигурации задач.
3. Задержка ответа модуля (rs.dl) может отрабатываться им с погрешностью.

Всё это в сумме прибавит еще пару десятков миллисекунд к расчетным значениям.


как его уменьшить?

Навскидку два варианта:
1. https://owen.ru/forum/showthread.php?t=23897&p=410365&viewfull=1#post410365 (IoDrvModbus.ModbusRequest2)
2. Использовать библиотеки SysCom - она предоставляет синхронные функции для работы с COM-портом.
Потребуется поверх нее реализовать нужную вам часть спецификации Modbus (или захардкодить запросы и разбор ответов, если это приемлемо в рамках вашей задачи).

permoby
05.07.2023, 13:28
Для чистоты эксперимента исключил из работы все задачи, кроме обмена по Modbus RTU, в результате максимальное время цикла 302 мкс, среднее 33 мкс, максимальный джиттер 203 мкс. В данной конфигурации время цикла обмена с модулями чуть уменьшилось до ~140мс. При задании tTimeout функции обмена меньше 15мс начинают появляться ошибки, что соответствует ~160мс/10модулей. Евгений, у вас есть возможность в лабораторных условиях проверить время задержки ответа от модулей МВ110-32ДН?
Попробовал использовать функцию IoDrvModbus.ModbusRequest2, но результат стал только хуже - начали сыпать ошибки UNDEFINED (The request’s result is undefined or not yet known, e.g. initial state). Изменение параметра uiSendTimeout (в диапазоне 0-100) на количество ошибок особо не повлияло. Возможно я неправильно использую эту функцию (мой код во вложении).

Евгений Кислов
05.07.2023, 13:44
Евгений, у вас есть возможность в лабораторных условиях проверить время задержки ответа от модулей МВ110-32ДН?

В данный момент возможности нет.
Но в целом:
- Modbus RTU - это не протокол реального времени
- "ускорение" обмена никогда не являлось одной из задач библиотеки OwenCommunication

Если в рамках вашей системы текущий достигнутый период опроса (~140-160 мс) десятка модулей является неприемлемо высоким - то, на мой взгляд, вам следует выбрать другое оборудование для решения вашей задачи.