карта регистров modbus что это

Что такое протокол Modbus? От простого к сложному

В промышленности (да и не только) очень часто используется протокол Modbus при настройке и программирования оборудования (Приборы, программируемые контроллеры, датчики, клапана, пускатели, расходомеры, тепловычислители, электросчётчики и даже манометры). Сам по себе протокол представляет собой некие инструкции для извлечения, обработки и передачи различных данных, зачастую физические параметры (температура, давление, влажность, расход, потреблённая электроэнергия и т.д.)

Из этой статьи вы узнаете:

Фактически я переписываю статью. Это поможет мне хоть как-то врубиться в тему, что-то отложится в памяти. Ну и вам проще найти информацию.

Описание протокола 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-9999 0000 до 270E Чтение-запись Discrete Output Coils DO
10001-19999 0000 до 270E Чтение Discrete Input Contacts DI
30001-39999 0000 до 270E Чтение Analog Input Registers AI
40001-49999 0000 до 270E Чтение-запись Analog Output Holding Registers AO

В сообщении 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 integer 0 до 65535 AE41 44,609
16-bit signed integer -32768 до 32767 AE41 -20,927
two character ASCII string 2 знака AE41 ® A
discrete on/off value 0 и 1 0001 0001
32-bit unsigned integer 0 до 4,294,967,295 AE41 5652 2,923,517,522
32-bit signed integer -2,147,483,648 до 2,147,483,647 AE41 5652 -1,371,449,774
32-bit single precision IEEE floating point number 1,2·10−38 до 3,4×10+38 AE41 5652 -4.395978 E-11
four character ASCII string 4 знака AE41 5652 ® A V R

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

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

Код функции Что делает функция Тип значения Тип доступа
01 (0×01) Чтение DO Read Coil Status Дискретное Чтение
02 (0×02) Чтение DI Read Input Status Дискретное Чтение
03 (0×03) Чтение AO Read Holding Registers 16 битное Чтение
04 (0×04) Чтение AI Read Input Registers 16 битное Чтение
05 (0×05) Запись одного DO Force Single Coil Дискретное Запись
06 (0×06) Запись одного AO Preset Single Register 16 битное Запись
15 (0x0F) Запись нескольких DO Force Multiple Coils Дискретное Запись
16 (0×10) Запись нескольких AO Preset Multiple Registers 16 битное Запись

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

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

Читайте также:  Брадсы что это такое

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

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

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

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

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

Байт Запрос Байт Ответ
(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 Контрольная сумма CRC 0E Значение регистра DO 51-44 (0000 1110)
84 Контрольная сумма CRC 1B Значение регистра DO 56-52 (0001 1011)
45 Контрольная сумма CRC
E6 Контрольная сумма CRC

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

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

Каналы DO 56 DO 55 DO 54 DO 53 DO 52
Биты 0 0 0 1 1 0 1 1
Hex 1B

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

Эта команда используется для чтения значений дискретных входов 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 Контрольная сумма CRC 20 Контрольная сумма CRC
A9 Контрольная сумма CRC 18 Контрольная сумма CRC

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

Эта команда используется для чтения значений аналоговых выходов 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 Контрольная сумма CRC 52 Значение регистра Lo #40109
87 Контрольная сумма CRC 43 Значение регистра Hi #40110
40 Значение регистра Lo #40110
49 Контрольная сумма CRC
AD Контрольная сумма CRC

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

Эта команда используется для чтения значений аналоговых входов 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 Контрольная сумма CRC F4 Контрольная сумма CRC
98 Контрольная сумма CRC

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

Эта команда используется для записи одного значения дискретного выхода 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 Контрольная сумма CRC 4E Контрольная сумма CRC
8B Контрольная сумма CRC 8B Контрольная сумма CRC

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

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

Эта команда используется для записи одного значения аналогового выхода 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 Контрольная сумма CRC 9A Контрольная сумма CRC
9B Контрольная сумма CRC 9B Контрольная сумма CRC

Как послать команду 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

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

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

Эта команда используется для записи нескольких значений аналогового выхода 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 40002 98 Контрольная сумма CRC
0A Значение Lo 40002
01 Значение Hi 40003
02 Значение Lo 40003
C6 Контрольная сумма CRC
F0 Контрольная сумма CRC

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

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

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

Источник

Карта регистров modbus что это

Modbus — коммуникационный протокол, основанный на архитектуре «клиент-сервер». Широко применяется в промышленности для организации связи между электронными устройствами. Может использовать для передачи данных последовательные линии связи RS-485, RS-422, RS-232, а также сети TCP/IP (Modbus TCP).

История

Modbus был разработан фирмой Modicon (в настоящее время принадлежит Schneider Electric) для использования в её контроллерах с программируемой логикой. Впервые спецификация протокола была опубликована в 1979 году. [1] Это был открытый стандарт, описывающий формат сообщений и способы их передачи в сети состоящей из различных электронных устройств.

Первоначально контроллеры MODICON использовали последовательный интерфейс RS-232. [1] Позднее стал применяться интерфейс RS-485, так как он обеспечивает более высокую надёжность, позволяет использовать более длинные линии связи и подключать к одной линии несколько устройств.

Введение

Modbus относится к протоколам прикладного уровня сетевой модели OSI. [3] Контроллеры на шине Modbus взаимодействуют, используя клиент-серверную модель, основанную на транзакциях, состоящих из запроса и ответа.

Обычно в сети есть только один клиент, так называемое, «главное» (англ. master) устройство, и несколько серверов — «подчиненных» (slaves) устройств. Главное устройство инициирует транзакции (передаёт запросы). Подчиненные устройства передают запрашиваемые главным устройством данные, или производят запрашиваемые действия. Главный может адресоваться индивидуально к подчиненному или инициировать передачу широковещательного сообщения для всех подчиненных устройств. Подчиненное устройство формирует сообщение и возвращает его в ответ на запрос, адресованный именно ему. При получении широковещательного запроса ответное сообщение не формируется.

Читайте также:  для чего нужна автобиография при приеме на работу

Спецификация Modbus описывает структуру запросов и ответов. Их основа — элементарный пакет протокола, так называемый PDU (Protocol Data Unit). Структура PDU не зависит от типа линии связи и включает в себя код функции и поле данных. Код функции кодируется однобайтовым полем и может принимать значения в диапазоне 1. 127. Диапазон значений 128. 255 зарезервирован для кодов ошибок. Поле данных может быть переменной длины. Размер пакета PDU ограничен 253 байтами.

Modbus PDU

номер функции данные
1 байт N Категории кодов функций

В действующей в настоящее время спецификации протокола определяются три категории кодов функций:

Стандартные команды Их описание должно быть опубликовано и утверждено Modbus-IDA. Эта категория включает в себя как уже определенные, так и свободные в настоящее время коды. Пользовательские команды Два диапазона кодов (от 65 до 72 и от 100 до 110), для которых пользователь может реализовать произвольную функцию. При этом не гарантируется, что какое-то другое устройство не будет использовать тот же самый код для выполнения другой функции. Зарезервированные В эту категорию входят коды функций, не являющиеся стандартными, но уже используемые в устройствах, производимых различными компаниями. Это коды 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 и 127.

Модель данных

Одно из типичных применений протокола — чтение и запись данных в регистры контроллеров. Спецификация протокола определяет четыре таблицы данных:

Таблица Тип элемента Тип доступа
Дискретные входы (Discrete Inputs) один бит только чтение
Регистры флагов (Coils) один бит чтение и запись
Регистры ввода (Input Registers) 16-битное слово только чтение
Регистры хранения (Holding Registers) 16-битное слово чтение и запись

Доступ к элементам в каждой таблице осуществляется с помощью 16-битного адреса, первой ячейке соответствует адрес 0. Таким образом, каждая таблица может содержать до 65536 элементов. Спецификация не определяет, что физически должны представлять собой элементы таблиц и по каким внутренним адресам устройства они должны быть доступны. Например, допустимо организовать перекрывающиеся таблицы, В этом случае команды работающие с дискретными данными и с 16-битными регистрами будут фактически обращаться к одним и тем же данным.

Следует отметить, что со способом адресации данных связана определённая путаница. Modbus был первоначально разработан для контроллеров Modicon. В этих контроллерах для каждой из таблиц использовалась специальная нумерация. Например, первому регистру ввода соответствовал номер ячейки 30001, а первому регистру хранения — 40001. Таким образом, регистру хранения с адресом 107 в команде Modbus соответствовал регистр № 40108 контроллера. Хотя такое соответствие адресов больше не является частью стандарта, некоторые программные пакеты могут автоматически «корректировать» вводимые пользователем адреса, например, вычитая 40001 из адреса регистра хранения.

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

Чтение данных

Для чтения значений из перечисленных выше таблиц данных используются функции с кодами 1—4 (шестнадцатеричные значения 0x01—0x04):

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

В ответе передаются запрошенные данные. Количество байт данных зависит от количества запрошенных элементов. Перед данными передается один байт, значение которого равно количеству байт данных.

Значения регистров хранения и регистров ввода передаются начиная с указанного адреса, по два байта на регистр, старший байт каждого регистра передаётся первым:

байт 1 байт 2 байт 3 байт 4 . байт N-1 байт N
RA,1 RA,0 RA+1,1 RA+1,0 . RA+Q-1,1 RA+Q-1,0

Значения флагов и дискретных входов передаются в упакованном виде: по одному биту на флаг. Единица означает включённое состояние, ноль — выключенное. Значения запрошенных флагов заполняют сначала первый байт, начиная с младшего бита, затем следующие байты, также от младшего бита к старшим. Младший бит первого байта данных содержит значение флага, указанного в поле «адрес». Если запрошено количество флагов, не кратное восьми, то значения лишних битов заполняются нулями:

байт 1 . байт N
FA+7 FA+6 FA+5 FA+4 FA+3 FA+2 FA+1 FA . 0 . 0 FA+Q-1 FA+Q-2 .

Запись одного значения

Команда состоит из адреса элемента (2 байта) и устанавливаемого значения (2 байта).

Для регистра хранения значение является просто 16-битным словом.

Для флагов значение 0xFF00 означает включённое состояние, 0x0000 — выключенное, другие значения недопустимы.

Если команда выполнена успешно, ведомое устройство возвращает копию запроса.

Запись нескольких значений

Команда состоит из адреса элемента, количества изменяемых элементов, количества передаваемых байт устанавливаемых значений и самих устанавливаемых значений. Данные упаковываются так же, как в командах чтения данных.

Ответ состоит из начального адреса и количества изменённых элементов.

Ниже приведён пример команды ведущего устройства и ответа ведомого (для Modbus RTU).

Источник

Ответы на вопросы