Перейти к содержанию
ODRFID-RS485: Modbus RTU и AT-команды

ODRFID-RS485: Modbus RTU и AT-команды

Подключение ODRFID-RS485, чтение UID и типа метки из регистров Modbus, передача AT-команд, работа с памятью карт, входом, выходом и настройками.

ODRFID-RS485 работает по Modbus RTU как ведомое устройство на линии RS485. Получать карты можно двумя способами:

  • быстрый режим — читать тип и UID последней карты из готовых регистров 130–141;
  • AT-режим поверх Modbus — выбирать карту, читать и записывать её память, задавать формат данных, управлять входом, выходом и индикацией.

Купить ODRFID-RS485

Руководство относится к 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-битного регистра

Алгоритм для ПЛК или контроллера:

  1. Читайте 12 Holding Registers, всегда начиная с относительного адреса 130.
  2. Если регистр 130 равен 0, новых данных нет.
  3. Если значение равно N, возьмите младший байт из первых N регистров, начиная с 132. Регистр 131 содержит тип карты.
  4. После обработки запишите любое значение в регистр 130: это обнулит весь диапазон 130–141.
  5. Следующая запись появится при новом событии входа карты в поле. После очистки уберите текущую карту и поднесите её или другую карту снова.

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.

Данные карты в регистрах Modbus

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

Данные ODRFID-RS485 в веб-программе

Поддерживаемые функции Modbus

КодФункцияДля чего используется
03Read Holding RegistersUID, тип карты и буфер ответа AT-команды
04Read Input Registersразмер ответа AT-команды и наличие карты
06Write 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.

  1. Запишите любое значение в регистр 126, чтобы удалить предыдущий ответ.
  2. Команда должна начинаться с AT. Не добавляйте завершающий CR; если число байт нечётное, дополните последнюю пару нулевым байтом 0x00.
  3. Упакуйте каждые два байта в один 16-битный регистр и запишите диапазон с адреса 0.
  4. Обычный ответ Modbus означает, что команда принята. Modbus exception соответствует ответу ERROR в текстовом протоколе.
  5. Если команда возвращает данные, прочитайте их длину из Input Register 0, затем ceil(N / 2) Holding Registers с адреса 0. Используйте только первые N байт.
  6. После разбора снова очистите буфер записью в регистр 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+SUID, число блоков 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 в обратном порядке байтов
UrUID как одно десятичное число
hB1%*содержимое блока 1 в HEX нижнего регистра

Формат задаётся командой AT+F=... или в ODRFIDConfigM. После проверки его можно сохранить командой AT+P. Полный синтаксис, диапазоны байтов и примеры: строка форматирования RFID-вывода.

Коды ошибок карты

При ошибке операции считыватель может поместить в буфер строку +CME ERROR: <code>. Код — битовая маска, поэтому одновременно могут быть установлены несколько флагов.

БитЗначение
0x00000001ошибка протокола карты
0x00000002ошибка чётности
0x00000004ошибка контрольной суммы
0x00000008коллизия
0x00000010переполнение буфера
0x00000100тайм-аут операции
0x00000200MIFARE NAK
0x00000400ошибка аутентификации
0x00000800общая ошибка обмена с картой
0x00001000карта вернула больше данных, чем ожидалось
0x00002000ошибка целостности ответа карты

Сначала обработайте Modbus exception, затем прочитайте буфер: в нём может быть более точная причина +CME ERROR.

Коды типов карт

Регистр 131 и поле T команды AT+S используют одинаковые коды:

КодТип
0, 1, 2, 12MIFARE Classic 1K, 4K, Mini и 2K
3MIFARE Ultralight; некоторые версии прошивки также возвращают этот код для NTAG
4MIFARE Ultralight C, доступен только UID
5, 6MIFARE Ultralight EV1 80/164
7, 8MIFARE Plus S 2K/4K, SL1
9–11MIFARE DESFire; в этой модели используется только UID
13, 14MIFARE Plus X 2K/4K, SL1
15–18MIFARE Plus X, SL0/SL2/SL3
19, 22MIFARE Plus S, SL0/SL3
23, 24, 25NTAG 213/215/216
26MIFARE Ultralight Nano
28, 29NTAG 413/424
30, 31MIFARE Plus X/S 4K, SL3
32ISO 14443-4 / ISO 7816-4
33EMV-совместимая карта
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 с новыми параметрами или выполните контролируемый заводской сброс при физическом доступе.

Дополнительные материалы