Протоколы 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

Источники

Источник,Источник,Источник,Источник,Источник,Источник,Источник