1 нояюря 2025
Простое описание Modbus RTU
Modbus RTU — простой промышленный протокол обмена по последовательной линии (чаще RS‑485) с архитектурой ведущий–ведомый и кадром «адрес — код функции — данные — CRC». Появился в 1979 году и был разработан компанией Modicon (Gould‑Modicon; ныне Schneider Electric)
Основные кадры и структура сообщения Modbus RTU
Кадр Modbus RTU состоит из четырех полей в строгом порядке: Адрес (1 байт), Код функции (1 байт), Данные (0–252 байта) и CRC‑16 (2 байта), при этом новое сообщение начинается после паузы тишины не менее 3,5 символа и передается непрерывно без разрывов внутри кадра. Максимальная длина кадра — 256 байт, а завершение приема также определяется паузой не менее 3,5 символа на линии связи.​
Формат кадра RTU
  • Поле адреса указывает ведомое устройство, к которому обращен запрос, и присутствует также в ответе, чтобы ведущий однозначно знал источник ответа.​
  • Поле кода функции задает требуемое действие (чтение/запись таблиц данных и т. п.), а поле данных содержит параметры запроса или полезную нагрузку ответа, в зависимости от операции.​
  • Контроль целостности — CRC‑16 по всем предыдущим байтам кадра; два байта CRC передаются в порядке младший байт, затем старший байт.​
Синхронизация и паузы
  • Начало нового кадра определяется «тишиной» на шине длительностью не менее 3,5 символа, после чего передается адрес и остальные поля без промежутков внутри кадра.​
  • Если в процессе передачи возникает интервал тишины более 1,5 символа, приемник считает кадр прерванным/ошибочным и ждет следующего корректного начала.​
  • Конец кадра также отмечается паузой длительностью не менее 3,5 символа, что используется ведущим для определения завершения приема ответа.​
Адресация и широковещание
  • Допустимые адреса ведомых — 1…247, адреса 248…255 зарезервированы спецификацией для служебных целей.​
  • Широковещательные команды выполняются через адрес 0, на них ведомые не отвечают, что используется для одновременной записи настроек без обратной телеграммы.​
  • Ведущее устройство не имеет собственного адреса в RTU‑сегменте, так как всегда инициирует обмен и ожидает ответ адресованного ведомого.​
Запрос и ответ: поля данных
  • В запросах на чтение передается стартовый адрес и количество элементов, а в ответах — счетчик байт данных и сами значения, при этом 16‑битовые параметры (адрес, количество) передаются старшим байтом вперед.​
  • Типовые функции: 0x01/0x02 — чтение дискретов, 0x03 — чтение регистров хранения, 0x04 — чтение входных регистров, 0x05/0x06 — запись одного дискрета/регистра, 0x0F/0x10 — запись нескольких, с форматом данных, соответствующим операции.​
  • Структура ответа повторяет заголовок запроса (Адрес и Код функции), но поле данных содержит либо считанные значения, либо подтверждение записи с отражением адреса и количества/значения.​
Размеры и пределы
  • Поле данных имеет длину от 0 до 252 байт, что вместе с заголовком и CRC дает максимально 256 байт на кадр.​
  • Минимально возможный кадр содержит 4 байта: Адрес (1), Код функции (1) и CRC‑16 (2), что встречается в ответах подтверждения без данных.​
  • PDU (Protocol Data Unit) — это часть без адреса и CRC, а полный RTU‑кадр — это ADU (Address + PDU + CRC), что важно при сопоставлении с описанием функций в спецификациях Modbus.​
Основные функции Modbus RTU
0x01 — Read Coils (DO)
  • Назначение: чтение дискретных выходов; биты упакованы младшим битом вперёд, недостающие биты добиваются нулями до полного байта.​
  • Пример запрос: 11 01 00 13 00 25 0E 84 — адрес 0x11, функция 0x01, старт 0x0013 (19), количество 0x0025 (37), CRC 0x0E84.​
  • Пример ответ: 11 01 05 CD 6B B2 0E 1B 45 E6 — адрес 0x11, функция 0x01, далее 5 байт данных: CD, 6B, B2, 0E, 1B; последние 2 байта — CRC.​
0x02 — Read Discrete Inputs (DI)
  • Назначение: чтение дискретных входов; упаковка битов и поле Byte Count аналогичны 0x01.​
  • Пример запрос: 11 02 00 C4 00 16 BA A9 — старт 0x00C4 (196), количество 0x0016 (22), CRC 0xBAA9.​
  • Пример ответ: 11 02 03 AC DB 35 20 18 — 3 байта данных AC, DB, 35; далее CRC 0x2018.​
0x03 — Read Holding Registers (AO/Holding)
  • Назначение: чтение 16‑битных регистров хранения; параметры адрес/количество 16‑битные, старший байт вперёд.​
  • Пример запрос: 11 03 00 6B 00 03 76 87 — адрес первого регистра 0x006B (107, что для 40108 с учетом смещения 40001), количество 3, CRC 0x7687.​
  • Пример ответ: 11 03 06 AE 41 56 52 43 40 49 AD — Byte Count 0x06, далее три регистра: AE41, 5652, 4340; CRC 0x49AD.​
0x04 — Read Input Registers (AI)
  • Назначение: чтение 16‑битных входных регистров; формат аналогичен 0x03.​
  • Пример запрос: 11 04 00 08 00 01 B2 98 — чтение одного регистра с адреса 0x0008 (для #30009), CRC 0xB298.​
  • Пример ответ: 11 04 02 00 0A F8 F4 — Byte Count 0x02, значение регистра 0x000A, CRC 0xF8F4.​
0x05 — Write Single Coil
  • Назначение: запись одного дискретного выхода; допустимые значения: FF00 = ON, 0000 = OFF.​
  • Пример запрос: 11 05 00 AC FF 00 4E 8B — запись ON в регистр по адресу 0x00AC (для #173), CRC 0x4E8B.​
  • Пример ответ: эхо запроса 11 05 00 AC FF 00 4E 8B после успешной записи.​
0x06 — Write Single Register
  • Назначение: запись одного 16‑битного регистра хранения.​
  • Пример запрос: 11 06 00 01 00 03 9A 9B — запись значения 0x0003 в адрес 0x0001 (для #40002), CRC 0x9A9B.​
  • Пример ответ: эхо запроса 11 06 00 01 00 03 9A 9B после успешной записи.​
0x0F — Write Multiple Coils
  • Назначение: запись нескольких дискретных выходов; после количества регистров указывается Byte Count и далее байты битовых масок.​
  • Пример запрос: 11 0F 00 13 00 0A 02 CD 01 BF 0B — старт 0x0013, количество 10, Byte Count 0x02, данные CD 01, CRC 0xBF0B.​
  • Пример ответ: 11 0F 00 13 00 0A 26 99 — подтверждение адреса и количества записанных регистров, CRC 0x2699.​
0x10 — Write Multiple Registers
  • Назначение: запись нескольких 16‑битных регистров; после количества указывается Byte Count и последовательность значений.​
  • Пример запрос: 11 10 00 01 00 02 04 00 0A 01 02 C6 F0 — запись двух регистров с адреса 0x0001 значениями 0x000A и 0x0102, CRC 0xC6F0.​
  • Пример ответ: 11 10 00 01 00 02 12 98 — подтверждение адреса и количества записанных регистров, CRC 0x1298.​
Формат ошибки (Exception)
  • При ошибке ответ возвращается с тем же адресом и кодом функции с установленным старшим битом (добавляется 0x80), далее 1 байт кода исключения и CRC.​
  • Пример: запрос 0A 01 00 A1 00 01 AC 63 → ответ 0A 81 02 B0 53 (код функции 0x81 и код ошибки 0x02; далее CRC).​
Приложение ModbusStarter
Иногда не просто отладить связь по протоколы Mosbus RTU. В этом случае на помощь приходят приложения Modbus. Одним из таких является MosbusStarter
Made on
Tilda