Unit Identifier (Unit ID) в Modbus TCP
В кадре Modbus TCP нет адреса устройства, как в RTU, — устройство и так найдено по IP. Но один байт в заголовке всё же остался: Unit Identifier. Он нужен шлюзам Ethernet — RS-485, и именно с ним связана самая частая ошибка опроса через шлюз.
Обновлено Редакция GAW
Unit Identifier (Unit ID) — однобайтовое поле заголовка MBAP в кадре Modbus TCP, которое заменяет адрес ведомого из Modbus RTU. Спецификация объясняет, зачем оно осталось: через мосты, маршрутизаторы и шлюзы с одним IP-адресом можно обращаться к нескольким независимым устройствам, и Unit ID указывает, к какому именно (Implementation Guide V1.0b, разд. 3.1.2).
Место в кадре
Заголовок MBAP — 7 байт, все поля старшим байтом вперёд, кадры идут на TCP-порт 502 (разд. 3.1.3):
| Поле | Длина | Кто задаёт |
|---|---|---|
| Transaction Identifier | 2 байта | клиент, сервер копирует в ответ |
| Protocol Identifier | 2 байта | 0 — протокол Modbus |
| Length | 2 байта | число следующих байтов, включая Unit ID |
| Unit Identifier | 1 байт | клиент, сервер копирует в ответ |
Собрать и разобрать такой кадр можно в калькуляторе Modbus TCP.
Какое значение ставить
| Где устройство | Unit ID |
|---|---|
| Прямо в сети Ethernet | 0xFF — рекомендуемое незначимое значение; 0 тоже принимается |
| На линии RS-485 за шлюзом | адрес ведомого на линии: 1–247 |
Источник — Implementation Guide, разд. 4.4.1.2. Адреса ведомых на последовательной линии — от 1 до 247, адрес 0 там широковещательный; подробнее — в статье «Modbus RTU». Спецификация предостерегает от значимого Unit ID при обращении к прямому устройству: если его IP-адрес потом достанется шлюзу, тот перешлёт запрос случайному ведомому, а незначимый 0xFF шлюз просто отбросит. В ответе от устройства в сети значение 0xFF клиент игнорирует, а Unit ID, отличный от 0xFF, в ответе шлюза указывает ведомое устройство, которое ответило (разд. 4.4.1.3).
Шлюзы и ошибки
Шлюз Modbus TCP — Modbus RTU принимает кадр по IP, берёт Unit ID как адрес ведомого и отправляет запрос на линию RS-485 уже кадром RTU — с адресом и CRC (наш вывод из формата кадров). Если устройство не ответило, шлюз возвращает исключение 0B (GATEWAY TARGET DEVICE FAILED TO RESPOND), а если не смог выделить путь до порта — 0A (GATEWAY PATH UNAVAILABLE) (Application Protocol, разд. 7). При исключении 0B Unit ID проверяют первым делом, затем скорость и формат порта шлюза.
Устройство с собственным Ethernet может игнорировать поле или, наоборот, отвечать только на один Unit ID — это стоит проверить в его документации.
Частые вопросы
Какой Unit ID ставить при опросе устройства по Modbus TCP?
Если устройство подключено к Ethernet напрямую — 0xFF (255): спецификация рекомендует его как незначимое значение и допускает 0. Если опрос идёт через шлюз Ethernet — RS-485, то адрес ведомого на линии, 1–247 (Implementation Guide, разд. 4.4.1.2). Некоторые устройства отвечают только на один Unit ID — проверьте их документацию.
Почему через шлюз приходит исключение 0B?
Код 0B — GATEWAY TARGET DEVICE FAILED TO RESPOND: шлюз переслал запрос на линию, но устройство не ответило (Application Protocol, разд. 7). Чаще всего неверен Unit ID — адрес ведомого, — или скорость и формат порта шлюза не совпадают с настройками устройства.
Почему спецификация не советует ставить значимый адрес для прямого устройства?
Если IP-адрес устройства потом отдадут шлюзу, запрос со значимым Unit ID шлюз перешлёт на линию случайному ведомому. С незначимым 0xFF шлюз просто отбросит такой запрос (Implementation Guide, разд. 4.4.1.2).
Источники
- Modbus Organization. MODBUS Messaging on TCP/IP Implementation Guide V1.0b (2006) — разд. 3.1.2: адрес ведомого последовательной линии заменён однобайтовым Unit Identifier в заголовке MBAP — для связи через мосты, маршрутизаторы и шлюзы, у которых один IP-адрес на несколько независимых устройств; разд. 3.1.3: поле 1 байт, задаёт клиент, сервер возвращает его без изменений, служит для маршрутизации внутри системы, обычно к ведомому Modbus+ или последовательной линии за шлюзом; поля MBAP в порядке big-endian, порт 502; разд. 4.4.1.2: за шлюзом Unit ID несёт адрес ведомого, адреса на линии 1–247, 0 — широковещательный; устройству прямо в сети TCP/IP Unit ID не нужен, рекомендуется незначимое 0xFF, принимается и 0; значимый адрес опасен при перераспределении IP-адресов, если адрес достанется шлюзу; разд. 4.4.1.3: ответ от устройства в сети — Unit ID 0xFF игнорируется, от шлюза (≠ 0xFF) — указывает ответившее устройство
- Modbus Organization. MODBUS Application Protocol Specification V1.1b3 (2012) — разд. 7: исключения 0A (GATEWAY PATH UNAVAILABLE) и 0B (GATEWAY TARGET DEVICE FAILED TO RESPOND) — специально для шлюзов
Нашли ошибку?
Смотрите также
- Modbus TCP: кадрыЗаголовок MBAP, функции 01–06, 15, 16 и 23, разбор, сравнение с RTU
- Transaction ID (Modbus TCP)2 байта MBAP: клиент нумерует запросы, сервер копирует номер в ответ
- Modbus RTUКадр, паузы 3,5 символа, функции, регистры, CRC-16, RS-485, отладка
- Modbus RTU: кадрыЗапрос с CRC, разбор ответа, float, адреса 4xxxx
- Регистр ModbusHolding и input registers, номер и адрес в кадре
- RS-485Уровни, длина линии, терминаторы, смещение, MAX485, Modbus RTU