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

ODRFID-485 (прошивка Modbus)

Устройство принимает команды и отправляет ответ через интерфейс RS485 по протоколу Modbus RTU.

Устройство использует набор AT команд, испольуземых в протоколе CDC, с минимальными отличиями.

Устройство использует/принимает только часть функций протокола Modbus RTU.

  • Чтение регистров ввода (код функции 4)
  • Чтение регистров хранения (код функции 3)
  • Установка одного регистра хранения (код функции 6)
  • Установка нескольких регистров хранения (код функции 16)
  • Все остальные коды функций не поддерживаются и вызовут исключение

Соглашение о нумерации

Согласно спецификации протокола MODBUS, регистры хранения занимают адресное пространство 40001-49999. Однако передаваемый адрес является относительным (0 для 40001, 1 для 40002 и т. д.). Здесь и далее в этом документе используются относительные адреса (начиная с нуля).

Регистры Modbus

Регистры ввода

  • 0 - возвращает размер (в байтах) внутренних данных, ожидающих чтения
  • 1 - индикатор наличия метки:

    • 0 - метки нет.
    • любое другое значение - метка есть.
    • поддерживается с версии 3.1. Предыдущие версии вернут исключение.
    • в ручном режиме - регистр хранит результат последней операции сканирования (AT+i, AT+n, и.т.д.). В действительности, метки уже может не быть - поскольку устройство не осуществляет самостоятельное сканирование, оно об этом не может узнать.
    • в автоматическом режиме - операция сканирования осуществляется раз в T миллисекунд (см. Конфигурация устройства). Регистр хранит результат последнего сканирования и обновляется, соответственно, раз в T миллисекунд. После перехода в режим автоматического сканирования необходимо подождать не менее T миллисекунд (рекомендуется 2 * T) прежде чем опрашивать данный регистр.
  • Все остальные регистры не поддерживаются, попытка прочитать их вызовет исключение

Регистры хранения

  • 0-125 (0x00 - 0x7D) - внутренний буфер данных

    • запись: отправить AT-команду на устройство. Начальный адрес не важен (рекомендуется использовать 0), до тех пор пока данные укладываются в указанный диапазон.
    • чтение: возвращает запрашиваемую часть внутреннего буфера данных.

      Чтобы узнать количество доступных данных, ожидающих чтения, запросите первый входной регистр (адрес 0). Доступные данные начинаются с адреса 0 и занимают N байт (N = [значение 1-го регистра ввода]) - т.е. K регистров, где K = ceil([значение 1-го регистра ввода] / 2)).

      Устройство не будет проверять, являются ли запрошенные внутренние данные действительными или нет, и всегда будет возвращать запрошенное количество байт. Операция чтения регистров не обнуляет количество доступных байт, то есть значение 1-го регистра ввода останется неизменным после операции чтения.

  • 126 (0x7E) - записать любое значение в этот регистр для обнуления числа байт, ожидающих чтения (1-й регистр ввода будет установлен в 0). Команда ингорируется если в данный момент осуществляется сканирование всех меток. В этом случае буфер не обнуляется.

  • 127 (0x7F) - записать любое значение в этот регистр, чтобы перезагрузить устройство.
  • 128 (0x80) - записать любое значение в этот регистр, чтобы перезапустить устройство и перевести его в режим DFU.

Attention

протокол DFU несовместим с протоколом Modbus RTU. Вы не сможете обновить прошивку устройства, не отключив его от линии Modbus.

  • 130 (0x82) - только начиная с версии 2.1. (только чтение в версии 2.1, чтение-запись начиная с 2.2)

    • чтение: размер UID последней отсканированной карты
    • запись: сбросить значение регистров 130-141 в ноль.
  • 131-141 (0x83 - 0x8D) - только начиная с версии 2.1 (только чтение)

    • 131 (0x83) - тип последней отсканированной карты (см. типы меток)
    • 132 - первый байт последней отсканированной карты
    • 133 - второй байт и.т.д.
    • 132-141 (0x84-0x8D) - первый, второй .и.т.д. байты UID последней отсканированной карты (количество регистров с данными опеределяется значением регистра 130)

Bug

пожалуйста, обратитесь к п.1 в Errata

  • 143 (0x8F) - только с версии 3.1 (только запись) - запись значения 0x4242 (16962) приведет к сбросу устройства к заводским настройкам (в.т.ч. адрес, скорость передачи данных, конфигурация устройства и.т.д.) и последующей перезагрузке.
  • Все остальные регистры не поддерживаются, попытка чтения/записи в них вызовет исключение.

Важно: регистры 130-141 активны только в режиме автоматического сканирования. Они не будут обновляться в ручном режиме.

Пример ввода последовательности команд №1:

Адрес устройства по умолчанию (идентификатор ведомого устройства Modbus) - 95 (0x5F)

  1. Удалите все ожидающие чтения данные: запишите 1 в регистр хранения 126

    >> 5F06007E0000E4AC

    << 5F06007E0000E4AC

  2. Отправьте команду AT (например, AT+SCAN0): запишите AT+SCAN0 в регистры хранения 0 , 1 , 2, 3 (т. к. K = sizeof(AT+SCAN0) / 2 = 8 / 2 = 4. Если команда занимает 7 байтов, она должна быть дополнена одним нулём - 0x00)

    >> 5F10000000040841542B5343414E304A48

    << 5F1000000004CCB4

    Устройство вернуло код успеха (0x10 вместо 0x90 для исключения), поэтому нет необходимости проверять ответ \r\nOK\r\n (или \r\nERROR\r\n), и он не передается устройством.

  3. Убедитесь, что нет данных, ожидающих чтения (их не должно быть, это действие показано здесь только в демонстрационных целях)

    >> 5F04000000013CB4

    << 5F0402000010FD

Пример ввода последовательности команд №2:

  1. Удалите все ожидающие чтения данные: запишите 1 в регистр хранения 126

    >> 5F06007E0000E4AC

    << 5F06007E0000E4AC

  2. Отправьте команду AT (например, AT+G?): Запишите AT+G?\0 в регистры хранения 0, 1, 2 (т. к. K = sizeof(AT+G?)/2 = 5/2 = 3 - c округлением в большую сторону).

    >> 5F10000000030641542B473F00A682

    << 5F10000000038D76

    Устройство вернуло код успеха, теперь мы можем запросить результат команды

  3. Проверьте количество байт, ожидающих чтения: прочитайте значение первого регистра ввода

    >> 5F04000000013CB4

    << 5F04020009D0FB

    Устройство сообщает о 9 байтах, ожидающих чтения. Нам нужно прочитать 5 регистров хранения (ceil (9/2) == 5).

  4. Прочитать внутренние данные в ожидании: прочитать соответствующее количество регистров хранения.

    >> 5F030000000588B7

    << 5F030A0D0A2B473D33330D0A30F147

    Обратите внимание на мусор (0x30) в конце данных - мы прочитали один дополнительный байт, который должен быть сброшен обрабатывающим программным обеспечением. Значимые данные составляют 9 байтов (0A0D0A2B473D33330D0A, т. е. \r\n+G=33\r\n).

  5. Важно: нужно сбросить ожидающие чтения данные (это то же самое, что и первый шаг. Программное обеспечение мастера может очищать данные как до, так и после команды (до тех пор, пока внутренний буфер не переполняется), но хотя бы один из шагов (1 либо 4) должен быть выполнен.

    >> 5F06007E0000E4AC

    << 5F06007E0000E4AC

Настройки порта

Настройки по умолчанию: 115200 бит/с, 8N1 (8 бит, 1 стоповый бит, без контроля четности), адрес устройства 0x5F (95). Эти настройки можно изменить с помощью команды AT+[, описанной ниже. Новые настройки сохраняются в энергонезависимой памяти и применяются после сброса устройства.

Формат пакета

(Это относится к данным, отправляемым и получаемым с помощью команд Чтение/Установка регистров хранения)

  • Данные мастер-устройство должны начинаться с ключевого слова AT и могут заканчиваться символом ноль (0x00), чтобы данные помещались в целое количество 16-битных регистров.

Note

в отличие от протокола CDC, символ возврата каретки (\r) опционален.

Bug

пожалуйста, обратитесь у п.2 в Errata.

  • Пакеты между устройствами и хостом начинаются и заканчиваются символом возврата каретки, за которым следует символ перевода строки (ASCII-коды 13,10 десятичные, 0x0d, 0x0a шестнадцатеричные, \r\n как строковый литерал C).
  • Ответ от устройства мастеру на запрос хост-устройства состоит из одного или нескольких пакетов.

    Примечание: в отличие от протокола CDC, пакеты \r\nOK\r\n и \r\nERROR\r\n не передаются. Код успеха или ошибки передаются в ответном пакете Modbus согласно протоколу Modbus RTU: MSB функционального кода сигнализирует об ошибке. * Не добавляйте ненужные символы пробела (пробел, табуляция, перевод строки и т. д.) к данным запроса - они не будут удалены анализатором командной строки, что приведет к ответу ОШИБКА.

Полное описание команд верхнего уровня см. в справочнике ODRFID (CDC). Обратите внимание, что пакеты \r\nOK\r\n и \r\nERROR\r\n отсутствуют. Различия перечислены ниже.

Сканирование всех меток.

Команда является асинхронной - UID отсканированного тега будет помещен в буфер (регистры хранения 0-125) после завершения процесса сканирования. Устройство не будет отвечать на запросы до тех пор, пока идет сканирование.

Управление вторым светодиодом

В дополнение к первому (зеленому) светодиоду, управляемому командой AT+D1, данное устройство имеет второй (красный) светодиод и поддерживает команду AT+D2.

Синтаксис:

Запрос AT+D2=[0|1] 0 - выключить второй светодиод,
1 - включить второй светодиод
Ответ Код успеха согласно протоколу Modbus RTU

Управление выходом

Данная команда (AT+Y=[0|1]) позволяет управлять состоянием выходного сигнала OUT (открытый коллектор, без подтяжки)

Синтаксис:

Запрос AT+Y=[0|1] Задать состояние OUT
0 - отключено (не подтянуто), 1 - включено (подключено к земле)
Ответ Код успеха согласно протоколу Modbus RTU

Пример

Запрос AT+Y=1\r Вывод OUT подключен к земле
Ответ Код успеха согласно протоколу Modbus RTU
Запрос AT+Y=0\r Вывод OUT не подтянут
Ответ Код успеха согласно протоколу Modbus RTU
Запрос AT+Y?\r Запрос состояния вывода OUT
Ответ +Y=0 Вывод OUT не подтянут

Чтение входного канала

Данная команда (AT+y?) позволяет запрашивать состояние входа (если присутствует).

Синтаксис:

Запрос AT+y? Запрос состояния входа
Ответ +y=0 или +y=1 0 - подтянут к земле, 1 - подтянут к питанию
OK

Управление UART/RS485

Эта команда запрашивает и устанавливает параметры, связанные с UART (скорость передачи, биты, четность и т. Д.). Возвращаемые значения - данные, которые сохранены в энергонезависимой памяти. Они могут отличаться от реальных в том случае, если они были изменены без последующей перезагрузки. Новые настройки сохраняются в энергонезависимой памяти немедленно и применяются при следующей перезагрузке.

Формат команды: AT+[=<a>,<s>,<p>,<b>,<r>,<t>

Значения, используемые в запросе и возвращаемые в ответе

  • <a> - адрес (1..247) в десятичном формате.
  • <s> - стоп биты
    • 10 - 1 стоп бит
    • 15 - 1.5 стоп бита
    • 20 - 2 стоп бита
  • <p> - четность
    • 0 - none
    • 1 - odd (с версии v 2.0)
    • 2 - even (с версии v 2.0)
  • <b> - количество бит данных (поддерживается только 8 бит, остальные значения принимаются, но игнорируются)
  • <r> - бодрейт
  • <t> - межсимвольный интервал

Attention

При изменении настроек, касающихся UART/RS485, все настройки (включая конфигурацию устройства) будут записаны (вызывается команда AT+P).

Пример:

Запрос AT+[?\r
Ответ +[=95,10,0,8,115200,10 115200 8N1, адрес 0x5F, таймаут 10ms

Errata

П.1 Регистры хранения 131-141

Версии ПО v2.1, v2.2
Действие Чтение произвольного количества регистров в указанном диапазоне
Ожидаемый ответ Тип и идентификатор метки
Полученный ответ Неверные данные
Решение При чтении регистром с адресом больше 131, необходимо всегда читать регистры начиная с адреса 130 используя функциональный код 3
Пример Чтение длины и идентификатора из регистров 132, 133, 134, 135
неверно чтение 4-х регистров - код 3, адрес 132, количество 4
верно чтение 6-ти регистров - код 3, адрес 130, количество 6

П.2 Символ конца пакета CR

Версии ПО все версии до v2.2 включительно
Действие завершение пакета от мастера устройству символом \r
Ожидаемый результат нормальная обработка пакета согласно протоколу
Полученный результат сообщение об ошибке modbus устройства
Решение Не добавлять символ \r в конец фрейма. Если необходимо дополнить фрейм символом для четности, необходимо использовать символ ноль \0