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

Регистр Modbus

Регистр Modbus — 16-битная ячейка в модели данных устройства, которую ведущий читает или записывает по протоколу Modbus. Путаница между номером регистра в документации и адресом в кадре — самая частая ошибка при настройке обмена.

Обновлено Редакция GAW

Регистр Modbus — 16-битный элемент данных устройства, к которому ведущий обращается по протоколу Modbus. Протокол описывает устройство как четыре таблицы данных; какие значения в них лежат и как они связаны с памятью прибора, решает производитель и описывает в карте регистров.

Четыре таблицы

ТаблицаЭлементДоступФункции
Coils — катушки1 битчтение и запись01, 05, 15
Discrete Inputs — дискретные входы1 биттолько чтение02
Input Registers — входные регистры16 биттолько чтение04
Holding Registers — регистры хранения16 битчтение и запись03, 06, 16

Названия пришли из контроллеров Modicon: катушкой (coil) там назывался дискретный выход. В каждой таблице можно адресовать 65 536 элементов.

Номер и адрес

В модели данных элементы нумеруются с единицы, а в кадре адресуются с нуля. В документации часто используется запись Modicon с цифрой таблицы впереди:

ЗаписьТаблицаФункция чтенияАдрес в кадре
0xxxxкатушки01номер − 1
1xxxxдискретные входы02номер − 10001
3xxxxвходные регистры04номер − 30001
4xxxxрегистры хранения03номер − 40001

Регистр 40108 — это функция 03 и адрес 107 = 0x006B. Запрос к адресу 40108 вместо 107 обращается к совсем другому регистру. Значения в регистрах передаются старшим байтом вперёд — подробнее о порядке байтов. Модель данных, функции и ошибки разобраны в статье о Modbus RTU, а собрать запрос с CRC и разобрать ответ поможет конструктор кадра Modbus RTU.

Частые вопросы

Чем регистры хранения отличаются от входных регистров?

Это две разные таблицы 16-битных слов. Входные регистры (input registers, запись 3xxxx) доступны только для чтения функцией 04. Регистры хранения (holding registers, запись 4xxxx) читают функцией 03 и записывают функциями 06 и 16. Адреса в каждой таблице считаются отдельно, с нуля.

Регистр 40001 — это какой адрес в запросе?

0x0000. Первая цифра 4 обозначает таблицу регистров хранения и в кадр не попадает — таблицу выбирает код функции 03. Остаток нумеруется с единицы, а в кадре адресуется с нуля: регистр 40108 — это функция 03 и адрес 107 = 0x006B.

Как передать по Modbus число float или 32-битное целое?

В двух соседних 16-битных регистрах — в протоколе других типов, кроме бита и 16-битного слова, нет. Каждый регистр передаётся старшим байтом вперёд, а порядок регистров и байтов внутри 32-битного числа приборы выбирают по-разному: ABCD, CDAB, BADC или DCBA. Его узнают в документации прибора.

Источники

  1. Modbus Organization. MODBUS Application Protocol Specification V1.1b3, 26.04.2012 — разд. 4 — модель данных: четыре таблицы, адресация с нуля, порядок байтов; разд. 5 и 6 — коды функций 01–06, 15, 16
  2. Modbus Organization. MODBUS over Serial Line Specification and Implementation Guide V1.02 — кадр RTU: адрес, код функции, данные, CRC

Нашли ошибку?