Разбор четырёх видов регистров 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, а также запись в регистры, которые физически только для чтения. Перед настройкой всегда сверяйтесь с картой регистров конкретного прибора.
Материалы сайта по теме
- Прокачиваем Modbus: арбитраж, сканирование шины, события
- Как построить открытую АСУТП. Настройка плагина протокола Modbus TCP/RTU Master/Slave
- Сервер Modbus TCP для Simatic S7-1200 / S7-1500
- Лень, Modbus и ИИ: как я сделал инструмент, которого мне не хватало на пусконаладке
- Как инженерная боль вдохновила на создание мобильного приложения — клиента Modbus TCP
- Программная эмуляция сети Modbus RTU
Частые вопросы
Можно ли записать значение в 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 обозначает тип регистра, а нумерация в документации часто начинается с единицы.