Протокол MODBUS RTU и TCP/IP для RFID-считывателей SAUK
Обмен данными с RFID-считывателем по протоколу Modbus: чтение обнаруженных меток (функции 03 и 04), управление сканированием (06) и запись данных в метку (16). Одинаково работает по сети (Modbus TCP/IP через Ethernet или Wi-Fi) и по проводным линиям (Modbus RTU через RS-485, RS-232).
Содержание
1Общие сведения
Ниже описан протокол Modbus встраиваемого ПО RFID-считывателей SAUK (версия 5.03 от 30.09.2026 и новее; отличия от прежних версий — в разделе 7):
- с сетевым интерфейсом Ethernet или Wi-Fi (Modbus TCP/IP);
- с проводными интерфейсами RS-485, RS-232 (Modbus RTU).
По TCP и по RTU прибор работает одинаково: те же функции, те же адреса регистров, те же ответы с ошибкой. Данные в регистрах общие для обоих интерфейсов.
Описание приведено для 4-портового считывателя как общего случая. Для 1-портового считывателя или моноблока используется только часть, относящаяся к антенне №1. Данные от метки, идентифицированной соответствующей антенной, представлены в отдельных группах регистров.

1.1Интерфейсы и настройки
| Интерфейс | Параметры | Как включить |
|---|---|---|
| Modbus TCP/IP | Порт 502, Wi-Fi или Ethernet. Одновременно обслуживается до 4 мастеров; пятое подключение закрывает то, по которому дольше всего не было запросов. Соединение без запросов 10 минут закрывается. Номер устройства (Unit ID) может быть любым — прибор возвращает его в ответе. | Галочка «MODBUS TCP/IP» в разделе каналов уведомлений или /tagidentity?modbus_tcp=true. Применяется сразу, без перезагрузки. По умолчанию выключен. |
| Modbus RTU | Порт UART прибора (RS-485 или RS-232), 8 бит, без чётности, 1 стоп-бит. Скорость — как у канала UART-уведомлений (по умолчанию 9600 бит/с). Адрес устройства 1…247; адрес 0 — широковещательный: команды записи выполняются, ответа нет. Опция «Ответ с отсрочкой» задерживает ответ на 100 мс — для преобразователей интерфейса, которые не успевают переключиться на приём. | Галочка «MODBUS RTU», поле «Адрес устройства» или /tagidentity?modbus_rtu=true, modbus_rtu_addr=, modbus_rtu_delay=. |
Порт UART — либо Modbus RTU, либо UART-протокол
Modbus RTU и UART-уведомления (Short Protocol, JSON) используют один и тот же порт и работают по очереди, а не одновременно: включение Modbus RTU выключает UART-уведомления, и наоборот. Modbus TCP от этого не зависит и может работать вместе с любым из них.
1.2Функции Modbus
| Код | Функция | Адреса | Назначение |
|---|---|---|---|
| 03 (0x03) | Read Holding Registers | 1000–1077 | Чтение меток и результата записи (раздел 2). До 78 регистров за запрос. |
| 04 (0x04) | Read Input Registers | 1000–1077 | То же, что 03 — для мастеров, которые читают только Input Registers. |
| 06 (0x06) | Write Single Register | 1000 | Управление сканированием (раздел 6). |
| 16 (0x10) | Write Multiple Registers | 2000–2016 | Запись данных в память метки (раздел 5). |
1.3Ответы с ошибкой (исключения)
На запрос, адресованный прибору, всегда приходит ответ: обычный или ответ с ошибкой — код функции с установленным старшим битом (например, 0x83 для функции 03) и код исключения. Прибор не отвечает только на кадр RTU с неверной контрольной суммой и на широковещательный адрес 0.
| Код | Название | Когда возвращается |
|---|---|---|
| 01 | ILLEGAL FUNCTION | Функция не из таблицы 1.2 (например, 01, 02, 05, 15). |
| 02 | ILLEGAL DATA ADDRESS | Чтение выходит за пределы 1000–1077; функция 06 не в регистр 1000; функция 16 не с адреса 2000. |
| 03 | ILLEGAL DATA VALUE | Запрошено 0 или больше 125 регистров; в регистр 1000 записывается не 0, 1 или 2; пакет записи в метку не из 17 регистров; номер антенны не 1…4. |
| 06 | SERVER DEVICE BUSY | Предыдущая команда записи в метку ещё не начала выполняться — повторите запрос позже. |
Пример (RTU): запрос 01 03 03 E8 00 4F … (79 регистров с адреса 1000 — на один больше карты) → ответ 01 83 02 C0 F1.
2Чтение меток — Holding Register 0x03
Регистры читаются функцией 03 (или 04). Регистр по адресу 1000 содержит информацию об антеннах, в зоне действия которых находится RFID-метка. При наличии метки в поле антенны устанавливается флаг (значение полубайта 0x01); при пропадании метки флаг снимается.
2.1Таблица 1. Идентификация меток и результат записи (адреса 1000, 1001)
| Параметр | Адрес | R/W, тип | Описание |
|---|---|---|---|
| Метка в поле антенн [4:3:2:1] | 1000 | R, [Byte:Byte] | Примеры: 0x0100 — метка в поле антенны №3; 0x1111 — метка в поле всех 4 антенн. Запись в этот регистр функцией 06 — управление сканированием (раздел 6). |
| Результат записи и коды ошибок [4:3:2:1] | 1001 | R, [Byte, Byte] | Запись выполняется командой Write Multiple Registers (0x10), а результат возвращается здесь — по 4 бита (полубайт) на каждую антенну. Коды см. ниже. |
Коды результата записи (на каждую антенну):
| Код | Значение |
|---|---|
| 0 | Результата ещё нет — выставляется, когда команда записи принята |
| 1 | SUCCESS — данные успешно записаны в память метки |
| 2 | NO TAG ERROR — метки нет в зоне действия (или нет метки с указанным EPC) |
| 3 | TAG WRITE ERROR — ошибка записи данных в метку |
| 4 | ACCESS PASSWORD ERROR — неверный пароль |
| F | UNKNOWN ERROR — неизвестная ошибка |
Ошибки формирования пакета мастером. Прибор отвечает на такой пакет исключением (раздел 1.3) и, кроме того, записывает код ошибки во весь регистр 1001:
0xCCCC— неверный номер антенны (должен быть 1…4), исключение 03;0xDDDD— неверная длина данных (строго 17 слов / 34 байта), исключение 03;0xEEEE— неверный адрес (должен быть 2000), исключение 02.
Примеры результата: 0x0001 — метка у антенны №1 закодирована успешно; 0x0030 — попытка кодирования у антенны №2, но данные не записаны (метка не поддерживает банк памяти либо смещение превышает размер памяти).
2.2Таблица 2. Данные метки по антеннам (адреса 1002–1077)
Данные каждой антенны располагаются в отдельной группе регистров. Ниже — секция антенны №1 (адреса 1002–1020); секции антенн №2, 3, 4 имеют идентичную структуру.
| Параметр | Адрес | R/W, тип | Описание |
|---|---|---|---|
| Количество меток у антенны №1 | 1002 | R, [0x00, Byte] | Число меток в таблице идентификации, обнаруженных антенной №1. Удерживается согласно времени удержания меток в таблице. |
| Timestamp | 1003, 1004 | R, word | Системное время прибора на момент обнаружения метки — Unix-время, 32 бита: 1003 — старшее слово, 1004 — младшее. Пример: 0x6405 0xD4FA = 06.03.2023 11:56:42 (UTC). Если часы прибора не установлены (нет NTP и RTC), это секунды с момента включения. |
| Счётчик событий по метке | 1005 | R, word | Инкремент при каждом новом сканировании той же метки. |
| Уровень сигнала RSSI, dB | 1006 | R, int16 | Отрицательная величина, обычно от −90 (слабый) до −30 dB. |
| Банк памяти EPC и количество данных | 1007 | R, [0x01, Byte] | Банк памяти константа 0x01 (EPC). Обычно 12 байт = EPC 96 бит. |
| Данные из EPC-памяти | 1008–1013 | R, массив 12 байт (6 слов) | EPC-номер. Пример E280699500005010DE651922: 1008 = 0xE280 … 1013 = 0x1922. Если EPC короче 12 байт, оставшиеся регистры — нули. |
| Банк доп. данных и количество | 1014 | R, [Byte, Byte] | Банк: EPC 0x01, TID 0x02, USER 0x03. Количество — не больше 12 байт. |
| Данные из доп. памяти (EPC/TID/USER) | 1015–1020 | R, массив 12 байт (6 слов) | Например, TID-номер. Формат записи в регистры аналогичен EPC. Если прочитано больше 12 байт, в регистры попадают первые 12. |
Если у антенны нет подтверждённых меток, все регистры её секции, кроме количества меток и банка доп. данных, равны нулю — данные ушедшей метки не остаются в регистрах.
| Секция | Диапазон адресов |
|---|---|
| Антенна №1 | 1002–1020 |
| Антенна №2 | 1021–1039 |
| Антенна №3 | 1040–1058 |
| Антенна №4 | 1059–1077 |

3Алгоритм трансляции нескольких меток
Регистры каждой антенны предоставляют данные обо всех метках, обнаруженных этой антенной, — просматривается вся таблица идентификации прибора. При первом опросе группы регистров считыватель возвращает данные первой метки из таблицы идентификации, при втором — второй, и так далее; после последней метки опрос идёт по кругу, начиная снова с первой.
- В регистры попадают только подтверждённые метки: прошедшие фильтры и с прочитанной дополнительной памятью (если её чтение включено).
- Если в поле действия одна метка, она транслируется в Modbus при каждом запросе мастера.
- Если меток несколько, после трансляции метки на мастер выставляется флаг «больше не транслировать эту метку».
- Флаг сбрасывается, когда метка пропадает из таблицы (по таймауту удержания) или когда мастер опросил все метки по кругу.
- Так метки транслируются поочерёдно — «эстафета» передаётся от метки к метке.
Читайте секцию антенны одним запросом
Каждый запрос, который затрагивает секцию антенны, передаёт эстафету следующей метке. Поэтому секцию читают целиком одним запросом (19 регистров) или всю карту сразу (78 регистров с адреса 1000), а не по частям — иначе части окажутся от разных меток. Эстафета общая для всех мастеров, в том числе для TCP и RTU одновременно.
4Интерфейсы и примеры опроса
Ниже — веб-интерфейс встраиваемого ПО SAUK (доступен через браузер): таблица с четырьмя идентифицированными и отфильтрованными метками, прочитаны все необходимые данные — EPC 12 байт и DATA 12 байт (в частности, блок TID).

Ниже — программа Modbus Poll, опрашивающая Holding Register 0x03 считывателя. Общий объём данных составляет 78 слов.

Кадр запроса Modbus RTU (адрес 1, чтение 78 регистров с адреса 1000):
| Адрес | Функция | Начальный регистр | Количество | CRC16 |
|---|---|---|---|---|
01 | 03 | 03 E8 (1000) | 00 4E (78) | 45 8E |
В Modbus TCP то же самое передаётся после 7-байтового заголовка MBAP: 00 01 00 00 00 06 01 03 03 E8 00 4E (номер транзакции, протокол 0, длина 6, номер устройства, функция, адрес, количество).
5Запись в метку — Write Multiple Registers (0x10)
Запись данных в память RFID-метки выполняется командой Write Multiple Registers 16 (0x10) — по TCP и по RTU одинаково. Посылка должна иметь фиксированную длину 17 слов (34 байта) с адреса 2000; на посылку иной длины или с другого адреса прибор отвечает исключением (раздел 1.3).
Обычный ответ на команду означает, что она принята; результат записи появляется в регистре 1001 (раздел 2.1): сразу после приёма в полубайте антенны 0, после выполнения — код результата. Пока принятая команда не начала выполняться, следующая команда записи получает исключение 06.
5.1Таблица 3. Формат записи (адреса 2000–2016)
| Параметр | Адрес | R/W, тип | Описание |
|---|---|---|---|
| Антенна, банк памяти метки | 2000 | W, [Byte:Byte] | ANT — номер антенны 1…4 (обязателен). BANK — банк памяти: EPC 0x01, TID 0x02, USER 0x03. |
| EPC метки для записи | 2001–2006 | W, массив 12 байт (6 слов) | Если массив заполнен нулями, запись выполняется в любую метку в поле действия антенны. |
| Access Password | 2007–2008 | W, массив 4 байта (2 слова) | Нули — пароль не используется. Если память метки закрыта паролем, его необходимо указать. |
| Смещение и длина данных (в словах) | 2009 | W, [Byte:Byte] | USER — смещение может быть с 0x00. EPC — минимальное смещение 0x02 (первые секторы служебные). Длина — не больше 6 слов. Максимум смещения зависит от чипа метки. |
| Данные для записи в память метки | 2010–2015 | W, массив 12 байт (6 слов) | Фиксированная длина 12 байт (6 слов). |
| Подтверждение звуковым сигналом | 2016 | W, [Byte:0x00] | 0x00 — тишина, 0x01 — подтверждение успешной записи бузером. |
5.2Пример записи в память USER
Запись в пользовательскую память (USER) антенной №1:
| Адрес | Значение | Смысл |
|---|---|---|
| 2000 | 0x0103 | Антенна №1, банк USER (0x03) |
| 2001–2006 | 0101010305441FFFFF003448 | EPC метки, в которую пишем (12 байт) |
| 2007–2008 | 00000000 | Access Password не используется |
| 2009 | 0x0001 | Смещение 0x00, длина 1 слово (2 байта) |
| 2010 | 0xABCD | Записываемые данные |
| 2016 | 0x0100 | Подтвердить запись звуковым сигналом |

6Управление сканированием — Write Single Register (0x06)
Запись в регистр 1000 функцией 06 включает и выключает сканирование меток. Ответ — эхо запроса. Любое другое значение — исключение 03, другой регистр — исключение 02.
| Значение | Действие | Кадр RTU (адрес 1) |
|---|---|---|
| 0 | Выключить непрерывное сканирование | 01 06 03 E8 00 00 09 BA |
| 1 | Включить непрерывное сканирование | 01 06 03 E8 00 01 C8 7A |
| 2 | Выполнить один цикл опроса меток (непрерывное сканирование при этом выключается) | 01 06 03 E8 00 02 88 7B |
7Файлы конфигурации и примечания
Готовые файлы конфигурации Modbus Poll
Для упрощения тестирования и настройки считывателя при первом знакомстве с устройством доступны готовые файлы конфигурации Modbus Poll — для опроса Holding Register 0x03 и для записи данных в метку через Write Multiple Registers (0x10). Ссылки на скачивание — на странице этого раздела сайта.
Версии встроенного ПО
Чтение (Holding Register 0x03) описано для версии ПО 4.15 и выше, запись (Write Multiple Registers 0x10) — для версии 3.26 и выше. В версии 5.03 от 30.09.2026:
- на ошибочные запросы прибор отвечает исключениями Modbus, а не молчит;
- функция 04 и управление сканированием (06) работают по TCP и по RTU, запись в метку (16) — тоже по обоим интерфейсам (раньше 06 была только в RTU, 16 — только в TCP);
- Modbus TCP обслуживает до 4 мастеров одновременно;
- адрес Modbus RTU — 1…247 (раньше до 127), адрес 0 — широковещательный;
- эстафета меток охватывает всю таблицу идентификации (раньше — первые 40 записей);
- секция антенны без меток обнуляется, короткий EPC дополняется нулями.
Ограничения записи
Посылка записи должна строго содержать 17 слов (34 байта). Для банка EPC запись возможна только со смещения 0x02. Банк TID у выпускаемых меток, как правило, закрыт на перезапись. Максимальные смещение и длина данных зависят от модели чипа метки.