Modbus: различия между версиями

Материал из Wiren Board
Строка 52: Строка 52:


===Адреса и номера регистров===
===Адреса и номера регистров===
В стандарте Modbus для каждого из четырех типов регистров используются разные таблицы с номерами 0,1,3,4. Таким образом, регистр определенного типа с определенным номером (иначе его называют физическим адресом) имеет свой адрес в соответствующей таблице. Это историческое наследие протокола вносит путаницу в понимание, по какому же адресу обратиться к регистру с нужным номером. Чаще всего указываются номера регистров, как, например для устройств Wiren Board.
В стандарте Modbus для каждого из четырех типов регистров используются разные таблицы с номерами 0,1,3,4. Таким образом, регистр определенного типа с определенным номером (иначе его называют физическим адресом) имеет свой адрес в соответствующей таблице. Это историческое наследие протокола вносит путаницу в понимание, по какому же адресу обратиться к регистру с нужным номером. Более того, понятия "адрес" и "регистр" могут применяться производителем произвольно. Чаще всего указываются номера регистров, как, например для устройств Wiren Board.
{|class="wikitable" align="center"
{|class="wikitable" align="center"
! Таблица || Номер таблицы || Начальный логический адрес || Номер регистра (физический адрес) || Диапазон логических адресов
! Таблица || Номер таблицы || Начальный логический адрес || Номер регистра (физический адрес) || Диапазон логических адресов
Строка 69: Строка 69:
|}
|}


Но иногда в описаниях указываются только адреса. Например, coil-регистр 0 имеет адрес 000001, регистр ввода 4 -- 400005 и т.д.
В некоторых устройствах применяются более короткие логические адреса (.0001-.9999), и для адреса используется 5, а не 6 цифр.
 
Иногда в описаниях устройства указываются только логические адреса. Например, coil-регистр 0 имеет адрес 000001, регистр ввода 4 -- 400005 и т.д.
В готовых шаблонах устройств контроллера Wiren Board 5 есть шаблон для однофазного счетчика SDM220(/usr/share/wb-mqtt-serial/templates/config-sdm220.json). В документации от производителя "Eastron SDM
В готовых шаблонах устройств контроллера Wiren Board 5 есть шаблон для однофазного счетчика SDM220(/usr/share/wb-mqtt-serial/templates/config-sdm220.json). В документации от производителя "Eastron SDM
220 Modbus Smart Meter Modbus Protocol Implementation V1.0" перечислены регисрты и соответствующие им измеряемые параметры.
220 Modbus Smart Meter Modbus Protocol Implementation V1.0" перечислены регистры и соответствующие им измеряемые параметры, например:
 
{|class="wikitable" align="center"
! Таблица || Address (Register)|| Description || Units || Modbus Protocol Start Address Hex (Hi Byte  Lo Byte)
|-
! 30001
| Line to neutral volts. || Volts || 0 || 000001-065535
|-
! Дискретные входы (Discrete Inputs)
| 1 || 100001 || 0 || 100001-165535
|-
! Регистры хранения (Holding Registers)
| 3 || 300001 || 0 || 300001-365535
|-
! Регистры ввода (Input Registers)
| 4 || 400001 || 0 || 400001-465535
|}

Версия 11:46, 7 декабря 2016

Для управления WB-MR14 используется протокол Modbus с открытой спецификацией. Это протокол прикладного (седьмого) уровня модели OSI, он служит для обмена данными, чаще всего между устройствами автоматизации и реализован в виде "протокола ответов на запросы (request-reply protocol)".

В устройствах Wirenboard данные Modbus передаются по последовательным линиям связи RS-485. В последовательных линиях связи протокол RS-485 полудуплексный и работает по принципу «клиент-сервер». Каждое устройство в сети имеет адрес от 1 до 247, адрес 0 используется для широковещательной передачи данных всем устройствам, а адреса 248–255 считаются зарезервированными согласно спецификации Modbus, их использование не рекомендуется.

Ведущее устройство ("мастер", или "клиент") периодически опрашивает "ведомое", или "сервер". Ведущее устройство не имеет адреса, передача сообщений от устройства-сервера ведущему без запроса ведущего в протоколе не предусмотрена.

Датаграмма Modbus в общем виде

Пакет данных Modbus выглядит, как это показано на рисунке. PDU (Protocol Data Unit) — общая часть пакета MODBUS, включающая код функции и данные пакета. ADU (Application Data Unit) — полный пакет MODBUS. Включает в себя специфичную для физического уровня часть пакета и PDU. Для последовательных линий в заголовке ADU передается адрес устройства, а в конце — контрольная сумма CRC16. Максимальный размер ADU в последовательных коммуникационных линиях составляет 253 байта (из максимальных, разрешенных спецификацией 256 байт вычитается 1 байт адреса и два байта контрольной суммы). Для справки — в Modbus TCP максимальная длина пакета составляет 260 байт.


Функция кодируется одним байтом и определяет, какое действие должно выполнить устройство-сервер. Значение кодов функций лежат в диапазоне от 1 до 255, причем коды от 128 до 255 зарезервированы для сообщений об ошибках со стороны устройства-сервера. Код 0 не используется. Размер блока данных может варьироваться от нуля до максимально допустимого. Если обработка запроса прошла без ошибок, то устройство-сервер возвращает пакет ADU, содержащий запрошенные данные.

Modbus-транзакция, прошедшая без ошибок

При возникновении ошибки устройством возвращается код ошибки. В случае обычной транзакции код функции в ответе возвращается без изменений; в случае ошибки старший бит кода функции устанавливается в единицу (то есть код функции + 0x80)

Modbus-транзакция с ошибками

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

Структуры данных Modbus

В Modbus принято кодировать адреса и данные в формате big-endian, то есть в формате, когда байты следуют, начиная со старшего: например, при передаче шестнадцатеричного числа 0x1234 сначала устройством будет принят байт 0x12, а затем — 0x34. Для передачи данных другого типа, например, чисел с плавающей запятой, строк, даты и времени суток и т.п. производитель может выбрать свой собственный способ кодирования — для расшифровки получаемых данных важно ознакомится со спецификацией производителя устройства.

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

Обмен данными с Modbus-устройствами происходит через регистры. В протоколе Modbus определяется четыре типа регистров, показанных в таблице:

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

Регистры флагов(Coils) хранят однобитные значения - то есть могут находится в состоянии 0 или 1. Такие регистры могут обозначать текущее состояние выхода (включено реле). Название "coil" буквально и означает обмотку-актюатор электромеханического реле. Регистры флагов допускают как чтение, так и запись.

Дискретные входы (Discrete Inputs) также являются однобитными регистрами, описывающими состояние входа устройства (например подано напряжение -- 1). Эти регистры поддерживают только чтение.

Регистры хранения (Holding Registers) и регистры ввода (Input Registers) представлены двухбайтовым словом и могут хранить значения от 0 до 65535 (0x0000 -- 0xFFFFF). Регистры ввода допускают только чтение (например, текущее значение температуры). Регистры хранения поддерживают как чтение, так и запись (для хранения настроек). В настоящее время во многих устройствах, в частности в устройствах Wiren Board, эти регистры не разделяются. Команды на чтение регистра хранения N и регистра ввода N обратятся к одному и тому же значению в адресном пространстве устройства.

Адреса и номера регистров

В стандарте Modbus для каждого из четырех типов регистров используются разные таблицы с номерами 0,1,3,4. Таким образом, регистр определенного типа с определенным номером (иначе его называют физическим адресом) имеет свой адрес в соответствующей таблице. Это историческое наследие протокола вносит путаницу в понимание, по какому же адресу обратиться к регистру с нужным номером. Более того, понятия "адрес" и "регистр" могут применяться производителем произвольно. Чаще всего указываются номера регистров, как, например для устройств Wiren Board.

Таблица Номер таблицы Начальный логический адрес Номер регистра (физический адрес) Диапазон логических адресов
Регистры флагов (Coils) 0 000001 0 000001-065535
Дискретные входы (Discrete Inputs) 1 100001 0 100001-165535
Регистры хранения (Holding Registers) 3 300001 0 300001-365535
Регистры ввода (Input Registers) 4 400001 0 400001-465535

В некоторых устройствах применяются более короткие логические адреса (.0001-.9999), и для адреса используется 5, а не 6 цифр.

Иногда в описаниях устройства указываются только логические адреса. Например, coil-регистр 0 имеет адрес 000001, регистр ввода 4 -- 400005 и т.д. В готовых шаблонах устройств контроллера Wiren Board 5 есть шаблон для однофазного счетчика SDM220(/usr/share/wb-mqtt-serial/templates/config-sdm220.json). В документации от производителя "Eastron SDM 220 Modbus Smart Meter Modbus Protocol Implementation V1.0" перечислены регистры и соответствующие им измеряемые параметры, например:

Таблица Address (Register) Description Units Modbus Protocol Start Address Hex (Hi Byte Lo Byte)
30001 Line to neutral volts. Volts 0 000001-065535
Дискретные входы (Discrete Inputs) 1 100001 0 100001-165535
Регистры хранения (Holding Registers) 3 300001 0 300001-365535
Регистры ввода (Input Registers) 4 400001 0 400001-465535