Размер шрифта:
Просто о Modbus RTU с подробным описанием и примерами
Play

Просто о Modbus RTU с подробным описанием и примерами

Из данной статьи вы узнаете о протоколе Modbus RTU, который широко применяется в АСУ ТП. Англоязычная версия статьи доступна на сайте ipc2u.com. Описание протокола Modbus TCP можно найти в статье.

Описание протокола Modbus RTU

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.

SlaveID – это адрес устройства, может принимать значение от 0 до 247, адреса с 248 до 255 зарезервированы.

Данные в модуле хранятся в 4 таблицах.

Две таблицы доступны только для чтения и две для чтения-записи.

В каждой таблице помещается 9999 значений. Номер регистраАдрес регистра HEXТипНазваниеТип 1-99990000 до 270EЧтение-записьDiscrete Output CoilsDO 10001-199990000 до 270EЧтениеDiscrete Input ContactsDI 30001-399990000 до 270EЧтениеAnalog Input RegistersAI 40001-499990000 до 270EЧтение-записьAnalog Output Holding RegistersAO

В сообщении Modbus используется адрес регистра.

Например, первый регистр AO Holding Register, имеет номер 40001, но его адрес равен 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Адрес устройства (17 = 11 hex)SlaveID 03Функциональный кодFunction Code 06Количество байт далее (6 байтов идут следом)Byte Count AEЗначение старшего разряда регистра (AE hex)Register value Hi (AO0) 41Значение младшего разряда регистра (41 hex)Register value Lo (AO0) 56Значение старшего разряда регистра (56 hex)Register value Hi (AO1) 52Значение младшего разряда регистра (52 hex)Register value Lo (AO1) 43Значение старшего разряда регистра (43 hex)Register value Hi (AO2) 40Значение младшего разряда регистра (40 hex)Register value Lo (AO2) 49Контрольная суммаCRC value Lo ADКонтрольная суммаCRC value Hi

Регистр аналогового выхода AO0 имеет значение AE 41 HEX или 44609 в десятичной системе.

Регистр аналогового выхода AO1 имеет значение 56 52 HEX или 22098 в десятичной системе.

Регистр аналогового выхода AO2 имеет значение 43 40 HEX или 17216 в десятичной системе.

Значение AE 41 HEX - это 16 бит 1010 1110 0100 0001, может принимать различное значение, в зависимости от типа представления.

Значение регистра 40108 при комбинации с регистром 40109 дает 32 бит значение.

Пример представления. Тип представленияДиапазон значенийПример в HEXБудет в десятичной форме 16-bit unsigned integer0 до 65535AE4144,609 16-bit signed integer-32768 до 32767AE41-20,927 two character ASCII string2 знакаAE41® A discrete on/off value0 и 100010001 32-bit unsigned integer0 до 4,294,967,295AE41 56522,923,517,522 32-bit signed integer-2,147,483,648 до 2,147,483,647AE41 5652-1,371,449,774 32-bit single precision IEEE floating point number1,2·10−38 до 3,4×10+38AE41 5652-4.395978 E-11 four character ASCII string4 знакаAE41 5652® A V R

Какие бывают команды Modbus RTU?

Приведем таблицу с кодами функций чтения и записи регистров Modbus RTU. Код функцииЧто делает функцияТип значенияТип доступа 01 (0x01)Чтение DORead Coil StatusДискретноеЧтение 02 (0x02)Чтение DIRead Input StatusДискретноеЧтение 03 (0x03)Чтение AORead Holding Registers16 битноеЧтение 04 (0x04)Чтение AIRead Input Registers16 битноеЧтение 05 (0x05)Запись одного DOForce Single CoilДискретноеЗапись 06 (0x06)Запись одного AOPreset Single Register16 битноеЗапись 15 (0x0F)Запись нескольких DOForce Multiple CoilsДискретноеЗапись 16 (0x10)Запись нескольких AOPreset Multiple Registers16 битноеЗапись

Как послать команду Modbus RTU на чтение дискретного вывода? Команда 0x01

Эта команда используется для чтения значений дискретных выходов DO.

В запросе PDU задается начальный адрес первого регистра DO и последующее количество необходимых значений DO. В PDU значения DO адресуются, начиная с нуля.

Значения DO в ответе находятся в одном байте и соответствуют значению битов.

Значения битов определяются как 1 = ON и 0 = OFF.

Младший бит первого байта данных содержит значение DO адрес которого указывался в запросе. Остальные значения DO следуют по нарастающей к старшему значению байта. Т.е. справа на лево.

Если запрашивалось меньше восьми значений DO, то оставшиеся биты в ответе будут заполнены нулями (в направлении от младшего к старшему байту). Поле Byte Count Количество байт далее указывает количество полных байтов данных в ответе.

Пример запроса DO с 20 по 56 для SlaveID адреса устройства 17. Адрес первого регистра будет 0013 hex = 19, т.к. счет ведется с 0 адреса (0014 hex = 20, -1 смещение нуля = получаем 0013 hex = 19). БайтЗапросБайтОтвет (Hex)Название поля(Hex)Название поля 11Адрес устройства11Адрес устройства 01Функциональный код01Функциональный код 00Адрес первого регистра Hi байт05Количество байт далее 13Адрес первого регистра Lo байтCDЗначение регистра DO 27-20 (1100 1101) 00Количество регистров Hi байт6BЗначение регистра DO 35-28 (0110 1011) 25Количество регистров Lo байтB2Значение регистра DO 43-36 (1011 0010) 0EКонтрольная сумма CRC0EЗначение регистра DO 51-44 (0000 1110) 84Контрольная сумма CRC1BЗначение регистра DO 56-52 (0001 1011) 45Контрольная сумма CRC E6Контрольная сумма CRC

Состояния выходов DO 27-20 показаны как значения байта CD hex, или в двоичной системе 1100 1101.

В регистре DO 56-52 5 битов справа были запрошены, а остальные биты заполнены нулями до полного байта (0001 1011). Каналы---DO 56DO 55DO 54DO 53DO 52 Биты00011011 Hex1B

Модули с дискретным выводом: M-7065, ioLogik R1214, ADAM-4056S

Как послать команду Modbus RTU на чтение дискретного ввода? Команда 0x02

Эта команда используется для чтения значений дискретных входов DI.

Пример запроса DI с регистров от #10197 до 10218 для SlaveID адреса устройства 17. Адрес первого регистра будет 00C4 hex = 196, т.к. счет ведется с 0 адреса. БайтЗапросБайтОтвет (Hex)Название поля(Hex)Название поля 11Адрес устройства11Адрес устройства 02Функциональный код02Функциональный код 00Адрес первого регистра Hi байт03Количество байт далее C4Адрес первого регистра Lo байтACЗначение регистра DI 10204-10197 (1010 1100) 00Количество регистров Hi байтDBЗначение регистра DI 10212-10205 (1101 1011) 16Количество регистров Lo байт35Значение регистра DI 10218-10213 (0011 0101) BAКонтрольная сумма CRC20Контрольная сумма CRC A9Контрольная сумма CRC18Контрольная сумма CRC

Модули с дискретным вводом: M-7053, ioLogik R1210, ADAM-4051

Как послать команду Modbus RTU на чтение аналогового вывода? Команда 0x03

Эта команда используется для чтения значений аналоговых выходов AO.

Пример запроса AO с регистров от #40108 до 40110 для SlaveID адреса устройства 17. Адрес первого регистра будет 006B hex = 107, т.к. счет ведется с 0 адреса. БайтЗапросБайтОтвет (Hex)Название поля(Hex)Название поля 11Адрес устройства11Адрес устройства 03Функциональный код03Функциональный код 00Адрес первого регистра Hi байт06Количество байт далее 6BАдрес первого регистра Lo байтAEЗначение регистра Hi #40108 00Количество регистров Hi байт41Значение регистра Lo #40108 03Количество регистров Lo байт56Значение регистра Hi #40109 76Контрольная сумма CRC52Значение регистра Lo #40109 87Контрольная сумма CRC43Значение регистра Hi #40110 40Значение регистра Lo #40110 49Контрольная сумма CRC ADКонтрольная сумма CRC

Модули с аналоговым выводом: M-7024, ioLogik R1241, ADAM-4024

Как послать команду Modbus RTU на чтение аналогового ввода? Команда 0x04

Эта команда используется для чтения значений аналоговых входов AI.

Пример запроса AI с регистра #30009 для SlaveID адреса устройства 17. Адрес первого регистра будет 0008 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 B2Контрольная сумма CRCF4Контрольная сумма CRC 98Контрольная сумма CRC

Модули с аналоговым вводом: M-7017, ioLogik R1240, ADAM-4017+

Как послать команду Modbus RTU на запись дискретного вывода? Команда 0x05

Эта команда используется для записи одного значения дискретного выхода DO.

Значение FF 00 hex устанавливает выход в значение включен ON.

Значение 00 00 hex устанавливает выход в значение выключен OFF.

Все остальные значения недопустимы и не будут влиять значение на выходе.

Нормальный ответ на такой запрос - это эхо (повтор запроса в ответе), возвращается после того, как состояние DO было изменено.

Пример записи в DO с регистром #173 для SlaveID адреса устройства 17. Адрес регистра будет 00AC 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Контрольная сумма CRC4EКонтрольная сумма CRC 8BКонтрольная сумма CRC8BКонтрольная сумма CRC

Состояние выхода DO173 поменялось с выключен OFF на включен ON.

Модули с дискретным выводом: M-7053, ioLogik R1210, ADAM-4051

Как послать команду Modbus RTU на запись аналогового вывода? Команда 0x06

Эта команда используется для записи одного значения аналогового выхода AO.

Пример записи в AO с регистром #40002 для SlaveID адреса устройства 17. Адрес первого регистра будет 0001 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Контрольная сумма CRC9AКонтрольная сумма CRC 9BКонтрольная сумма CRC9BКонтрольная сумма CRC

Модули с аналоговым выводом: M-7024, ioLogik R1241, ADAM-4024

Как послать команду Modbus RTU на запись нескольких дискретных выводов? Команда 0x0F

Эта команда используется для записи нескольких значений дискретного выхода DO.

Пример записи в несколько DO с регистрами от #20 до #29 для SlaveID адреса устройства 17. Адрес регистра будет 0013 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 CDЗначение байт DO 27-20 (1100 1101)99Контрольная сумма CRC 01Значение байт DO 29-28 (0000 0001) BFКонтрольная сумма CRC 0BКонтрольная сумма CRC

В ответе возвращается количество записанных регистров.

Модули с дискретным выводом: M-7053, ioLogik R1210, ADAM-4051

Как послать команду Modbus RTU на запись нескольких аналоговых выводов? Команда 0x10

Эта команда используется для записи нескольких значений аналогового выхода AO.

Пример записи в несколько AO с регистрами #40002 и #40003 для SlaveID адреса устройства 17. Адрес первого регистра будет 0001 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 00Значение Hi 4000298Контрольная сумма CRC 0AЗначение Lo 40002 01Значение Hi 40003 02Значение Lo 40003 C6Контрольная сумма CRC F0Контрольная сумма CRC

Модули с аналоговым выводом: M-7024, ioLogik R1241, ADAM-4024

Какие бывают ошибки запроса Modbus?

Если устройство получило запрос, но запрос не может быть обработан, то устройство ответит кодом ошибки.

Ответ будет содержать измененный Функциональный код, старший бит будет равен 1.

📎📎📎📎📎📎📎📎📎📎