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 в регистр хранения 126
>> 5F06007E0000E4AC
<< 5F06007E0000E4AC
-
Отправьте команду 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
), и он не передается устройством. -
Убедитесь, что нет данных, ожидающих чтения (их не должно быть, это действие показано здесь только в демонстрационных целях)
>> 5F04000000013CB4
<< 5F0402000010FD
Пример ввода последовательности команд №2:
-
Удалите все ожидающие чтения данные: запишите 1 в регистр хранения 126
>> 5F06007E0000E4AC
<< 5F06007E0000E4AC
-
Отправьте команду AT (например,
AT+G?
): ЗапишитеAT+G?\0
в регистры хранения 0, 1, 2 (т. к.K = sizeof(AT+G?)/2 = 5/2 = 3
- c округлением в большую сторону).>> 5F10000000030641542B473F00A682
<< 5F10000000038D76
Устройство вернуло код успеха, теперь мы можем запросить результат команды
-
Проверьте количество байт, ожидающих чтения: прочитайте значение первого регистра ввода
>> 5F04000000013CB4
<< 5F04020009D0FB
Устройство сообщает о 9 байтах, ожидающих чтения. Нам нужно прочитать 5 регистров хранения (ceil (9/2) == 5).
-
Прочитать внутренние данные в ожидании: прочитать соответствующее количество регистров хранения.
>> 5F030000000588B7
<< 5F030A0D0A2B473D33330D0A30F147
Обратите внимание на мусор (0x30) в конце данных - мы прочитали один дополнительный байт, который должен быть сброшен обрабатывающим программным обеспечением. Значимые данные составляют 9 байтов (
0A0D0A2B473D33330D0A
, т. е.\r\n+G=33\r\n
). -
Важно: нужно сбросить ожидающие чтения данные (это то же самое, что и первый шаг. Программное обеспечение мастера может очищать данные как до, так и после команды (до тех пор, пока внутренний буфер не переполняется), но хотя бы один из шагов (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 |