Скорость обновления данных по Modbus зависит от нескольких неочевидных параметров. На стадии проектирования возникает проблема, как оценить скорость будущей интерфейсной линии. В этой статье рассмотрим факторы, влияющие на скорость обновления данных по Modbus RTU, сделаем несколько типовых расчётов, а в конце статьи будет ссылка на web калькулятор скорости работы Modbus RTU линии.


Modbus всё ещё остаётся самым распространённым протоколом связи промышленного оборудования. Описание протокола и причины его распространённости можно найти во множестве статей, например тут. Далее подразумевается, что вы знакомы с основами работы протокола.

Мы будем рассматривать Modbus RTU, но полученные выводы будут частично применимы и к Modbus TCP.

Чтобы рассчитать скорость, начнём с рассмотрения физического протокола (1й уровень модели OSI). Modbus RTU использует физический интерфейс RS-485, RS-422 или RS-232(последний практически не используется для Modbus). Для передачи сигнала данные интерфейсы используют UART (Universal Asynchronous Receiver-Transmitter). Подробнее про UART можно прочитать тут.

Стандартная посылка UART состоит из:

  1. стартовый бит ($inline$start\_bit$inline$) 1 бит
  2. полезные данные ($inline$data$inline$) 7-8 бит
  3. бит чётности ($inline$parity\_bit$inline$) 0-1 бит
  4. стоповый бит ($inline$stop\_bit$inline$) 1-2 бит

То есть на каждые 7-8 бит полезных данных передается 2-4 вспомогательных бита. Скорость передачи полезных данных ($inline$V_{data}$inline$) будет ниже скорости работы интерфейса ($inline$V_{uart}$inline$). Вычислить $inline$V_{data}$inline$ можно по формуле:

$$display$$V_{data} = \frac{V_{uart} * data}{start\_bit + data + parity\_bit + stop\_bit}$$display$$



Далее необходимо разобраться как Modbus мастер общается с подчинёнными устройствами на канальном уровне (2й уровень модели OSI). В силу особенности физического интерфейса устройства подключенные к линии передают данные последовательно, то есть только одно устройство в текущий момент времени может слать данные. Из-за этого общение мастера с подчинёнными устройствами происходит циклически, последовательно читая и записывая регистры в подчиненные устройства. Полный цикл чтения регистров из подчиненного устройства будет выглядеть следующим образом:

  1. задержка (минимум 3.5 символа = 28 бит, ниже пересчитаем в секунды)
  2. передача запроса на чтение (8 байт)
  3. задержка ответа ведомого устройства (минимум 28 бит, часто это десятки миллисекунд на формирование ответной посылки)
  4. передача ведомым устройством ответной посылки (максимум 256 байт для Modbus RTU).

Некоторые инженеры выбирают четырехпроводную версию интерфейса, надеясь на ускорение передачи (подразумевая параллельную пересылку данных на приём и передачу). Очевидно это решение не работает. Последовательность посылки данных будет одинаковой для 2х и 4х — проводных линий.

Рассчитаем время, затрачиваемое на полный цикл чтения 125ти holding registers (максимальное количество для Modbus RTU) при следующих параметрах линии:

Формат кадра: 8N1 (8 data bit, no parity bit, 1 stop bit)
Скорость uart: $inline$V_{uart}$inline$ = 19200 bit/s
Скорость передачи полезных данных: $inline$V_{data}$inline$ = 15360 bit/s
Задержка мастера: $inline$master\_silence$inline$ = 28 bit / $inline$V_{uart}$inline$ (это минимально допустимая задержка, обычно больше)
Задержка ответа ведомого устройства: $inline$slave\_silence$inline$ = 0.04 s (значение зависит от ведомого устройства)
Посылка с запросом 125ти holding registers: 8 byte или 64 bit
Ответ со 125ю holding registers: 256 byte или 2048 bit

Формула для расчёта времени цикла чтения:

$$display$$T_{cycle} = silence\_master + 64 bit / V_{data} + slave\_silence + 2048 bit / V_{data} = 0.179 s$$display$$



Последовательность на запись регистров практически идентична. Размер посылки мастера будет больше, т.к. включает в себя информацию о записываемых регистрах. Подтверждение удачной записи от ведомого устройства будет 8 байт.

По спецификации Modbus к линии RS-485/422 можно подключить 32 ведомых устройства. Опрос ведомых устройств так же ведётся последовательно, обычно по кругу. Чтобы понять с какой скорость будут обновляться данные от $inline$N$inline$ ведомых устройств, надо умножить $inline$T_{cycle}$inline$ на $inline$N$inline$ Назовем это полным временем обновления $inline$T_{full}$inline$.
Несколько расчётов $inline$T_{full}$inline$ (читаем и записываем максимальное количество holding registers) при различных параметрах связи:
Формат кадра: 8N1, $inline$V_{uart}$inline$ = 19200 bit/s, Количество ведомых устройств, $inline$N$inline$ = 16
$inline$T_{full}$inline$ = 5.727 s
Формат кадра: 8N1, $inline$V_{uart}$inline$ = 9600 bit/s, Количество ведомых устройств, $inline$N$inline$ = 16
$inline$T_{full}$inline$ = 10.173 s
Формат кадра: 7E1, $inline$V_{uart}$inline$ = 19200 bit/s, Количество ведомых устройств, $inline$N$inline$ = 16
$inline$T_{full}$inline$ = 6.355 s
Формат кадра: 8N1, $inline$V_{uart}$inline$ = 19200 bit/s, Количество ведомых устройств, $inline$N$inline$ = 2
$inline$T_{full}$inline$ = 0.716 s

Как видно формат кадра влияет на время обновления данных, но не сильно. Значительно влияет скорость передачи данных, но в нашем примере мы передаём максимальное количество регистров, в реальных проектах этот фактор может быть не столь значителен. Сильнее всего на скорость обновления данных влияет количество ведомых устройств.

Для упрощения расчётов мы сделали web приложение для оценочного расчета времени обновления данных по Modbus