Стандартные функции протокола ModBus
В предыдущих статьях мы рассмотрели общую структуру протокола ModBus и его разновидности ModBus RTU и ModBus TCP. В этой статье мы подробно рассмотрим наиболее употребимые функции протокола. Структура функций не зависит от конкретной версии протокола (RTU или TCP).
Вспомним, как выглядит общая структура пакета ModBus:
Блоки «Адрес подчинённого устройства» и «Блок контроля подлинности» различаются в зависимости от версии протокола (RTU или TCP), а вот «Номер функции» и «Данные» в любой реализации одинаковы. Эти два блока образуют часть пакета, которую называют PDU (Protocol Data Unit), — именно она и важна при рассмотрении функций ModBus.
Read Coils — 01 (0x01)
Функция для чтения состояния дискретных выходов устройства.
Запрос:
Ответ:
N* — количество запрошенных дискретных выходов/8. Состояния дискретных выходов (coils) передаются в виде 8-битных слов, поэтому параметр N равен ближайшему целому количеству слов, в которые умещается заданное количество coils.
n = N, если N делится на 8 без остатка, в противном случае n=N+1. Параметр n
Например, нужно прочитать 5 выходов. Тогда в ответе N=5/8=n=1. То есть в ответе после кода функции будет идти 1, а потом ещё один байт, в котором младшие 5 бит будут обозначать состояние запрошенных выходов.
Если устройство обнаружило ошибку при выполнении функции, оно отвечает исключением.
Ответ-исключение:
Коды ошибок стандартные. Их описание можно посмотреть в этой статье.
Пример:
Запрос 19 дискретных выходов, начиная с адреса 19:
В ответе 3 полезных байта:
Состояния входов:
1 полезный байт — состояние выходов с адресами 19 -26: 11001101
2 полезный байт — состояние выходов с адресами 27 -34: 01101011
2 полезный байт — состояние выходов с адресами 35 -37: 00000101 (значащие только 3 младших бита, остальные нули)
Read Discrete Inputs -02 (0х02)
Функция для чтения состояния дискретных входов устройства.
Запрос:
Ответ:
N* — количество запрошенных дискретных входов/8. Состояния дискретных входов (inputs) передаются в виде 8-битных слов, поэтому параметр N равен ближайшему целому количеству слов, в которые умещается заданное количество входов.
n = N, если N делится на 8 без остатка, в противном случае n=N+1. Параметр n
Например, нужно прочитать 5 входов. Тогда в ответе N=5/8=n=1. То есть в ответе после кода функции будет идти 1, а потом ещё один байт, в котором младшие 5 бит будут обозначать состояние запрошенных входов.
Если устройство обнаружило ошибку при выполнении функции, оно отвечает исключением.
Ответ-исключение:
Коды ошибок стандартные. Их описание можно посмотреть в этой статье.
Пример:
Запрос 22 дискретных входа, начиная с адреса 196:
В ответе 3 полезных байта:
Состояния входов:
1 полезный байт — состояние выходов с адресами 196 -203: 10101100
2 полезный байт — состояние выходов с адресами 204 -211: 11011011
2 полезный байт — состояние выходов с адресами 212 -217: 00110101 (значащие только 6 младших бита, остальные нули)
Read Holding Registers — 03 (0х03)
Функция для чтения регистров общего назначения устройства.
Запрос:
Ответ:
N — количество запрошенных регистров. Каждый регистр состоит из двух байт, поэтому количество полезных байт в ответе равно 2*N.
Если устройство обнаружило ошибку при выполнении функции, оно отвечает исключением.
Ответ-исключение:
Коды ошибок стандартные. Их описание можно посмотреть в этой статье.
Пример:
Запрос на чтение трёх регистров начиная с адреса 107:
В ответе значение 3-х регистров = 6 полезных байта:
Значения регистров (в десятичном виде):
регистр с адресом 107: 555
регистр с адресом 108: 0
регистр с адресом 109: 100
Read Input Registers — 04 (0х04)
Функция для чтения входных регистров устройства. По своей структуре полностью идентична предыдущей функции, поэтому разбирать её подробно не имеет смысла.
Единственное отличие этой функции от функции 0х03 Read Holding Registers в том, что она обращается к другой области внутри устройства.
Производитель устройства с поддержкой ModBus сам определяет область памяти, в которой будут хранится «Input Registers».
Input Registers — также 16-битные регистры. В классическом представлении ModBus эти регистры предназначены для хранения значений сигнала на аналоговых входах устройства.
Пример:
Запрос двух входных регистров, начиная с адреса 1:
В ответе содержится значения двух регистров = 4 байта данных:
Значения регистров (в десятичном виде):
регистр с адресом 1: 320
регистр с адресом 2: 17
Write Single Coil — 05 (0х05)
Функция для изменения состояния одного из дискретных выходов (coil) устройства.
Состояние выхода («вкл»/ «выкл») определяется константой, записываемой в регистр, соответствующий данному выходу. Значение константы 0хFF00 — определяет состояние «ВКЛ», а значение 0х0000 — состояние «ВЫКЛ».
Запрос:
Ответ:
При успешном выполнении команды ответ совпадает с запросом.
Ответ-исключение:
Коды ошибок стандартные. Их описание можно посмотреть в этой статье.
Пример:
Запрос на «включение» выхода с адресом 172:
Если команда выполнена без ошибок, то ответ совпадает с запросом:
Write Single Register — 06 (0х06)
Функция для записи значения в один из регистров общего назначения (holding registers) устройства.
Состояние выхода («вкл»/ «выкл») определяется константой, записываемой в регистр, соответствующий данному выходу. Значение константы 0хFF00 — определяет состояние «ВКЛ», а значение 0х0000 — состояние «ВЫКЛ».
Запрос:
Ответ:
При успешном выполнении команды ответ совпадает с запросом.
Ответ-исключение:
Коды ошибок стандартные. Их описание можно посмотреть в этой статье.
Пример:
Запись значения «3» в регистр с адресом 1:
Если команда выполнена без ошибок, то ответ совпадает с запросом:
Write Multiple Coils — 15 (0х0F)
Функция для изменения состояния сразу нескольких дискретных выходов устройства.
Запрос:
Значения выходов которые нужно записать передаются в виде 8-ми битных слов, т.е. каждый байт данных содержит состояние 8-ми выходов. Поэтому количество байт передаваемых данных равно ближайшему целому от деления количества выходов на 8:
N = количество выходов / 8. Если остаток от деления не равен 0, то N = N+1.
Ответ:
Ответ-исключение:
Коды ошибок стандартные. Их описание можно посмотреть в этой статье.
Пример:
Запрос на запись состояния 10 выходов, начиная с выхода с адресом 19 (13 HEX):
Запрос содержит два байта данных, содержащих состояния выходов, которые нужно записать:
(CD 01 hex) (1100 1101 0000 0001 binary). Соответствие битов состояния и выходов устройства определяется следующим образом:
Бит: 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 1
Выход: 26 25 24 23 22 21 20 19 — — — — — — 28 27
Первый байт данных (CD hex) соответствует выходам 26-19. Младший бит соответствует выходу 19.
Второй байт (01 hex) соответствует выходам 28-27. Младший бит соответствует выходу 27.
Неиспользуемые биты в последнем байте — нули.
В ответе содержится подтверждение успешной записи:
Write Multiple Registers — 16 (0х10)
Функция для записи значений в несколько (от 1 до 123) последовательно расположенных регистров общего назначения (holding registers).
Запрос:
N — количество регистров, в которые нужно записать новые значения. Регистры ModBus 16-битные, поэтому на каждый регистр приходится два байта данных.
Ответ:
В ответе содержится подтверждение успешной записи:
Ответ-исключение:
Коды ошибок стандартные. Их описание можно посмотреть в этой статье.
Пример:
Запрос на запись состояния двух регистров, начиная с регистра с адресом 1:
В ответе содержится подтверждение успешной записи:




































то, что искал