Т2 Протоколы Modbus TCP и MQTT в АСУ ТП
Протоколы Modbus

Modbus был представлен в 1979 году компанией Modicon (ныне Schneider Electric). Это был открытый стандарт, работающий по интерфейсу RS-232. Позже появилась реализации протокола для интерфейсов RS-485 и Modbus TCP. Протокол быстро набрал популярность, и многие производители стали внедрять его в своих устройствах.
Функции:
| Код | Функция | Значение |
|---|---|---|
| 1 (0x01) | Чтение DO | Дискр |
| 2 (0x01) | Чтение DI | Дискр |
| 3 (0x01) | Чтение AO | 16 бит |
| 4 (0x01) | Чтение AI | 16 бит |
| 5 (0x01) | Запись одного DO | Дискр |
| 6 (0x01) | Запись одного AO | 16 бит |
| 15 (0x01) | Запись нескольких DO | Дискр |
| 16 (0x01) | Запись нескольких AO | 16 бит |
Modbus ASCII
В режиме ASCII каждый байт данных передается в виде двух ASCII-символов, что делает трафик удобочитаемым для человека, но менее эффективным, чем Modbus RTU.
Формат сообщения:
| Часть кадра | Символы ASCII | Описание |
|---|---|---|
| Начало | : (двоеточие) | Start — сигнализирует начало кадра (1 байт, 0x3A) |
| Адрес | 2 символа | Адрес ведомого устройства (Slave ID) |
| Функция | 2 символа | Код функции Modbus (например, 03 — чтение регистров) |
| Данные | N x 2 символа | Полезная нагрузка сообщения |
| Контрольная сумма LRC | 2 символа | Вычисляется для проверки целостности данных |
| Конец | CR LF | Конец кадра — пара символов 0x0D (возврат каретки) и 0x0A (перевод строки) |
Пример запроса:
Прочитать 2 регистра хранения AO, начиная с адреса 40001 (смещение 0 в протоколе), адрес устройства 1.
| Начало | Адрес | Функция | Данные | Контрольная сумма | Конец |
|---|---|---|---|---|---|
| : | 01 | 03 | 00 00 00 02 | FA | CR LF |
Особенности:
- применим в интерфейсах RS-232, RS-422, RS-485
- может быть более удобен в случаях необходимости отладки
- используется в качестве атавизма
- для передачи одного и того же смысла требуется больше данных = ниже пропускная способность
- может стать хорошей альтернативой Modbus RTU на линиях с сетевыми задержками и оборудовании с менее точными таймерами
-
Modbus RTU
| Часть кадра | Символы ASCII | Описание |
|---|---|---|
| Адрес | 2 символа | Адрес ведомого устройства (Slave ID) |
| Функция | 2 символа | Код функции Modbus (например, 03 — чтение регистров) |
| Данные | N x 2 символа | Полезная нагрузка сообщения |
| Контрольная сумма CRC | 2 символа | Ыычисляется для проверки целостности данных |
Пример запроса:
Прочитать 3 регистра хранения AO, начиная с адреса 40108, адрес устройства 17.
| Адрес | Функция | Данные | Контрольная сумма |
|---|---|---|---|
| 11 | 03 | 00 6B 00 03 | 7687 |
Важная особенность Modbus RTU в том, что для разделения пакетов должны использоваться временные паузы продолжительностью не менее чем произведение 3,5 * t, где t — время передачи одного байта в текущей сети. А передача байтов данных в пределах одного пакета производится последовательно с промежутком времени между соседними байтами не более 1,5 * t, иначе передача будет считаться ложной. Эти правила не дают использовать Modbus RTU в медленных, например модемных, сетях.
Особенности:
- применим в интерфейсах RS-232, RS-422, RS-485
- имеет большую пропускную способность по сравнению с ASCII
Modbus TCP
Это реализация ModBus в сетях Ethernet. Работает поверх TCP/IP стека. Адрес в пакете в этом случае игнорируется и адресом служит ip:port в сети TCP/IP. Целостность пакетов реализована замечательно на уровне TCP, поэтому никаких дополнительных проверок, присущих RTU/ASCII, нет.
| Часть кадра | Символы ASCII | Описание |
|---|---|---|
| MBAP | ||
| ID транзакции | 2 байта | Идентификатор запроса |
| ID протокола | 2 байта | Всегда 00 00 |
| Длина остатка пакета | 2 байта | Идентифицируют число байтов в сообщении, которые следуют далее (от адреса устройства) |
| Адрес устройства | 1 байт | Идентификация устройства Slave |
| PDU | ||
| Функция | 2 символа | Код функции Modbus (например, 03 — чтение регистров) |
| Данные | N x 2 символа | Полезная нагрузка сообщения |
Применение

Протоколы Event Sourcing
MQTT
MQTT — это протокол обмена сообщениями по шаблону издатель-подписчик (pub/sub).
С учётом суровых условий эксплуатации протокол сделан маленьким и лёгким. Он идеален для устройств слабой мощности и с ограниченным временем автономной работы. К их числу сейчас относятся и вездесущие смартфоны, и постоянно растущее число датчиков и подключённых устройств.
Система связи, построенная на MQTT, состоит из сервера-издателя, сервера-брокера и одного или нескольких клиентов. Издатель не требует каких-либо настроек по количеству или расположению подписчиков, получающих сообщения. Кроме того, подписчикам не требуется настройка на конкретного издателя. В системе может быть несколько брокеров, распространяющих сообщения.

MQTT передает сообщения пакетами. Пакет состоит из следующих частей:
- Фиксированный заголовок – обязательная часть сообщения, включающая служебный заголовок и размер пакета. Минимальный размер – 2 байта, максимальный – 5 байт.
- Изменяемый заголовок – необязательная часть сообщения, которая предоставляет дополнительную информацию. Ее размер может варьироваться в зависимости от типа сообщения.
- Поле данных – необязательная часть сообщения с максимальным размером 256 МБ. Она может включать различные команды, такие как включение/выключение, обмен данными и считывание данных с датчика.
QOS
Передаваемые сообщения отличаются по степени важности, которую определяет флаг уровня QoS (англ. Quality of Service — качество обслуживания) в его структуре. Протокол MQTT поддерживает 3 уровня QoS:
- QoS 0 — доставка сообщения осуществляется не более одного раза. При неудачном исходе сообщение теряется.
- QoS 1 — доставка сообщения осуществляется не менее одного раза. Отправка повторяется до тех пор, пока не будет получено подтверждение от адресата.
- QoS 2 — доставка сообщения осуществляется только один раз. Если на линии связи MQTT возникают проблемы, доставка задерживается. Однако адресат в любом случае получит сообщение, когда связь восстановится.
Топики
Topic — это строка, по которой происходит маршрутизация сообщений. Условно говоря это тема, на которую можно публиковать и подписываться, например:
home/kitchen/temperature
Есть возможность подписаться на группу тем, например:
home/+/temperature
пример:
home/kitchen/temperature
home/bathroom/temperature
либо
home/#
пример:
home/kitchen/sink
home/bathroom/pipe
AMQP / Kafka / Nats
Источники
Источник,Источник,Источник,Источник,Источник,Источник,Источник