Описание взято с сайта: https://ipc2u.ru/articles/prostye-resheniya/modbus-rtu/
Информация о настройке устройств для работы с ModBus приведена в статье "Настройка ModBus".
Список функций для работы с ModBus через Complex Events
Modbus — коммуникационный протокол, основан на архитектуре ведущий-ведомый (master-slave). Использует для передачи данных интерфейсы RS-485, RS-422, RS-232, а также Ethernet сети TCP/IP (протокол Modbus TCP).
Сообщение Modbus RTU состоит из адреса устройства SlaveID, кода функции, специальных данных в зависимости от кода функции и CRC контрольной суммы:
SlaveID Код_функции Специальные_данные CRC
Если отбросить SlaveID адрес и CRC контрольную сумму, то получится PDU (Protocol Data Unit).
ID | PDU | CRC | |
---|---|---|---|
SlaveID | Код_функции | Специальные_данные | CRC |
SlaveID – это адрес устройства, может принимать значение от 0
до 247
(адреса с 248 до 255 зарезервированы).
Данные в модуле хранятся в 4 таблицах.
Две таблицы доступны только для чтения и две для чтения-записи.
В каждой таблице помещается 9999
значений.
Номер регистра DEC | Адрес регистра HEX | Доступ | Название | Тип |
---|---|---|---|---|
1 -9999 |
0x0000 ..0x270E |
Чтение-запись | Discrete Output Coils | DO |
10001 -19999 |
0x0000 ..0x270E |
Чтение | Discrete Input Contacts | DI |
30001 -39999 |
0x0000 ..0x270E |
Чтение | Analog Input Registers | AI |
40001 -49999 |
0x0000 ..0x270E |
Чтение-запись | Analog Output Holding Registers | AO |
Приведем таблицу с Кодами функций чтения и записи регистров Modbus RTU.
Код функции | Назначение | Тип | Доступ |
---|---|---|---|
1 (0x01 ) |
Чтение DO | Дискретное | Чтение |
2 (0x02 ) |
Чтение DI | Дискретное | Чтение |
3 (0x03 ) |
Чтение AO | 16 битное | Чтение |
4 (0x04 ) |
Чтение AI | 16 битное | Чтение |
5 (0x05 ) |
Запись одного DO | Дискретное | Запись |
6 (0x06 ) |
Запись одного AO | 16 битное | Запись |
15 (0x0F ) |
Запись нескольких DO | Дискретное | Запись |
16 (0x10 ) |
Запись нескольких AO | 16 битное | Запись |
В сообщении Modbus используется именно Адрес регистра.
Например, первый регистр AO (Holding Register), имеет номер 40001
, но его адрес равен 0х0000
.
Разница между этими двумя величинами есть смещение offset
.
Каждая таблица имеет свое смещение, соответственно: 1
, 10001
, 30001
и 40001
.
Ниже приведен пример запроса Modbus RTU для получения значения AO
аналогового выхода (holding registers) из регистров от 40108
до 40110
с адресом устройства 17
.
11 03 006B 0003 7687
11 |
Адрес устройства SlaveID (17 = 11 hex) |
03 |
Функциональный код Function Code (читаем Analog Output Holding Registers) |
006B |
Адрес первого регистра (40108-40001 = 107 =6B hex) |
0003 |
Количество требуемых регистров (чтение 3-х регистров с 40108 по 40110) |
7687 |
Контрольная сумма CRC |
В ответе от Modbus RTU Slave устройства мы получим:
11 03 06 AE41 5652 4340 49AD
11 |
Адрес устройства (SlaveID) |
03 |
Функциональный код |
06 |
Количество байт далее |
AE |
Значение старшего разряда регистра (AO0) |
41 |
Значение младшего разряда регистра (AO0) |
56 |
Значение старшего разряда регистра (AO1) |
52 |
Значение младшего разряда регистра (AO1) |
43 |
Значение старшего разряда регистра (AO2) |
40 |
Значение младшего разряда регистра (AO2) |
49 |
Контрольная сумма стрший разряд |
AD |
Контрольная сумма младший разряд |
Регистр аналогового выхода AO0 имеет значение 0xAE41
или 44609
в десятичной системе.
Регистр аналогового выхода AO1 имеет значение 0x5652
или 22098
в десятичной системе.
Регистр аналогового выхода AO2 имеет значение 0x4340
или 17216
в десятичной системе.
Значение 0xAE41
- это 16 бит 1010 1110 0100 0001
, может принимать различное значение, в зависимости от типа представления.
Значение регистра 40108
при комбинации с регистром 40109
дает 32 бит значение.
Пример представления:
Тип представления | Диапазон значений | Пример в HEX | Пример в десятичной форме |
---|---|---|---|
16-bit unsigned integer | 0 до 65535 | AE41 |
44609 |
16-bit signed integer | -32768 до 32767 | AE41 |
-20927 |
two character ASCII string | 2 знака | AE41 |
®A |
discrete on/off value | 0 и 1 | 0001 |
0001 |
32-bit unsigned integer | 0 до 4294967295 | AE415652 |
2923517522 |
32-bit signed integer | -2147483648 до 2147483647 | AE415652 |
-1371449774 |
32-bit IEEE floating point number | 1.2*10−38 до 3.4*10+38 | AE415652 |
-4.395978E-11 |
four character ASCII string | 4 знака | AE415652 |
®AVR |
Эта команда используется для чтения значений дискретных выходов DO.
В запросе PDU задается начальный адрес первого регистра DO и последующее количество необходимых значений DO. В PDU значения DO адресуются, начиная с нуля.
Значения DO в ответе находятся в одном байте и соответствуют значению битов.
Значения битов определяются как:
1
= ON
0
= OFF
Младший бит первого байта данных содержит значение DO адрес которого указывался в запросе. Остальные значения DO следуют по нарастающей к старшему значению байта (т.е. справа на лево).
Если запрашивалось меньше восьми значений DO, то оставшиеся биты в ответе будут заполнены нулями (в направлении от младшего к старшему байту). Поле Количество байт далее (Byte Count) указывает количество полных байтов данных в ответе.
Пример запроса DO с 20
по 56
для SlaveID адреса устройства 17
. Адрес первого регистра будет 0x0013
= 19
, т.к. счет ведется с 0 адреса (регистр 20, затем -1 смещение нуля, получаем 19).
Байт | Запрос | Байт | Ответ |
---|---|---|---|
(Hex) | Название поля | (Hex) | Название поля |
11 |
Адрес устройства | 11 |
Адрес устройства |
01 |
Функциональный код | 01 |
Функциональный код |
00 |
Адрес первого регистра Hi байт | 05 |
Количество байт далее |
13 |
Адрес первого регистра Lo байт | CD |
Значение регистра DO 27-20 (11001101 ) |
00 |
Количество регистров Hi байт | 6B |
Значение регистра DO 35-28 (01101011 ) |
25 |
Количество регистров Lo байт | B2 |
Значение регистра DO 43-36 (10110010 ) |
0E |
Контрольная сумма CRC Hi байт | 0E |
Значение регистра DO 51-44 (00001110 ) |
84 |
Контрольная сумма CRC Lo байт | 1B |
Значение регистра DO 56-52 (00011011 ) |
45 |
Контрольная сумма CRC Hi байт | ||
E6 |
Контрольная сумма CRC Lo байт |
Состояния выходов DO 27-20 показаны как значения байта 0xCD
hex, или в двоичной системе 11001101
.
В регистре DO 56-52 5 битов справа были запрошены, а остальные биты заполнены нулями до полного байта (00011011).
Каналы | DO 56 | DO 55 | DO 54 | DO 53 | DO 52 | |||
---|---|---|---|---|---|---|---|---|
Биты | 0 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
Hex | 1B |
Эта команда используется для чтения значений дискретных входов DI.
Пример запроса DI с регистров от 10197
до 10218
для SlaveID адреса устройства 17
. Адрес первого регистра будет 0x00C4
hex = 196 (т.к. счет ведется с 0 адреса).
Байт | Запрос | Байт | Ответ |
---|---|---|---|
(Hex) | Название поля | (Hex) | Название поля |
11 |
Адрес устройства | 11 |
Адрес устройства |
02 |
Функциональный код | 02 |
Функциональный код |
00 |
Адрес первого регистра Hi байт | 03 |
Количество байт далее |
C4 |
Адрес первого регистра Lo байт | AC |
Значение регистра DI 10204-10197 (10101100 ) |
00 |
Количество регистров Hi байт | DB |
Значение регистра DI 10212-10205 (11011011 ) |
16 |
Количество регистров Lo байт | 35 |
Значение регистра DI 10218-10213 (00110101 ) |
BA |
Контрольная сумма CRC Hi байт | 20 |
Контрольная сумма CRC Hi байт |
A9 |
Контрольная сумма CRC Lo байт | 18 |
Контрольная сумма CRC Lo байт |
Эта команда используется для чтения значений аналоговых выходов AO.
Пример запроса AO с регистров от 40108
до 40110
для SlaveID адреса устройства 17
. Адрес первого регистра будет 0x006B
hex = 107 (т.к. счет ведется с 0 адреса).
Байт | Запрос | Байт | Ответ |
---|---|---|---|
(Hex) | Название поля | (Hex) | Название поля |
11 |
Адрес устройства | 11 |
Адрес устройства |
03 |
Функциональный код | 03 |
Функциональный код |
00 |
Адрес первого регистра Hi байт | 06 |
Количество байт далее |
6B |
Адрес первого регистра Lo байт | AE |
Значение регистра 40108 Hi байт |
00 |
Количество регистров Hi байт | 41 |
Значение регистра 40108 Lo байт |
03 |
Количество регистров Lo байт | 56 |
Значение регистра 40109 Hi байт |
76 |
Контрольная сумма CRC Hi байт | 52 |
Значение регистра 40109 Lo байт |
87 |
Контрольная сумма CRC Lo байт | 43 |
Значение регистра 40110 Hi байт |
40 |
Значение регистра 40110 Lo байт | ||
49 |
Контрольная сумма CRC Hi байт | ||
AD |
Контрольная сумма CRC Lo байт |
Эта команда используется для чтения значений аналоговых входов AI.
Пример запроса AI с регистра 30009
для SlaveID адреса устройства 17
. Адрес первого регистра будет 0x0008
hex = 8 (т.к. счет ведется с 0 адреса).
Байт | Запрос | Байт | Ответ |
---|---|---|---|
(Hex) | Название поля | (Hex) | Название поля |
11 |
Адрес устройства | 11 |
Адрес устройства |
04 |
Функциональный код | 04 |
Функциональный код |
00 |
Адрес первого регистра Hi байт | 02 |
Количество байт далее |
08 |
Адрес первого регистра Lo байт | 00 |
Значение регистра Hi 30009 |
00 |
Количество регистров Hi байт | 0A |
Значение регистра Lo 30009 |
01 |
Количество регистров Lo байт | F8 |
Контрольная сумма CRC Hi байт |
B2 |
Контрольная сумма CRC Hi байт | F4 |
Контрольная сумма CRC Lo байт |
98 |
Контрольная сумма CRC Lo байт |
Эта команда используется для записи одного значения дискретного выхода DO.
Значение 0xFF00
hex устанавливает выход в значение включен ON
.
Значение 0x0000
hex устанавливает выход в значение выключен OFF
.
Все остальные значения недопустимы и не будут влиять значение на выходе.
Нормальный ответ на такую команду - это эхо (повтор запроса в ответе), возвращается после того, как состояние DO было изменено.
Пример записи в DO с регистром 173
для SlaveID адреса устройства 17
. Адрес регистра будет 0x00AC
hex = 172 (т.к. счет ведется с 0 адреса).
Байт | Запрос | Байт | Ответ |
---|---|---|---|
(Hex) | Название поля | (Hex) | Название поля |
11 |
Адрес устройства | 11 |
Адрес устройства |
05 |
Функциональный код | 05 |
Функциональный код |
00 |
Адрес первого регистра Hi байт | 00 |
Адрес первого регистра Hi байт |
AC |
Адрес первого регистра Lo байт | AC |
Адрес первого регистра Lo байт |
FF |
Значение Hi байт | FF |
Значение Hi байт |
00 |
Значение Lo байт | 00 |
Значение Lo байт |
4E |
Контрольная сумма CRC Hi байт | 4E |
Контрольная сумма CRC Hi байт |
8B |
Контрольная сумма CRC Lo байт | 8B |
Контрольная сумма CRC Lo байт |
Состояние выхода DO173 поменялось с выключен
OFF
на включенON
.
Эта команда используется для записи одного значения аналогового выхода AO.
Нормальный ответ на такую команду - это эхо (повтор запроса в ответе), возвращается после того, как состояние AO было изменено.
Пример записи в AO с регистром 40002
для SlaveID адреса устройства 17
. Адрес первого регистра будет 0x0001
hex = 1 (т.к. счет ведется с 0 адреса).
Байт | Запрос | Байт | Ответ |
---|---|---|---|
(Hex) | Название поля | (Hex) | Название поля |
11 |
Адрес устройства | 11 |
Адрес устройства |
06 |
Функциональный код | 06 |
Функциональный код |
00 |
Адрес первого регистра Hi байт | 00 |
Адрес первого регистра Hi байт |
01 |
Адрес первого регистра Lo байт | 01 |
Адрес первого регистра Lo байт |
00 |
Значение Hi байт | 00 |
Значение Hi байт |
03 |
Значение Lo байт | 03 |
Значение Lo байт |
9A |
Контрольная сумма CRC Hi байт | 9A |
Контрольная сумма CRC Hi байт |
9B |
Контрольная сумма CRC Lo байт | 9B |
Контрольная сумма CRC Lo байт |
В регистре AO2 установлено значение
3
.
Эта команда используется для записи нескольких значений дискретного выхода DO.
Пример записи в несколько DO с регистрами от 20
до 29
для SlaveID адреса устройства 17
. Адрес регистра будет 0x0013
hex = 19 (т.к. счет ведется с 0 адреса).
Байт | Запрос | Байт | Ответ |
---|---|---|---|
(Hex) | Название поля | (Hex) | Название поля |
11 |
Адрес устройства | 11 |
Адрес устройства |
0F |
Функциональный код | 0F |
Функциональный код |
00 |
Адрес первого регистра Hi байт | 00 |
Адрес первого регистра Hi байт |
13 |
Адрес первого регистра Lo байт | 13 |
Адрес первого регистра Lo байт |
00 |
Количество регистров Hi байт | 00 |
Кол-во записанных регистров Hi байт |
0A |
Количество регистров Lo байт | 0A |
Кол-во записанных регистров Lo байт |
02 |
Количество байт далее | 26 |
Контрольная сумма CRC Hi байт |
CD |
Значение байт DO 27-20 (11001101 ) |
99 |
Контрольная сумма CRC Lo байт |
01 |
Значение байт DO 29-28 (00000001 ) |
||
BF |
Контрольная сумма CRC Hi байт | ||
0B |
Контрольная сумма CRC Lo байт |
В ответе возвращается количество записанных регистров.
Эта команда используется для записи нескольких значений аналогового выхода AO.
Пример записи в несколько AO с регистрами 40002
и 40003
для SlaveID адреса устройства 17
. Адрес первого регистра будет 0x0001
hex = 1 (т.к. счет ведется с 0 адреса).
Байт | Запрос | Байт | Ответ |
---|---|---|---|
(Hex) | Название поля | (Hex) | Название поля |
11 |
Адрес устройства | 11 |
Адрес устройства |
10 |
Функциональный код | 10 |
Функциональный код |
00 |
Адрес первого регистра Hi байт | 00 |
Адрес первого регистра Hi байт |
01 |
Адрес первого регистра Lo байт | 01 |
Адрес первого регистра Lo байт |
00 |
Количество регистров Hi байт | 00 |
Кол-во записанных регистров Hi байт |
02 |
Количество регистров Lo байт | 02 |
Кол-во записанных регистров Lo байт |
04 |
Количество байт далее | 12 |
Контрольная сумма CRC Hi байт |
00 |
Значение 40002 Hi байт | 98 |
Контрольная сумма CRC Lo байт |
0A |
Значение 40002 Lo байт | ||
01 |
Значение 40003 Hi байт | ||
02 |
Значение 40003 Lo байт | ||
C6 |
Контрольная сумма CRC Hi байт | ||
F0 |
Контрольная сумма CRC Lo байт |
В ответе возвращается количество записанных регистров.
Если устройство получило сообщение, но оно не может быть обработано, то устройство ответит кодом ошибки.
Ответ будет содержать измененный Функциональный код, старший бит которого будет равен 1
.
Функциональный код в запросе | Функциональный код ошибки в ответе | ||||
---|---|---|---|---|---|
(DEC) | (HEX) | (BIN) | (DEC) | (HEX) | (BIN) |
1 |
0x01 |
00000001 |
129 |
0x81 |
10000001 |
2 |
0x02 |
00000010 |
130 |
0x82 |
10000010 |
3 |
0x03 |
00000011 |
131 |
0x83 |
10000011 |
4 |
0x04 |
00000100 |
132 |
0x84 |
10000100 |
5 |
0x05 |
00000101 |
133 |
0x85 |
10000101 |
6 |
0x06 |
00000110 |
134 |
0x86 |
10000110 |
15 |
0x0F |
00001111 |
143 |
0x8F |
10001111 |
16 |
0x10 |
00010000 |
144 |
0x90 |
10010000 |
Пример запроса и ответ с ошибкой:
Байт | Запрос | Байт | Ответ |
---|---|---|---|
(Hex) | Название поля | (Hex) | Название поля |
0A |
Адрес устройства | 0A |
Адрес устройства |
01 |
Функциональный код | 81 |
Функциональный код с измененным битом |
04 |
Адрес первого регистра Hi байт | 02 |
Код ошибки |
A1 |
Адрес первого регистра Lo байт | B0 |
Контрольная сумма CRC Hi байт |
00 |
Количество регистров Hi байт | 53 |
Контрольная сумма CRC Lo байт |
01 |
Количество регистров Lo байт | ||
AC |
Контрольная сумма CRC Hi байт | ||
63 |
Контрольная сумма CRC Lo байт |
Код | Описание |
---|---|
1 (0x01 ) |
Принятый код функции не может быть обработан. |
2 (0x02 ) |
Адрес данных, указанный в запросе, недоступен. |
3 (0x03 ) |
Значение, содержащееся в поле данных запроса, является недопустимой величиной. |
4 (0x04 ) |
Невосстанавливаемая ошибка имела место, пока ведомое устройство пыталось выполнить затребованное действие. |
5 (0x05 ) |
Ведомое устройство приняло запрос и обрабатывает его, но это требует много времени. Этот ответ предохраняет ведущее устройство от генерации ошибки тайм-аута. |
6 (0x06 ) |
Ведомое устройство занято обработкой команды. Ведущее устройство должно повторить сообщение позже, когда ведомое освободится. |
7 (0x07 ) |
Ведомое устройство не может выполнить программную функцию, заданную в запросе. Этот код возвращается для неуспешного программного запроса, использующего функции с номерами 13 или 14 . Ведущее устройство должно запросить диагностическую информацию или информацию об ошибках от ведомого. |
8 (0x08 ) |
Ведомое устройство при чтении расширенной памяти обнаружило ошибку паритета. Ведущее устройство может повторить запрос, но обычно в таких случаях требуется ремонт. |
10 (0x0A ) |
Шлюз неправильно настроен или перегружен запросами. |
11 (0x0B ) |
Slave устройства нет в сети или от него нет ответа. |