Функции чтения 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 бод разница получается кратной.
