Протокол MODBUS RTU и TCP/IP для RFID-считывателей SAUK
Обмен данными с RFID-считывателем по протоколу Modbus: чтение обнаруженных меток через Holding Register 0x03 и запись данных в метку через Write Multiple Registers (0x10). Работает по сети (Modbus TCP/IP через Ethernet или Wi-Fi) и по проводным линиям (Modbus RTU через RS-485, RS-232).
Содержание
1Общие сведения
Ниже описан формат представления данных в регистре Holding Register 0x03 для встраиваемого ПО RFID-считывателей SAUK (версия 4.15 и выше):
- с сетевым интерфейсом Ethernet или Wi-Fi (Modbus TCP/IP);
- с проводными интерфейсами RS-485, RS-232 (Modbus RTU).
Описание приведено для 4-портового считывателя как общего случая. Для 1-портового считывателя или моноблока используется только часть, относящаяся к антенне №1. Данные от метки, идентифицированной соответствующей антенной, представлены в отдельных группах регистров.

2Чтение меток — Holding Register 0x03
Holding Register 0x03 по адресу 1000 содержит информацию об антеннах, в зоне действия которых находится RFID-метка. При наличии метки в поле антенны устанавливается флаг (значение полубайта 0x01); при пропадании метки флаг снимается.
2.1Таблица 1. Идентификация меток и результат записи (адреса 1000, 1001)
| Параметр | Адрес | R/W, тип | Описание |
|---|---|---|---|
| Метка в поле антенн [4:3:2:1] | 1000 | R, [Byte:Byte] | Примеры: 0x0100 — метка в поле антенны №3; 0x1111 — метка в поле всех 4 антенн. |
| Результат записи и коды ошибок [4:3:2:1] | 1001 | R, [Byte, Byte] | Запись выполняется командой Write Multiple Registers (0x10), а результат возвращается здесь — по 4 бита (полубайт) на каждую антенну. Коды см. ниже. |
Коды результата записи (на каждую антенну):
| Код | Значение |
|---|---|
| 0 | UNKNOWN — выставляется при новой попытке записи |
| 1 | SUCCESS — данные успешно записаны в память метки |
| 2 | NO TAG ERROR — метки нет в зоне действия |
| 3 | TAG WRITE ERROR — ошибка записи данных в метку |
| 4 | ACCESS PASSWORD ERROR — неверный пароль |
| F | UNKNOWN ERROR — неизвестная ошибка |
Ошибки формирования пакета мастером:
0xCCCC— неверный номер антенны (должен быть 1…4);0xDDDD— неверная длина данных (строго 17 слов / 34 байта);0xEEEE— неверный адрес (должен быть 2000).
Примеры результата: 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 | Системное время регистрации метки (32 бита). Пример: 0x2D79 0xC4FA = 06.03.2023 11:56:42. |
| Счётчик событий по метке | 1005 | R, word | Инкремент при каждом новом сканировании той же метки. |
| Уровень сигнала RSSI, dB | 1006 | R, word | Отрицательная величина, обычно от −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. |
| Банк доп. данных и количество | 1014 | R, [Byte, Byte] | Банк: EPC 0x01, TID 0x02, USER 0x03. |
| Данные из доп. памяти (EPC/TID/USER) | 1015–1020 | R, массив 12 байт (6 слов) | Например, TID-номер. Формат записи в регистры аналогичен EPC. |
| Секция | Диапазон адресов |
|---|---|
| Антенна №1 | 1002–1020 |
| Антенна №2 | 1021–1039 |
| Антенна №3 | 1040–1058 |
| Антенна №4 | 1059–1077 |

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

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

5Запись в метку — Write Multiple Registers (0x10)
Запись данных в память RFID-метки выполняется командой Write Multiple Registers 16 (0x10). Посылка должна иметь фиксированную длину 17 слов (34 байта); посылка иной длины считывателем не обрабатывается. Результат записи возвращается в Holding Register 0x03 по адресу 1001 (см. раздел 2.1).
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 (первые секторы служебные). Максимум зависит от чипа метки. |
| Данные для записи в память метки | 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 | 0101010305441FFFFFF003448 | EPC метки, в которую пишем (12 байт) |
| 2007–2008 | 00000000 | Access Password не используется |
| 2009 | 0x0001 | Смещение 0x00, длина 1 слово (2 байта) |
| 2010 | 0xABCD | Записываемые данные |
| 2016 | 0x0100 | Подтвердить запись звуковым сигналом |

6Файлы конфигурации и примечания
Готовые файлы конфигурации Modbus Poll
Для упрощения тестирования и настройки считывателя при первом знакомстве с устройством доступны готовые файлы конфигурации Modbus Poll — для опроса Holding Register 0x03 и для записи данных в метку через Write Multiple Registers (0x10). Ссылки на скачивание — на странице этого раздела сайта.
Версии встроенного ПО
Описание чтения (Holding Register 0x03) приведено для версии ПО 4.15 и выше; описание записи (Write Multiple Registers 0x10) — для версии 3.26 и выше на примере 4-портового считывателя SAUK E4.
Ограничения записи
Посылка записи должна строго содержать 17 слов (34 байта). Для банка EPC запись возможна только со смещения 0x02. Банк TID у выпускаемых меток, как правило, закрыт на перезапись. Максимальные смещение и длина данных зависят от модели чипа метки.