
ODRFID-RS485: Modbus RTU и AT-команды
Подключение ODRFID-RS485, чтение UID и типа метки из регистров Modbus, передача AT-команд, работа с памятью карт, входом, выходом и настройками.
ODRFID-RS485 работает по Modbus RTU как ведомое устройство на линии RS485. Получать карты можно двумя способами:
- быстрый режим — читать тип и UID последней карты из готовых регистров
130–141; - AT-режим поверх Modbus — выбирать карту, читать и записывать её память, задавать формат данных, управлять входом, выходом и индикацией.
Руководство относится к ODRFID-RS485. Для USB-моделей ODRFID-M/N/E используйте отдельную инструкцию.
Подключение
| Параметр | Значение |
|---|---|
| Карты | MIFARE и NTAG, 13,56 МГц |
| Интерфейс | RS485, Modbus RTU slave |
| Параметры по умолчанию | 115200 8N1 |
| Адрес по умолчанию | 0x5F (95) |
| Устройств на шине | до 64 |
| Питание | DC 7–24 В, номинально 12 В |
| Размер в корпусе | 115 × 75 × 20 мм |
| Вход | около 3 В, внутренняя подтяжка к логической 1 |
| Выход | открытый коллектор без подтяжки, до 30 В и 100 мА |
Соблюдайте полярность A/B. На длинной линии установите терминаторы 120 Ом на обоих физических концах шины и проверьте общий провод, если он нужен в вашей топологии. У каждого устройства должен быть уникальный Modbus-адрес.
Кнопка подключается между IN и GND. Выход OUT при включении соединяет
нагрузку с GND, но сам не выдаёт напряжение. Большинство замков потребляет
больше 100 мА, поэтому замок подключают через внешний релейный или
MOSFET-драйвер. Схемы приведены в руководстве по подключению кнопки, замка и
внешних сигналов.
Быстрый старт: UID в регистрах 130–141
В автоматическом режиме считыватель заполняет регистры при появлении новой карты в поле:
| Holding Register | Содержимое |
|---|---|
130 (0x82) | длина UID в байтах; 0, если новых данных нет |
131 (0x83) | числовой код типа карты |
132–141 (0x84–0x8D) | до 10 байт UID: по одному байту в младшей части каждого 16-битного регистра |
Алгоритм для ПЛК или контроллера:
- Читайте 12 Holding Registers, всегда начиная с относительного адреса
130. - Если регистр
130равен0, новых данных нет. - Если значение равно
N, возьмите младший байт из первыхNрегистров, начиная с132. Регистр131содержит тип карты. - После обработки запишите любое значение в регистр
130: это обнулит весь диапазон130–141. - Следующая запись появится при новом событии входа карты в поле. После очистки уберите текущую карту и поднесите её или другую карту снова.
Input Register 1 показывает текущее наличие карты: 0 — карты нет, другое
значение — карта обнаружена. Это состояние, а не очередь событий. Используйте
его в автоматическом режиме; при ручном опросе значение может отражать
результат последней операции, а не непрерывно обновляемое состояние поля.
Пример чтения через mbpoll:
mbpoll -m rtu -a 0x5f -r 130 -0 -c 12 -t 4:hex -b 115200 -P none /dev/ttyUSB0
Ключ -0 включает относительную нумерацию с нуля. Если мастер показывает
адреса вида 40001, сверьте его правило пересчёта: в Modbus-кадре передаётся
именно относительный адрес 130.

В веб-программе odrfid485.unitx.pro эти регистры можно проверить без ручного разбора Modbus-кадров.

Поддерживаемые функции Modbus
| Код | Функция | Для чего используется |
|---|---|---|
03 | Read Holding Registers | UID, тип карты и буфер ответа AT-команды |
04 | Read Input Registers | размер ответа AT-команды и наличие карты |
06 | Write Single Register | очистка буфера, сброс данных карты, перезагрузка |
16 (0x10) | Write Multiple Registers | передача AT-команды |
Остальные коды функций не поддерживаются и возвращают Modbus exception.
Карта регистров
Input Registers
| Адрес | Назначение |
|---|---|
0 | число байт, ожидающих чтения во внутреннем буфере ответа AT-команды |
1 | наличие карты: 0 — нет, ненулевое значение — есть |
Input Register 0 не относится к диапазону последней карты 130–141.
Он нужен только при обмене AT-командами через регистры 0–125.
Holding Registers
| Адрес | Чтение | Запись |
|---|---|---|
0–125 (0x00–0x7D) | байты ответа AT-команды | ASCII-байты AT-команды |
126 (0x7E) | — | любое значение очищает буфер AT-ответа |
127 (0x7F) | — | любое значение перезагружает устройство |
128 (0x80) | — | перезапуск в загрузчик DFU |
130 (0x82) | длина UID | любое значение очищает 130–141 |
131 (0x83) | тип карты | — |
132–141 (0x84–0x8D) | байты UID | — |
143 (0x8F) | — | значение 0x4242 сбрасывает настройки и перезагружает устройство |
DFU не работает как Modbus RTU: после перехода в загрузчик обновление выполняют
отдельно от штатного обмена по шине. Сброс через регистр 143 также возвращает
адрес и параметры порта к заводским значениям, поэтому используйте его только
при физическом доступе к устройству.
Как передать AT-команду через Modbus
AT-команда кодируется ASCII-байтами и записывается функцией 16 в Holding
Registers 0–125.
- Запишите любое значение в регистр
126, чтобы удалить предыдущий ответ. - Команда должна начинаться с
AT. Не добавляйте завершающийCR; если число байт нечётное, дополните последнюю пару нулевым байтом0x00. - Упакуйте каждые два байта в один 16-битный регистр и запишите диапазон с
адреса
0. - Обычный ответ Modbus означает, что команда принята. Modbus exception
соответствует ответу
ERRORв текстовом протоколе. - Если команда возвращает данные, прочитайте их длину из Input Register
0, затемceil(N / 2)Holding Registers с адреса0. Используйте только первыеNбайт. - После разбора снова очистите буфер записью в регистр
126.
Например, AT+SCAN0 содержит восемь байт и записывается как четыре регистра:
ASCII: A T + S C A N 0
HEX: 41 54 2B 53 43 41 4E 30
Registers: 4154 2B53 4341 4E30
Команда AT+G? содержит пять байт, поэтому дополняется нулём:
ASCII: A T + G ? \0
Registers: 4154 2B47 3F00
Если Input Register 0 после неё равен 9, прочитайте пять Holding Registers
с адреса 0 и оставьте первые девять байт. Типичный ответ:
\r\n+G=33\r\n
Пакеты OK и ERROR в Modbus-исполнении в буфер не помещаются: результат
передаётся обычным ответом или исключением Modbus.
Основные AT-команды
Команды чувствительны к регистру: AT+I и AT+i выполняют разные операции.
Поиск и выбор карты
| Команда | Назначение |
|---|---|
ATI | версия прошивки и серийный номер |
ATH | очистить внутренний буфер |
AT+SCAN0 | ручной режим; нужен для выбора карты и работы с памятью |
AT+SCAN1 | автоматическое сканирование и заполнение регистров 130–141 |
AT+SCAN2 | совместимый автоматический режим; работает так же, как SCAN1 |
AT+SCAN? | прочитать текущий режим |
AT+I | перечислить все карты в поле; операция асинхронная |
AT+i | выбрать первую карту |
AT+n | выбрать следующую карту 13,56 МГц |
AT+SELECT=<UID> | выбрать карту по UID |
AT+C=<UID> | проверить наличие UID, не меняя выбранную карту |
AT+S | UID, число блоков BC, размер блока BS и код типа T выбранной карты |
Перед AT+i, AT+n, AT+SELECT, AT+S, чтением или записью памяти включите
AT+SCAN0. Команда AT+I может временно занять считыватель; если он возвращает
Modbus exception 6 (Slave Device Busy) или не отвечает, повторите опрос через
короткий интервал.
SCAN1 и SCAN2 выдают форматированные данные при появлении карты и не
формируют отдельное сообщение об удалении. Для контроля фактического
наличия карты опрашивайте Input Register 1.
Чтение и запись памяти
У MIFARE Classic ключ относится к сектору, а не к отдельному блоку. Команды
AT+KA и AT+KB задают ключ, которым считыватель аутентифицирует сектор перед
AT+R или AT+W; сами ключи и биты доступа записывают в служебный блок сектора
(sector trailer) при выпуске карты. Чтение случайного значения из такого
сектора позволяет контроллеру отличить простую копию UID. Более сильные
варианты разобраны в статье «Защита от клонов меток
(антиклон)».
| Команда | Назначение |
|---|---|
AT+KA<12 HEX> | задать шестибайтный Key A для MIFARE Classic |
AT+KB<12 HEX> | задать шестибайтный Key B для MIFARE Classic |
AT+KU<8 HEX> | задать четырёхбайтный пароль Ultralight EV1 или NTAG |
AT+KP | выполнить Ultralight/NTAG-аутентификацию и получить PACK |
AT+KX<32 HEX> | задать 16-байтный ключ MIFARE Plus |
AT+K? | прочитать текущие ключи |
AT+R<block> | прочитать блок выбранной карты |
AT+W<block>:<HEX> | записать блок выбранной карты |
AT+VI<block>:<value> | увеличить MIFARE value block |
AT+VD<block>:<value> | уменьшить MIFARE value block |
AT+K?возвращает настроенные ключи, а Modbus RTU не обеспечивает конфиденциальность. Используйте команды ключей только на контролируемой шине, ограничьте доступ к мастеру и не публикуйте Modbus через прозрачный сетевой шлюз.
Номер блока можно передавать в десятичном виде или с префиксом 0x. Ответ
AT+S подсказывает допустимое число блоков и размер каждого блока.
Не записывайте блок
0и sector trailer MIFARE Classic без точного понимания структуры карты, ключей и битов доступа. Ошибочная запись может изменить UID клона или закрыть доступ к сектору. Полный протокол также содержит команды изменения UID и уровней безопасности; для типового сценария интеграции они не нужны.
Индикация, вход и выход
| Команда | Назначение |
|---|---|
AT+D1=0/1/2 | выключить, включить или заставить мигать зелёный светодиод |
AT+D2=0/1 | выключить или включить красный светодиод |
AT+B=0/1 | выключить или включить зуммер |
AT+Y=0/1 | выключить выход или соединить OUT с GND |
AT+Y? | прочитать состояние выхода |
AT+y? | прочитать вход: 0 — замкнут на GND, 1 — отпущен |
AT+RF=0/1 | выключить или включить радиочастотное поле |
Команды AT+L0/1 и AT+Z0/1 отдельно разрешают или запрещают автоматическую
штатную индикацию при чтении карты. Они не мешают прямому управлению через
AT+D1, AT+D2 и AT+B.
Настройки
| Команда | Назначение |
|---|---|
AT+T? / AT+T<мс> | прочитать или задать интервал автоматического опроса |
AT+G? / AT+G=<дБ> | прочитать или задать усиление тракта 13,56 МГц |
AT+F? / AT+F=<формат> | прочитать или задать строку форматирования |
AT+P | сохранить текущую конфигурацию в энергонезависимой памяти |
AT+[? | прочитать адрес и параметры RS485 |
AT+[=<a>,<s>,<p>,8,<r>,<t> | задать адрес, стоп-биты, чётность, скорость и межсимвольный тайм-аут |
AT+Q | перезагрузить устройство |
AT+X | перейти во встроенный загрузчик, если он доступен |
Поддерживаемые уровни усиления: 18, 23, 33, 38, 43 и 48 дБ.
Промежуточное значение округляется вверх до ближайшего поддерживаемого.
Ответ на AT+[? по умолчанию выглядит так:
+[=95,10,0,8,115200,10
Здесь 95 — адрес, 10 — один стоп-бит, 0 — без чётности, 8 — биты
данных, 115200 — скорость, 10 — межсимвольный тайм-аут. Адрес допустим в
диапазоне 1–247; чётность: 0 — none, 1 — odd, 2 — even. Новые параметры
сохраняются и начинают действовать после перезагрузки. Перед изменением
убедитесь, что Modbus master сможет открыть линию с новыми настройками.
AT+P записывает настройки во флеш-память. Не вызывайте её при каждом чтении
карты: сначала проверьте конфигурацию, затем сохраните один раз.
Строка форматирования: что именно вернуть системе
Строка форматирования задаёт не абстрактные «данные карты», а конкретный результат:
- весь UID или выбранный диапазон его байтов;
- прямой или обратный порядок байтов;
- HEX, десятичное представление или ASCII;
- содержимое нужного блока памяти;
- постоянный префикс и разделители.
Примеры:
| Формат | Результат |
|---|---|
HU* | весь UID в HEX верхнего регистра |
hU* | весь UID в HEX нижнего регистра |
HU~ | UID в обратном порядке байтов |
Ur | UID как одно десятичное число |
hB1%* | содержимое блока 1 в HEX нижнего регистра |
Формат задаётся командой AT+F=... или в ODRFIDConfigM. После проверки его
можно сохранить командой AT+P. Полный синтаксис, диапазоны байтов и примеры:
строка форматирования RFID-вывода.
Коды ошибок карты
При ошибке операции считыватель может поместить в буфер строку
+CME ERROR: <code>. Код — битовая маска, поэтому одновременно могут быть
установлены несколько флагов.
| Бит | Значение |
|---|---|
0x00000001 | ошибка протокола карты |
0x00000002 | ошибка чётности |
0x00000004 | ошибка контрольной суммы |
0x00000008 | коллизия |
0x00000010 | переполнение буфера |
0x00000100 | тайм-аут операции |
0x00000200 | MIFARE NAK |
0x00000400 | ошибка аутентификации |
0x00000800 | общая ошибка обмена с картой |
0x00001000 | карта вернула больше данных, чем ожидалось |
0x00002000 | ошибка целостности ответа карты |
Сначала обработайте Modbus exception, затем прочитайте буфер: в нём может быть
более точная причина +CME ERROR.
Коды типов карт
Регистр 131 и поле T команды AT+S используют одинаковые коды:
| Код | Тип |
|---|---|
0, 1, 2, 12 | MIFARE Classic 1K, 4K, Mini и 2K |
3 | MIFARE Ultralight; некоторые версии прошивки также возвращают этот код для NTAG |
4 | MIFARE Ultralight C, доступен только UID |
5, 6 | MIFARE Ultralight EV1 80/164 |
7, 8 | MIFARE Plus S 2K/4K, SL1 |
9–11 | MIFARE DESFire; в этой модели используется только UID |
13, 14 | MIFARE Plus X 2K/4K, SL1 |
15–18 | MIFARE Plus X, SL0/SL2/SL3 |
19, 22 | MIFARE Plus S, SL0/SL3 |
23, 24, 25 | NTAG 213/215/216 |
26 | MIFARE Ultralight Nano |
28, 29 | NTAG 413/424 |
30, 31 | MIFARE Plus X/S 4K, SL3 |
32 | ISO 14443-4 / ISO 7816-4 |
33 | EMV-совместимая карта |
255 | неизвестный тип |
Код 27 обозначает EM41xx 125 кГц и к ODRFID-RS485 не относится. Эта модель
рассчитана на карты 13,56 МГц.
Программы настройки
ODRFIDConfigM настраивает адрес, порт, индикацию, режим работы, ключи и строку форматирования. Встроенная консоль позволяет проверить AT-команды до подключения ПЛК или SCADA.


Типовые ошибки интеграции
- Нет ответа вообще: проверьте питание, A/B,
115200 8N1, адрес0x5F, общий провод и отсутствие конфликта адресов. - UID читается неверно: берите младший байт каждого регистра
132–141и только столько байт, сколько указано в130. - Часть UID читается неверно: из-за errata некоторых версий прошивки всегда
запрашивайте диапазон начиная с регистра
130, даже если нужен только UID. - AT-команда возвращает ошибку: не добавляйте
CR, не добавляйте пробелы и дополните нечётную команду нулевым байтом. - Смешаны два буфера: регистр
126очищает ответ AT-команды, а запись в130очищает данные последней карты. - После очистки
130карта не появляется снова: уберите её из поля и поднесите повторно — диапазон обновляется по событию появления. - Команды памяти не работают: включите
AT+SCAN0, выберите карту, проверьте её тип, размер блока и ключ аутентификации. - После изменения порта потеряна связь: откройте master с новыми параметрами или выполните контролируемый заводской сброс при физическом доступе.