Перейти к содержанию

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 Identifier2 байтаклиент, сервер копирует в ответ
Protocol Identifier2 байта0 — протокол Modbus
Length2 байтачисло следующих байтов, включая Unit ID
Unit Identifier1 байтклиент, сервер копирует в ответ

Собрать и разобрать такой кадр можно в калькуляторе Modbus TCP.

Какое значение ставить

Где устройствоUnit ID
Прямо в сети Ethernet0xFF — рекомендуемое незначимое значение; 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).

Источники

  1. 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) — указывает ответившее устройство
  2. Modbus Organization. MODBUS Application Protocol Specification V1.1b3 (2012) — разд. 7: исключения 0A (GATEWAY PATH UNAVAILABLE) и 0B (GATEWAY TARGET DEVICE FAILED TO RESPOND) — специально для шлюзов

Нашли ошибку?