Функциональные коды Modbus (01-16)
Полный разбор функциональных кодов протокола Modbus: 01 (Read Coils), 02 (Read Discrete Inputs), 03 (Read Holding Registers), 04 (Read Input Registers), 05 (Write Single Coil), 06 (Write Single Register), 15 (Write Multiple Coils), 16 (Write Multiple Registers).
Функциональные коды (function codes) — ядро протокола Modbus. Каждый код определяет операцию над определённой областью памяти. В автоматике используется ~8 основных кодов.
Основные коды чтения
01 — Read Coils (чтение дискретных выходов)
Читает 1-2000 битовых значений coils (выходов). Запрос: адрес начала + количество. Ответ: количество байт + биты упакованы по 8 в байт.
02 — Read Discrete Inputs (чтение дискретных входов)
Аналогично 01, но для области discrete inputs (только чтение). Применение: чтение состояния концевиков, кнопок, сигналов «авария».
03 — Read Holding Registers (чтение регистров хранения)
Самая используемая функция. Читает 1-125 регистров (16 бит каждый). Применение: чтение измеренных значений с датчиков, уставок с ПЛК, параметров частотника.
04 — Read Input Registers (чтение регистров ввода)
Аналогично 03, но для области input registers (только чтение). Применение: измеренные значения с ЦАП, счётчиков импульсов.
Основные коды записи
05 — Write Single Coil (запись одного дискретного выхода)
Записывает один бит. Значение 0xFF00 = включить, 0x0000 = выключить. Применение: команды «пуск»/«стоп» на ПЛК, «открыть»/«закрыть» на приводе.
06 — Write Single Register (запись одного регистра)
Записывает один 16-битный регистр. Применение: установка уставки температуры, задание частоты частотнику.
15 (0x0F) — Write Multiple Coils (запись нескольких битов)
Записывает 1-1968 битов за одну транзакцию. Применение: массовое управление выходами.
16 (0x10) — Write Multiple Registers (запись нескольких регистров)
Записывает 1-123 регистра за транзакцию. Применение: загрузка таблицы параметров в частотник, передача массива уставок.
Специальные коды
- 07 — Read Exception Status (устарел)
- 08 — Diagnostics (диагностика линии)
- 11 — Get Comm Event Counter (счётчик событий)
- 17 — Report Slave ID (идентификация устройства)
- 22 — Mask Write Register (запись с маской для бит-операций)
- 23 — Read/Write Multiple Registers (чтение+запись за одну транзакцию)
- 43 — Read Device Identification (расширенная идентификация, MEI type 14)
Форматы данных в регистрах
Один регистр = 16 бит = одно беззнаковое целое 0-65535. Для других типов используют комбинации:
- INT16 (знаковое) — тот же регистр, интерпретация -32768..+32767
- UINT32 / INT32 — два регистра (4 байта), порядок big-endian/little-endian зависит от производителя
- FLOAT32 (IEEE 754) — два регистра, часто с перестановкой слов (CDAB вместо ABCD)
- FLOAT64 — четыре регистра
- STRING — последовательность регистров, два ASCII-символа на регистр
Порядок байт (byte order / word order) — головная боль Modbus. У каждого производителя своя логика. В документации обычно указано, но часто приходится экспериментировать.
Исключения на функции записи
При попытке записи в несуществующий регистр — exception 02. При записи неподдерживаемого значения — exception 03. При записи в read-only область — exception 01 или 02.
РУБИКОН в шкафах автоматики типично использует функции 03, 04, 06, 16 — чтение измерений и запись уставок с SCADA в ПЛК.
Частые вопросы
В каком порядке передаются байты для FLOAT32 в Modbus?
Стандарт не определяет — зависит от производителя. Четыре варианта: ABCD (big-endian, Modbus-рекомендованный), CDAB (word swap, самый частый у Schneider, ОВЕН), BADC (byte swap), DCBA (little-endian). В SCADA и шлюзах обычно есть настройка «Byte order» — подбирается экспериментально.Можно ли одним запросом записать 1000 регистров?
Нет, функция 16 позволяет записать максимум 123 регистра за транзакцию (ограничение длины кадра 256 байт). Для записи большого массива — несколько последовательных запросов. Многие slave-устройства имеют ещё более жёсткие ограничения (например ОВЕН ПЛК часто принимает не более 32-64 регистров за раз).
Источники
- Modbus Application Protocol Specification V1.1b3, section 6 — Modbus Organization