Регистры Modbus: типы и структура запроса — АСУ ТП: сообщество инженеров

Регистры Modbus: типы и структура запроса

Коротко о статье

Разбор четырёх видов регистров Modbus, их функций и структуры обмена мастер-слейв. Отдельно показаны различия RTU и TCP, а также причины ошибок при адресации и чтении.

Главное
  • В Modbus применяются Coils и Discrete Inputs по 1 биту, Holding Registers и Input Registers по 16 бит.
  • Coils и Holding Registers допускают чтение и запись, Discrete Inputs и Input Registers — только чтение.
  • Каждому виду регистров соответствует своя функция: 0x01, 0x02, 0x03, 0x04 для чтения и 0x05, 0x0F, 0x06, 0x10 для записи.
  • Кадр мастера содержит адрес ведомого, код функции, адрес первого регистра, количество и контрольную сумму.
  • В документации применяют префиксы 0x, 1x, 3x, 4x, что приводит к путанице между протокольным и документационным адресом.
  • Modbus TCP использует заголовок MBAP вместо контрольной суммы, но сохраняет ту же модель регистров и коды функций.
Термины и технологии
  • Coils
  • Discrete Inputs
  • Holding Registers
  • Input Registers
  • MBAP
  • MB_SERVER
  • MB_HOLD_REG
  • RS-485

Кому полезно: Инженерам АСУ ТП, настраивающим обмен по Modbus RTU и TCP

Выжимка составлена редакцией сайта с помощью ИИ по тексту статьи.

В Modbus четыре вида регистров: Coils (1 бит, чтение/запись, 0x01/0x05/0x0F), Discrete Inputs (1 бит, только чтение, 0x02), Holding Registers (16 бит, чтение/запись, 0x03/0x06/0x10) и Input Registers (16 бит, только чтение, 0x04). Запрос мастера содержит адрес слейва, код функции, адрес первого регистра, количество и контрольную сумму; ответ повторяет адрес и функцию, добавляя данные.

Разделение на четыре вида регистров отражает логику промышленного ввода-вывода. Coils — это дискретные выходы, которые можно и читать, и записывать: типичный пример — команда пуска или состояние реле. Discrete Inputs — дискретные входы, доступные только для чтения: концевики, аварийные контакты, сигналы датчиков. Holding Registers — 16-битные слова с правом чтения и записи: уставки, коэффициенты, заданные значения. Input Registers — 16-битные слова только для чтения: текущие измерения, счётчики, фактические значения [1][6].

Для каждого вида есть свой набор функций. Чтение Coils — 0x01, Discrete Inputs — 0x02, Holding Registers — 0x03, Input Registers — 0x04. Запись одиночной катушки — 0x05, нескольких — 0x0F. Запись одного holding-регистра — 0x06, нескольких — 0x10. Input Registers и Discrete Inputs записывать нельзя по спецификации — это только источники данных для мастера [1][4][7]. Коды функций делятся на публичные (описанные в стандарте), пользовательские (65–72, 100–110) и зарезервированные [7].

Запрос мастера устроен единообразно: адрес ведомого на шине, код функции, адрес первого регистра, количество запрашиваемых регистров и контрольная сумма. Ответ слейва начинается с того же адреса и кода функции, далее идут данные (или эхо записанных значений), затем контрольная сумма [1]. В RTU приёмное устройство сверяет первый байт со своим ID: если не совпало — буфер очищается, кадр игнорируется [6].

На практике адресация часто вызывает путаницу из-за двух нотаций. В документации устройств встречается запись вида 4×0001 или 40001 — это holding-регистр с адресом 0 в протоколе. Coils обозначают как 0x, discrete inputs как 1x, input registers как 3x, holding registers как 4x [5]. При настройке клиента важно понимать, какой именно адрес ждёт устройство: «протокольный» (с нуля) или «документационный» (со смещением). Ошибка на единицу — самая частая причина «пустых» ответов.

Modbus TCP отличается от RTU обёрткой: тот же PDU помещается в TCP-кадр с заголовком MBAP, где вместо контрольной суммы используется длина сообщения, а адрес слейва заменяется идентификатором блока. Функции и модель регистров остаются теми же, поэтому клиент RTU и клиент TCP работают с одинаковыми кодами функций [2][3][8]. В S7-1200/1500, например, блок MB_SERVER отображает %I на discrete inputs, %Q на coils, а область под holding registers задаётся отдельно через MB_HOLD_REG [3].

Типичные ошибки: путаница между input и holding регистрами при чтении (устройство отвечает исключением вместо данных), неверный порядок байт для 32-битных значений (два 16-битных регистра собираются в разном порядке у разных производителей), игнорирование таймаута и частоты опроса на медленных линиях RS-485, а также запись в регистры, которые физически только для чтения. Перед настройкой всегда сверяйтесь с картой регистров конкретного прибора.

Материалы сайта по теме

Частые вопросы

Можно ли записать значение в Input Register?

Нет. Input Registers по спецификации доступны только для чтения (функция 0x04). Запись возможна только в Holding Registers и Coils.

Чем Coils отличаются от Discrete Inputs?

Оба хранят 1 бит, но Coils доступны для чтения и записи, а Discrete Inputs — только для чтения. Coils обычно отражают выходы, Discrete Inputs — входы.

Почему устройство отвечает ошибкой при чтении holding-регистра?

Скорее всего, выбран неверный код функции или адрес выходит за пределы карты регистров. Проверьте, что читаете 0x03, а не 0x04, и сверьте смещение адреса.

Чем Modbus TCP отличается от Modbus RTU на уровне регистров?

Модель регистров и коды функций одинаковы. Отличается транспорт: в TCP добавляется заголовок MBAP, а контрольная сумма заменяется полем длины.

Что означает адрес 40001 в документации?

Это holding-регистр с протокольным адресом 0. Префикс 4 обозначает тип регистра, а нумерация в документации часто начинается с единицы.

Остались вопросы?Спросите ИИ-помощника сайта — он ответит по нашим статьям, видеоурокам и книгам.

Оставьте комментарий

Войти

Зарегистрироваться

Сбросить пароль

Пожалуйста, введите ваше имя пользователя или эл. адрес, вы получите письмо со ссылкой для сброса пароля.

Прокрутить вверх