Sidebar Left

Функции чтения Modbus: 0x01, 0x02, 0x03, 0x04

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

Функция Что читает Что возвращает
0x01 Дискретные выходы (coils) — биты, доступные и на чтение, и на запись Упакованные биты
0x02 Дискретные входы — биты только на чтение Упакованные биты
0x03 Регистры хранения — 16-битные слова на чтение и запись 16-битные слова
0x04 Входные регистры — 16-битные слова только на чтение 16-битные слова

На практике 90% работы — это функция 0x03: в регистрах хранения производители размещают почти всё, включая измеряемые величины.

0x03 — чтение регистров хранения
Читаем два регистра начиная с адреса 1 у устройства 17 (0x11):

11 03 00 01 00 02 97 5B

Байты Смысл
11 адрес устройства 17
03 функция
00 01 начальный адрес 1
00 02 два регистра
97 5B CRC16

Ответ с значениями 555 и 100:

11 03 04 02 2B 00 64 9B A9

Здесь 04 — число байт данных, дальше два регистра по два байта: 0x022B = 555 и 0x0064 = 100.

0x04 — чтение входных регистров
Запрос одного регистра с адреса 8:

11 04 00 08 00 01 B2 98

Ответ со значением 10:

11 04 02 00 0A F8 F4

Разница с 0x03 только в области данных. Многие устройства при этом дублируют одни и те же величины в обеих областях — если не читается одной функцией, стоит попробовать другую.

0x01 — чтение дискретных выходов
Читаем 37 бит начиная с адреса 19 (0x13):

11 01 00 13 00 25 0E 84

Ответ:

11 01 05 CD 6B B2 0E 1B 45 E6

Байт данных Двоичное представление Какие биты описывает
CD 1100 1101 биты 19–26, младший бит — самый первый запрошенный (адрес 19)
6B 0110 1011 биты 27–34
B2 1011 0010 биты 35–42
0E 0000 1110 биты 43–50
1B 0001 1011 биты 51–55, оставшиеся разряды дополнены нулями

Правило упаковки: в каждом байте младший бит соответствует меньшему адресу. Именно поэтому «единичный» бит с адреса 19 виден в CD как самый правый разряд. Байт 05 перед данными — их количество: 37 бит потребовали пять байт.

0x02 — чтение дискретных входов
Читаем 22 бита начиная с адреса 196 (0x00C4):

11 02 00 C4 00 16 BA A9

Ответ — три байта, в последнем значащими являются только шесть разрядов:

11 02 03 AC DB 35 20 18

Пределы за один запрос

Функция Максимум за один запрос
0x01, 0x02 2000 бит
0x03, 0x04 125 регистров
0x0F 1968 бит
0x10 123 регистра

Превышение даёт исключение «недопустимое значение данных». Но упираться в предел вредно и по другой причине: чем длиннее ответ, тем выше шанс поймать помеху на всю посылку. На зашумлённых линиях разумнее читать блоками по 20–30 регистров.

Читайте одним блоком
Если нужны регистры 100, 101 и 105, почти всегда быстрее прочитать шесть регистров одним запросом и отбросить лишние, чем сделать два запроса. Каждый запрос — это накладные расходы: пауза между кадрами, время оборота, ожидание ответа. На линии RS-485 со скоростью 9600 бод разница получается кратной.

← Все разделы справочника Modbus

Style Selector

Primary Color

Direction