http://ipc2u.ru/articles/prostye-resheniya/modbus-tcp/
09:02 08.12.2016
Наборы
Избранное
Избранное
Избранные товары
Цена по запросу
Регистрация / Авторизация
Авторизация
Логин:
Пароль:


Забыли пароль? Регистрация
Забыли пароль?
E-mail:
Для восстановления пароля введите e-mail, указанный при регистрации. На ваш e-mail будет выслано письмо с дальнейшими инструкциями.
Промышленная автоматизация

+7 (495) 232-02-07, sales@ipc2u.ru
Корзина
Цена по запросу
Скидка -
Всего:

Подробное описание протокола Modbus TCP с примерами команд

Modbus TCP

В этой статье вы узнаете о протоколе Modbus TCP, который является развитием протокола Modbus RTU. Обновить знания о Modbus RTU можно из этой статьи.

Оглавление:

Куда посылать команду Modbus TCP?

В сети Ethernet адресом устройства является его IP-адрес. Обычно устройства находятся в одной подсети, где IP адреса отличаются последними цифрами 192.168.1.20 при использовании самой распространённой маски подсети 255.255.255.0.

Интерфейсом является сеть Ethernet, протоколом передачи данных – TCP/IP.

Используемый TCP-порт: 502.

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

Команда Modbus TCP состоит из части сообщения Modbus RTU и специального заголовка.

О Modbus RTU написано в этой статье.

Из сообщения Modbus RTU удаляется SlaveID адрес в начале и CRC контрольная сумма в конце, что образует PDU, Protocol Data Unit.

Ниже приведен пример запроса Modbus RTU для получения значения AI аналогового выхода (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

Отбрасываем адрес устройства SlaveID и контрольную сумму CRC и получаем PDU:

03 006B 0003

К началу получившегося сообщения PDU добавляется новый 7-байтовый заголовок, который называется MBAP Header (Modbus Application Header). Этот заголовок имеет следующие данные:

MBAP Header

Transaction Identifier (Идентификатор транзакции): 2 байта устанавливаются Master, чтобы однозначно идентифицировать каждый запрос. Может быть любыми. Эти байты повторятся устройством Slave в ответе, поскольку ответы устройства Slave не всегда могут быть получены в том же порядке, что и запросы.

Protocol Identifier (Идентификатор протокола): 2 байта устанавливаются Master, всегда будут = 00 00, что соответствует протоколу Modbus.

Length (Длина): 2 байта устанавливаются Master, идентифицирующие число байтов в сообщении, которые следуют далее. Считается от Unit Identifier до конца сообщения.

Unit Identifier (Идентификатор блока или адрес устройства): 1 байт устанавливается Master. Повторяется устройством Slave для однозначной идентификации устройства Slave.

Итого получаем:

Modbus RTUSlave IDЗапросCRC
Modbus RTU1103 006B 00037687
Modbus TCP0001 0000 0006 1103 006B 0003
Modbus TCPMBAP HeaderPDU
Modbus TCPADU, Application Data Unit

Где:

0001Идентификатор транзакцииTransaction Identifier
0000Идентификатор протоколаProtocol Identifier
0006Длина (6 байтов идут следом)Message Length
11Адрес устройства (17 = 11 hex)Unit Identifier
03Функциональный код (читаем Analog Output Holding Registers)Function Code
006BАдрес первого регистра (40108-40001 = 107 =6B hex)Data Address of the first register
0003Количество требуемых регистров (чтение 3-х регистров с 40108 по 40110)The total number of registers

В ответе от Modbus TCP Slave устройства мы получим:

0001 0000 0009 11 03 06 022B 0064 007F

Где:

0001Идентификатор транзакцииTransaction Identifier
0000Идентификатор протоколаProtocol Identifier
0009Длина (9 байтов идут следом)Message Length
11Адрес устройства (17 = 11 hex)Unit Identifier
03Функциональный код (читаем Analog Output Holding Registers)Function Code
06Количество байт далее (6 байтов идут следом)Byte Count
02Значение старшего разряда регистра (02 hex)Register value Hi (AO0)
2BЗначение младшего разряда регистра (2B hex)Register value Lo (AO0)
00Значение старшего разряда регистра (00 hex)Register value Hi (AO1)
64Значение младшего разряда регистра (64 hex)Register value Lo (AO1)
00Значение старшего разряда регистра (00 hex)Register value Hi (AO2)
7FЗначение младшего разряда регистра (7F hex)Register value Lo (AO2)

Регистр аналогового выхода AO0 имеет значение 02 2B HEX или 555 в десятичной системе.

Регистр аналогового выхода АО1 имеет значение 00 64 HEX или 100 в десятичной системе.

Регистр аналогового выхода АО2 имеет значение 00 7F HEX или 127 в десятичной системе.

Типы команд Modbus TCP

Приведем таблицу с кодами функций чтения и записи регистров Modbus TCP.

Код функцииЧто делает функцияТип значенияТип доступа
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 TCP на чтение дискретного вывода? Команда 0x01

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

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

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

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

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

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

БайтЗапросБайтОтвет
(Hex)Название поля(Hex)Название поля
01Идентификатор транзакции01Идентификатор транзакции
0202
00Идентификатор протокола00Идентификатор протокола
0000
00Длина сообщения00Длина сообщения
0604
01Адрес устройства01Адрес устройства
01Функциональный код01Функциональный код
00Адрес первого регистра Hi байт01Количество байт далее
00Адрес первого регистра Lo байт02Значение регистра DO 0-1
00Количество регистров Hi байт
02Количество регистров Lo байт

Состояния выходов DO0-1 показаны как значения байта 02 hex, или в двоичной системе 0000 0010.

Значение DO1 будет вторым справа, а значение DO0 будет первым справа (младший бит).

Шесть остальных битов заполнены нулями до полного байта, т.к. их не запрашивали.

Каналы------DO 1DO 0
Биты00000010
Hex02

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

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

Запрос и ответ для DI похож на запрос для DO.

БайтЗапросБайтОтвет
(Hex)Название поля(Hex)Название поля
01Идентификатор транзакции01Идентификатор транзакции
0202
00Идентификатор протокола00Идентификатор протокола
0000
00Длина сообщения00Длина сообщения
0604
01Адрес устройства01Адрес устройства
02Функциональный код02Функциональный код
00Адрес первого регистра Hi байт01Количество байт далее
00Адрес первого регистра Lo байт03Значение регистра DI 0-1
00Количество регистров Hi байт
02Количество регистров Lo байт

Состояния выходов DI 0-1 показаны как значения байта 03 hex, или в двоичной системе 0000 0011.

Значение DI1 будет вторым справа, а значение DI0 будет первым справа (младший бит).

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

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

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

БайтЗапросБайтОтвет
(Hex)Название поля(Hex)Название поля
01Идентификатор транзакции01Идентификатор транзакции
0202
00Идентификатор протокола00Идентификатор протокола
0000
00Длина сообщения00Длина сообщения
0607
01Адрес устройства01Адрес устройства
03Функциональный код03Функциональный код
00Адрес первого регистра Hi байт04Количество байт далее
00Адрес первого регистра Lo байт02Значение регистра Hi (AO0)
00Количество регистров Hi байт2BЗначение регистра Lo (AO0)
02Количество регистров Lo байт00Значение регистра Hi (AO1)
64Значение регистра Lo (AO1)

Состояния выхода AO0 показаны как значения байта 02 2B hex, или в десятичной системе 555.

Состояния выхода AO1 показаны как значения байта 00 64 hex, или в десятичной системе 100.

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

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

БайтЗапросБайтОтвет
(Hex)Название поля(Hex)Название поля
01Идентификатор транзакции01Идентификатор транзакции
0202
00Идентификатор протокола00Идентификатор протокола
0000
00Длина сообщения00Длина сообщения
0607
01Адрес устройства01Адрес устройства
04Функциональный код04Функциональный код
00Адрес первого регистра Hi байт04Количество байт далее
00Адрес первого регистра Lo байт00Значение регистра Hi (AI0)
00Количество регистров Hi байт0AЗначение регистра Lo (AI0)
02Количество регистров Lo байт00Значение регистра Hi (AI1)
64Значение регистра Lo (AI1)

Состояния выхода AI0 показаны как значения байта 02 0A hex, или в десятичной системе 10.

Состояния выхода AI1 показаны как значения байта 00 64 hex, или в десятичной системе 100.

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

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

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

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

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

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

БайтЗапросБайтОтвет
(Hex)Название поля(Hex)Название поля
01Идентификатор транзакции01Идентификатор транзакции
0202
00Идентификатор протокола00Идентификатор протокола
0000
00Длина сообщения00Длина сообщения
0606
01Адрес устройства01Адрес устройства
05Функциональный код05Функциональный код
00Адрес регистра Hi байт00Адрес регистра Hi байт
01Адрес регистра Lo байт01Адрес регистра Lo байт
FFЗначение Hi байтFFЗначение Hi байт
00Значение Lo байт00Значение Lo байт

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

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

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

БайтЗапросБайтОтвет
(Hex)Название поля(Hex)Название поля
01Идентификатор транзакции01Идентификатор транзакции
0202
00Идентификатор протокола00Идентификатор протокола
0000
00Длина сообщения00Длина сообщения
0606
01Адрес устройства01Адрес устройства
06Функциональный код06Функциональный код
00Адрес регистра Hi байт00Адрес регистра Hi байт
01Адрес регистра Lo байт01Адрес регистра Lo байт
55Значение Hi байт55Значение Hi байт
FFЗначение Lo байтFFЗначение Lo байт

Состояние выхода AO0 поменялось на 55 FF hex, или в десятичной системе 22015.

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

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

БайтЗапросБайтОтвет
(Hex)Название поля(Hex)Название поля
01Идентификатор транзакции01Идентификатор транзакции
0202
00Идентификатор протокола00Идентификатор протокола
0000
00Длина сообщения00Длина сообщения
0806
01Адрес устройства01Адрес устройства
0FФункциональный код0FФункциональный код
00Адрес первого регистра Hi байт00Адрес первого регистра Hi байт
00Адрес первого регистра Lo байт00Адрес первого регистра Lo байт
00Количество регистров Hi байт00Кол-во записанных рег. Hi байт
02Количество регистров Lo байт02Кол-во записанных рег. Lo байт
01Количество байт далее
02Значение байт

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

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

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

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

БайтЗапросБайтОтвет
(Hex)Название поля(Hex)Название поля
01Идентификатор транзакции01Идентификатор транзакции
0202
00Идентификатор протокола00Идентификатор протокола
0000
00Длина сообщения00Длина сообщения
0B06
01Адрес устройства01Адрес устройства
10Функциональный код10Функциональный код
00Адрес первого регистра Hi байт00Адрес первого регистра Hi байт
00Адрес первого регистра Lo байт00Адрес первого регистра Lo байт
00Количество регистров Hi байт00Кол-во записанных рег. Hi байт
02Количество регистров Lo байт02Кол-во записанных рег. Lo байт
04Количество байт далее
00Значение Hi AO0 байт
0AЗначение Lo AO0 байт
01Значение Hi AO1 байт
02Значение Lo AO1 байт

Состояние выхода AO0 поменялось на 00 0A hex, или в десятичной системе 10.

Состояние выхода AO1 поменялось на 01 02 hex, или в десятичной системе 258.

Ошибки запроса Modbus TCP

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

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

Пример:

БылоСтало
Функциональный код в запросеФункциональный код ошибки в ответе
01 (01 hex) 0000 0001129 (81 hex) 1000 0001
02 (02 hex) 0000 0010130 (82 hex) 1000 0010
03 (03 hex) 0000 0011131 (83 hex) 1000 0011
04 (04 hex) 0000 0100132 (84 hex) 1000 0100
05 (05 hex) 0000 0101133 (85 hex) 1000 0101
06 (06 hex) 0000 0110134 (86 hex) 1000 0110
15 (0F hex) 0000 1111143 (8F hex) 1000 1111
16 (10 hex) 0001 0000144 (90 hex) 1001 0000

Пример запроса и ответ с ошибкой:

БайтЗапросБайтОтвет
(Hex)Название поля(Hex)Название поля
01Идентификатор транзакции01Идентификатор транзакции
0202
00Идентификатор протокола00Идентификатор протокола
0000
00Длина сообщения00Длина сообщения
0603
0AАдрес устройства0AАдрес устройства
01Функциональный код81Функциональный код с измененным битом
04Адрес первого регистра Hi байт02Код ошибки
A1Адрес первого регистра Lo байт
00Количество регистров Hi байт
01Количество регистров Lo байт

Расшифровка кодов ошибок

01Принятый код функции не может быть обработан.
02Адрес данных, указанный в запросе, недоступен.
03Значение, содержащееся в поле данных запроса, является недопустимой величиной.
04Невосстанавливаемая ошибка имела место, пока ведомое устройство пыталось выполнить затребованное действие.
05Ведомое устройство приняло запрос и обрабатывает его, но это требует много времени. Этот ответ предохраняет ведущее устройство от генерации ошибки тайм-аута.
06Ведомое устройство занято обработкой команды. Ведущее устройство должно повторить сообщение позже, когда ведомое освободится.
07Ведомое устройство не может выполнить программную функцию, заданную в запросе. Этот код возвращается для неуспешного программного запроса, использующего функции с номерами 13 или 14. Ведущее устройство должно запросить диагностическую информацию или информацию об ошибках от ведомого.
08Ведомое устройство при чтении расширенной памяти обнаружило ошибку паритета. Ведущее устройство может повторить запрос, но обычно в таких случаях требуется ремонт.

Программы для работы с протоколом Modbus TCP

Ниже представлены программы, которые помогут легко взаимодействовать с устройствами Modbus TCP.

Modbus Master Tool с поддержкой Modbus RTU, ASCII, TCP. Скачать

Modbus Master Tool

Modbus TCP client с поддержкой Modbus TCP. Скачать

Modbus TCP client

Оборудование с поддержкой протокола Modbus TCP


За более подробной информацией обращайтесь к специалистам IPC2U по телефону: +7 (495) 232 0207 или по e-mail: sales@ipc2u.ru

Статьи по теме

Как удлинить линию Ethernet?
05.07.2016
В данной статье описываются оборудование и методы удлинения линии Ethernet.
Просто о Modbus RTU с подробным описанием и примерами
23.06.2016
В данной статье описывается протокол Modbus RTU с примерами команд.
Как увеличить количество COM портов на компьютере?
30.05.2016
В данной статье описывается оборудование для увеличения количества COM портов.
Как удлинить сеть с интерфейсом RS-232, RS-422 и RS-485?
14.04.2016
В данной статье описываются реальные примеры и оборудование для удлинения сети с интерфейсом RS-232, RS-422 и RS-485.
http://ipc2u.ru/articles/prostye-resheniya/modbus-tcp/
09:02 08.12.2016