Стандартные функции протокола ModBus

В предыдущих статьях мы рассмотрели общую структуру протокола ModBus и его разновидности ModBus RTU и ModBus TCP. В этой статье мы подробно рассмотрим наиболее употребимые функции протокола. Структура функций не зависит от конкретной версии протокола (RTU или TCP).

Вспомним, как выглядит общая структура пакета ModBus:

struktura-zaprosa-modbus

Блоки «Адрес подчинённого устройства» и «Блок контроля подлинности» различаются в зависимости от версии протокола (RTU или TCP), а вот «Номер функции» и «Данные» в любой реализации одинаковы. Эти два блока образуют часть пакета, которую называют PDU (Protocol Data Unit), — именно она и важна при рассмотрении функций ModBus.

Read Coils — 01 (0x01)

Функция для чтения состояния дискретных выходов устройства.

Запрос:

read-coils-request

Ответ:

read-coils-responce

N* — количество запрошенных дискретных выходов/8. Состояния дискретных выходов (coils) передаются в виде 8-битных слов, поэтому параметр N равен ближайшему целому количеству слов, в которые умещается заданное количество coils.

n = N, если N делится на 8 без остатка, в противном случае n=N+1. Параметр n

Например, нужно прочитать 5 выходов. Тогда в ответе N=5/8=n=1. То есть в ответе после кода функции будет идти 1, а потом ещё один байт, в котором младшие 5 бит будут обозначать состояние запрошенных выходов.

Если устройство обнаружило ошибку при выполнении функции, оно отвечает исключением.

Ответ-исключение:

read-coils-exeption

Коды ошибок стандартные. Их описание можно посмотреть в этой статье.

Пример:

Запрос 19 дискретных выходов, начиная с адреса 19:

read-coils-primer-zapros

В ответе 3 полезных байта:

read-coils-primer-otvet

Состояния входов:

1 полезный байт — состояние выходов с адресами 19 -26:   11001101

2 полезный байт — состояние выходов с адресами 27 -34:   01101011

2 полезный байт — состояние выходов с адресами 35 -37:   00000101 (значащие только 3 младших бита, остальные нули)

Read Discrete Inputs -02 (0х02)

Функция для чтения состояния дискретных входов устройства.

Запрос:

read-discrete-inputs-request

Ответ:

read-discrete-inputs-responce

N* — количество запрошенных дискретных входов/8. Состояния дискретных входов (inputs) передаются в виде 8-битных слов, поэтому параметр N равен ближайшему целому количеству слов, в которые умещается заданное количество входов.

n = N, если N делится на 8 без остатка, в противном случае n=N+1. Параметр n

Например, нужно прочитать 5 входов. Тогда в ответе N=5/8=n=1. То есть в ответе после кода функции будет идти 1, а потом ещё один байт, в котором младшие 5 бит будут обозначать состояние запрошенных входов.

Если устройство обнаружило ошибку при выполнении функции, оно отвечает исключением.

Ответ-исключение:

read-discrete-inputs-exception

Коды ошибок стандартные. Их описание можно посмотреть в этой статье.

Пример:

Запрос 22 дискретных входа, начиная с адреса 196:

read-discrete-inputs-primer-zapros

В ответе 3 полезных байта:

read-discrete-inputs-primer-otvet

Состояния входов:

1 полезный байт — состояние выходов с адресами 196 -203:   10101100

2 полезный байт — состояние выходов с адресами 204 -211:   11011011

2 полезный байт — состояние выходов с адресами 212 -217:   00110101 (значащие только 6 младших бита, остальные нули)

Read Holding Registers — 03 (0х03)

Функция для чтения регистров общего назначения устройства.

Запрос:

read-holding-registers-request

Ответ:

read-holding-registers-responce

N — количество запрошенных регистров. Каждый регистр состоит из двух байт, поэтому количество полезных байт в ответе равно 2*N.

Если устройство обнаружило ошибку при выполнении функции, оно отвечает исключением.

Ответ-исключение:

read-discrete-inputs-exception

Коды ошибок стандартные. Их описание можно посмотреть в этой статье.

Пример:

Запрос на чтение трёх регистров начиная с адреса 107:

read-holding-registers-primer-zapros

В ответе значение 3-х регистров = 6 полезных байта:

read-holding-registers-primer-otvet

Значения регистров (в десятичном виде):

регистр с адресом 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:

read-input-registers-primer-zapros

В ответе содержится значения двух регистров = 4 байта данных:

read-input-registers-primer-otvet

Значения регистров (в десятичном виде):

регистр с адресом 1: 320

регистр с адресом 2: 17

Write Single Coil — 05 (0х05)

Функция для изменения состояния одного из дискретных выходов (coil) устройства.

Состояние выхода («вкл»/ «выкл»)  определяется константой, записываемой в регистр, соответствующий данному выходу. Значение константы 0хFF00 — определяет состояние «ВКЛ», а значение 0х0000 — состояние «ВЫКЛ».

Запрос:

write-single-coil-request

Ответ:

write-single-coil-responce

При успешном выполнении команды ответ совпадает с запросом.

Ответ-исключение:

write-single-coil-exception

Коды ошибок стандартные. Их описание можно посмотреть в этой статье.

Пример:

Запрос на «включение» выхода с адресом 172:

write-single-coil-primer-zapros

Если команда выполнена без ошибок, то ответ совпадает с запросом:

write-single-coil-primer-otvet

Write Single Register — 06 (0х06)

Функция для записи значения в один из регистров общего назначения (holding registers) устройства.

Состояние выхода («вкл»/ «выкл»)  определяется константой, записываемой в регистр, соответствующий данному выходу. Значение константы 0хFF00 — определяет состояние «ВКЛ», а значение 0х0000 — состояние «ВЫКЛ».

Запрос:

write-single-register-request

Ответ:

write-single-register-responce

При успешном выполнении команды ответ совпадает с запросом.

Ответ-исключение:

write-single-register-exception

Коды ошибок стандартные. Их описание можно посмотреть в этой статье.

Пример:

Запись значения «3» в регистр с адресом 1:

write-single-register-primer-zapros

Если команда выполнена без ошибок, то ответ совпадает с запросом:

write-single-register-primer-otvet

Write Multiple Coils — 15 (0х0F)

Функция для изменения состояния сразу нескольких дискретных выходов устройства.

Запрос:

write-multiple-coils-request

Значения выходов которые нужно записать передаются в виде 8-ми битных слов, т.е. каждый байт данных содержит состояние 8-ми выходов. Поэтому количество байт передаваемых данных равно ближайшему целому от деления количества выходов на 8:

N = количество выходов / 8. Если остаток от деления не равен 0, то N = N+1.

Ответ:

write-multiple-coils-responce

Ответ-исключение:

write-multiple-coils-exception

Коды ошибок стандартные. Их описание можно посмотреть в этой статье.

Пример:

Запрос на запись состояния 10 выходов, начиная с выхода с адресом 19 (13 HEX):

write-multiple-coils-primer-zapros

Запрос содержит два байта данных, содержащих состояния выходов, которые нужно записать:

(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-coils-primer-otvet

Write Multiple Registers — 16 (0х10)

Функция для записи значений в несколько (от 1 до 123) последовательно расположенных регистров общего назначения (holding registers).

Запрос:

write-multiple-registers-request

 

N — количество регистров, в которые нужно записать новые значения. Регистры ModBus 16-битные, поэтому на каждый регистр приходится два байта данных.

Ответ:

В ответе содержится подтверждение успешной записи:

write-multiple-registers-responce

Ответ-исключение:

write-multiple-registers-exception

Коды ошибок стандартные. Их описание можно посмотреть в этой статье.

Пример:

Запрос на запись состояния двух регистров, начиная с регистра с адресом 1:

write-multiple-registers-primer-zapros

В ответе содержится подтверждение успешной записи:

write-multiple-registers-primer-otvet


   Один комментарий


  1. Владимир
      26.06.2020

    то, что искал

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *