Modbus

Что такое Modbus?
Modbus — это промышленный протокол, разработанный компанией Modicon (ныне Schneider Electric) в конце 1970-х годов для связи между программируемыми логическими контроллерами (ПЛК). Modbus остается наиболее распространенным протоколом для подключения промышленных устройств. Спецификация протокола Modbus находится в открытом доступе, и его использование не требует выплаты лицензионных отчислений.
Протокол Modbus определяется как протокол «ведущий/ведомый», что означает, что устройство, работающее в качестве ведущего, будет опрашивать одно или несколько устройств, работающих в качестве ведомых. Это означает, что ведомое устройство не может предоставлять информацию добровольно; оно должно ждать запроса. Ведущее устройство будет записывать данные в регистры ведомого устройства и считывать данные из регистров ведомого устройства. Адрес регистра или ссылка на регистр всегда находятся в контексте регистров ведомого устройства.
Наиболее распространенной формой протокола Modbus является RTU по RS-485. Modbus RTU — это относительно простой последовательный протокол, который может передаваться через традиционную технологию UART. Данные передаются 8-битными байтами, по одному биту за раз, со скоростью от 1200 бит в секунду (бод) до 115200 бит в секунду. Большинство устройств Modbus RTU поддерживают скорость только до 38400 бит в секунду.

В сети Modbus RTU имеется один ведущий узел (Master) и один или несколько ведомых узлов (Slave). Каждый ведомый узел имеет уникальный 8-битный адрес устройства или номер блока. Пакеты, отправляемые ведущим узлом, содержат адрес ведомого узла, которому предназначено сообщение. Ведомый узел должен ответить только в том случае, если его адрес распознан, и должен ответить в течение определенного периода времени, иначе ведущий узел выдаст ошибку «нет ответа».
Каждый обмен данными состоит из запроса от ведущего устройства, за которым следует ответ от ведомого устройства. Каждый пакет данных, будь то запрос или ответ, начинается с адреса устройства или адреса ведомого устройства, за которым следует код функции, а затем параметры, определяющие, что запрашивается или предоставляется. Точные форматы запроса и ответа подробно описаны в спецификации протокола Modbus. Общая структура каждого запроса и ответа показана ниже.

Данные Modbus чаще всего считываются и записываются в регистры, представляющие собой 16-битные данные. Чаще всего регистр содержит либо знаковое, либо беззнаковое 16-битное целое число. Если требуется 32-битное целое число или число с плавающей запятой, эти значения считываются как пара регистров. Наиболее часто используемый регистр называется регистром хранения (Holding Register), и в него можно считывать и записывать данные. Другой возможный тип — входной регистр (Input Register), который является только для чтения.
Исключением из правила о 16-битных регистрах являются катушка и дискретный вход, каждый из которых имеет только 1 бит. Катушки могут считываться или записываться, в то время как дискретные входы предназначены только для чтения. Катушки обычно используются в качестве релейных выходов.
Тип регистра, к которому обращается запрос Modbus, определяется кодом функции. Наиболее распространенные коды включают 3 для «чтения регистров хранения» и могут считывать 1 или более регистров. Код функции 6 используется для записи в один регистр хранения. Код функции 16 используется для записи в один или несколько регистров хранения.
Визуализация данных в устройстве Modbus
Устройства Modbus Slave можно представить как внутреннюю электронную таблицу, заполненную числами. Modbus Master запрашивает у Slave значение данных или число, найденное в заданной строке и столбце, и Slave отвечает, отправляя эти данные обратно Master. Конечно, этот процесс можно обратить вспять: Modbus Master указывает Slave, какое число нужно поместить в его таблицу данных в заданной строке и столбце.
«Столбцы» в «таблице» устройства Modbus более формально называются типами регистров. Типом регистра может быть катушка, дискретный вход (также известный как вход состояния), входной регистр или регистр хранения.
В таблице данных устройства Modbus «строки» — это просто номера регистров. Чаще всего они начинаются с 1 и идут последовательно. У некоторых устройств может не быть регистра с номером 1, и их первый регистр может быть, например, номером 100. Если регистр с таким номером отсутствует в ведомом устройстве, оно отправит сообщение об ошибке, которое правильно называется исключением. Исключение содержит код ошибки, означающий «регистр не найден» (код исключения 2, недопустимый адрес данных).

Что такое Modbus TCP?
Modbus TCP инкапсулирует пакеты данных запроса и ответа Modbus RTU в TCP-пакет, передаваемый по стандартным сетям Ethernet. Номер устройства по-прежнему включается, и его интерпретация варьируется в зависимости от приложения — адрес устройства или ведомого устройства не является основным средством адресации в TCP. Наиболее важным адресом здесь является IP-адрес, например, 192.168.1.100. Стандартный порт для Modbus TCP — 502, но номер порта часто можно переназначить при необходимости.
Поле контрольной суммы, обычно находящееся в конце пакета RTU, опускается в пакете TCP. В случае Modbus TCP обработка контрольных сумм и ошибок осуществляется Ethernet.
Версия Modbus по протоколу TCP соответствует сетевой эталонной модели OSI. Modbus TCP определяет уровни представления и приложения в модели OSI.
В протоколе Modbus TCP определение «ведущий» и «ведомый» становится менее очевидным, поскольку Ethernet обеспечивает связь между двумя узлами. Определение «клиент» и «сервер» лучше известно в сетях на основе Ethernet. В этом контексте ведомый становится сервером, а ведущий — клиентом. Может быть более одного клиента, получающего данные от сервера. В терминах Modbus это означает, что может быть несколько ведущих устройств, а также несколько ведомых. Вместо определения «ведущий» и «ведомый» для каждого физического устройства отдельно, теперь задача создания логических связей между функциями ведущего и ведомого устройств ложится на разработчика системы.
Что такое Modbus ASCII?
Modbus ASCII — это более старая реализация, содержащая все элементы пакета RTU, но выраженная исключительно в печатных символах ASCII. Modbus ASCII считается устаревшим, используется крайне редко и не включен в официальную спецификацию протокола Modbus.
Обзор типов регистров Modbus
В устройствах Modbus используются следующие типы регистров:
• Катушка (дискретный выход)
• Дискретный вход (или вход состояния)
• Входной регистр
• Регистр хранения
Наличие всех этих типов регистров в конкретном устройстве зависит от производителя. Очень часто все входы/выходы отображаются только на регистры хранения. Катушки — это 1-битные регистры, используемые для управления дискретными выходами, и их можно читать или записывать. Дискретные входы — это 1-битные регистры, используемые в качестве входов, и их можно только читать. Входные регистры — это 16-битные регистры, используемые для ввода, и их можно только читать. Регистры хранения — это наиболее универсальные 16-битные регистры, которые можно читать или записывать, и которые могут использоваться для различных целей, включая входы, выходы, данные конфигурации или любые требования к «хранению» данных.
Шлюзы Control Solutions поддерживают все типы регистров, когда шлюз является ведущим устройством или работает в прямом режиме (Babel Buster SP-GW). Шлюзы Control Solutions, подключающие устройство, не поддерживающее Modbus, к сети Modbus, в некоторых случаях используют только регистры хранения для представления данных устройства, не поддерживающего Modbus.
Большинство устройств ввода-вывода Control Solutions используют регистры хранения для всех типов входов и выходов. В большинстве случаев один и тот же ввод-вывод доступен и для других типов регистров, при этом состояние или значение ввода-вывода дублируются в нескольких регистрах.
Обзор функциональных кодов Modbus
Протокол Modbus определяет несколько функциональных кодов для доступа к регистрам Modbus. Modbus определяет четыре различных блока данных, и адреса или номера регистров в каждом из них частично совпадают. Поэтому для полного определения того, где найти тот или иной фрагмент данных, необходимы как адрес (или номер регистра), так и функциональный код (или тип регистра).
В таблице ниже указаны наиболее часто распознаваемые устройствами Modbus функциональные коды. Это лишь часть доступных кодов — некоторые из них имеют специальное применение, которое чаще всего не используется.
| Код функции | Тип регистра |
| 1 | Читать катушку |
| 2 | Чтение дискретного ввода |
| 3 | Прочтите реестры ожидания. |
| 4 | Чтение входных регистров |
| 5 | Написать сингл |
| 6 | Записать единый реестр холдингов |
| 15 | Напишите несколько катушек |
| 16 | Запись нескольких регистров хранения |
Обзор кодов ошибок Modbus.
Когда ведомое устройство Modbus распознает пакет, но определяет наличие ошибки в запросе, оно возвращает ответ с кодом исключения вместо ответа с данными. Ответ с исключением состоит из адреса ведомого устройства или номера устройства, копии кода функции с установленным старшим битом и кода исключения. Например, если код функции равен 3, то код функции в ответе с исключением будет равен 0x83. Коды исключений могут быть одним из следующих:
|
1 |
Незаконная функция | Полученный в запросе код функции не распознается ведомым устройством или не допускается им. |
|
2 |
Незаконный адрес данных | Полученный в запросе адрес данных (номер регистра) не является допустимым адресом для ведомого устройства, то есть регистр не существует. Если было запрошено несколько регистров, по крайней мере один из них был недопустим. |
|
3 |
Недопустимое значение данных | Значение, содержащееся в поле данных запроса, неприемлемо для подчиненного узла. |
|
4 |
Сбой ведомого устройства | Произошла неисправимая ошибка во время попытки выполнения запрошенного действия подчиненным устройством. |
|
6 |
Ведомое устройство занято | Подчиненное устройство занято обработкой команды, занимающей длительное время. Ведущему устройству следует повторить попытку позже. |
|
10 |
Путь к шлюзу недоступен | Специализированное использование в сочетании со шлюзами обычно означает, что шлюз неправильно настроен или перегружен. |
|
11 |
Целевое устройство шлюза не ответило. | Специализированное использование в сочетании с шлюзами указывает на отсутствие ответа от целевого устройства. |
С чего мне начать налаживание связи с моим устройством Modbus?
Вот несколько первых моментов, которые вам необходимо выяснить:
(1) Какое физическое соединение используется?
Modbus RTU использует RS-485 или RS-232. Modbus TCP использует Ethernet. Если вам нужен шлюз Control Solutions, вам необходимо выбрать модель, соответствующую электрическому интерфейсу оборудования, которое вы хотите подключить. Если вы выбираете устройство ввода-вывода Control Solutions, выберите то, которое соответствует вашей сети.
(2) Как отображаются регистры?
При использовании шлюза для подключения устройства Modbus к сети, не поддерживающей Modbus, вам необходимо получить документацию от производителя оборудования, описывающую доступные регистры и способы их адресации. Протокол Modbus не предоставляет средств для автоматической идентификации регистров. Control Solutions не может определить эту информацию за вас. Вам необходимо обратиться к производителю оборудования.
При использовании устройств ввода-вывода Control Solutions (таких как AddMe III) вы найдете эту информацию в файлах онлайн-справки, прилагаемых к устройству, или на нашем веб-сайте.
(3) Каковы параметры связи?
Для работы Modbus RTU необходимо знать или определить скорость передачи данных, формат символов (8 бит без контроля четности и т. д.) и идентификатор ведомого устройства (также известный как адрес ведомого устройства, номер устройства, идентификатор устройства). Несоответствие любого из этих параметров приведет к невозможности связи. Для работы
Modbus TCP необходимо знать или определить IP-адреса в сети. В некоторых случаях также требуются идентификаторы устройств. Устройства Modbus TCP в системах управления могут использовать идентификатор устройства или игнорировать его в зависимости от устройства и приложения.
Modbus: Когда 40001 на самом деле означает 1, или когда 0 на самом деле означает 1
Документация по Modbus плохо стандартизирована. На самом деле стандарт существует, но его документация плохо соблюдается. Чтобы понять, о каком именно регистре говорит производитель, вам придётся выполнить одно или несколько из следующих действий:
а) Найдите описание регистра, например, «регистр хранения», «катушка» и т. д. Если в документации указано № 1 и говорится, что это регистры хранения, значит, у вас регистр хранения № 1. Кроме того, документация должна быть удобной для пользователя.
б) Посмотрите на сами номера. Если вы видите, что первый регистр в списке имеет номер 40001, это означает, что это регистр № 1, и это регистр хранения. Такая форма обозначения часто называется старой системой обозначений Модикона.
c) Найдите определение используемых кодов функций. Если вы видите регистр № 1, а также обозначение, указывающее на использование кодов функций 3 и 16, это также означает, что в нем хранится регистр № 1.
ВАЖНО: Регистрационный номер 1 — это адрес 0. Читайте дальше…
d) Указанные в вашей документации цифры относятся к номеру регистра или к адресу? Регистр № 1 — это адрес ноль. Если неясно, относится ли ваша документация к регистру или адресу, и вы не получаете ожидаемого результата, попробуйте добавить или вычесть единицу из номера регистра. Во всех продуктах Control Solutions номера регистров указаны в программном обеспечении для настройки или на веб-страницах. Однако некоторые производители указывают в документации к своим устройствам адрес, а не номера регистров. Если у вас есть адреса, необходимо добавить единицу при вводе номера регистра в программное обеспечение для настройки от Control Solutions.
40001: Обозначения регистров Modbus в соответствии с конвенцией Modicon.
Протокол Modbus был первоначально разработан компанией Gould-Modicon, которая в настоящее время является Schneider Electric. Первоначально использовавшаяся компанией Modicon нотация до сих пор часто применяется, хотя и считается устаревшей по современным стандартам Modbus-IDA. Преимущество использования нотации Modicon заключается в том, что в одном числе содержится две части информации: (а) тип регистра; (б) номер регистра. Смещение номера регистра определяет тип.
Примечание: Только в версиях шлюзов Babel Buster от LonWorks используется это обозначение в качестве сокращения для экономии места в командной строке. Многие другие производители оборудования по-прежнему используют это обозначение в своей продукции. В зависимости от используемой комбинации продуктов, вам может потребоваться перевести обозначения между Modicon и текущими обозначениями.
К типам регистров, используемых в устройствах Modbus и поддерживаемых шлюзами Babel Buster, относятся следующие:
• Катушка (дискретный выход)
• Дискретный вход (или вход состояния)
• Входной регистр
• Регистр хранения
Первоначально для Modbus были определены допустимые диапазоны адресов от 0 до 9999 для каждого из вышеуказанных типов регистров. В текущей спецификации допустимые диапазоны составляют от 0 до 65 535. Диапазон адресов, первоначально поддерживаемый шлюзами Babel Buster, составлял от 0 до 9999. Расширенный диапазон адресации был позже добавлен во все новые продукты Babel Buster.
Диапазон адресов применяется к каждому типу регистра, и для определения типа регистра необходимо посмотреть код функции в пакете сообщений Modbus. В системе Modicon для идентификации типа регистра используется первая цифра ссылки на регистр.
В обозначениях Modicon распознаются следующие типы регистров и диапазоны ссылок:
0x = Катушка = 00001-09999
1x = Дискретный вход = 10001-19999
3x = Входной регистр = 30001-39999
4x = Регистр хранения = 40001-49999
On occasion, it is necessary to access more than 10,000 of a register type. Based on the original convention, there is another de facto standard that looks very similar. Additional register types and reference ranges recognized with Modicon notation are as follows:
0x = Coil = 000001-065535
1x = Discrete Input = 100001-165535
3x = Input Register = 300001-365535
4x = Holding Register = 400001-465535
When using the extended register referencing, it is mandatory that all register references be exactly six digits. This is the only way Babel Buster will know the difference between holding register 40001 and coil 40001. If coil 40001 is the target, it must appear as 040001.
Registers Are 16-bits - How Do I Read Floating Point or 32-bit Data?
Modbus protocol defines a holding register as 16 bits wide; however, there is a widely used de facto standard for reading and writing data wider than 16 bits. The most common are IEEE 754 floating point, and 32-bit integer. The convention may also be extended to double precision floating point and 64-bit integer data.
The wide data simply consists of two consecutive "registers" treated as a single wide register. Floating point in 32-bit IEEE 754 standard, and 32-bit integer data, are widely used. Although the convention of register pairs is widely recognized, agreement on whether the high order or low order register should come first is not standardized. For this reason, many devices, including all Control Solutions gateways, support a "swap" option. This means you simply check the "swapped" option if the other device treats wide data in the opposite order relative to Control Solutions default order. In some cases, the “swap” option is more explicitly identified as “high order data is in first register” or something to that effect.
Most Control Solutions Modbus products default to placing the high order register first, or in the lower numbered register. This is known as "big endian", and is consistent with Modbus protocol which is by definition big endian itself. The byte order for all 16-bit values is most significant byte first.
What Does Notation Like 40001:7 Mean?
This is a commonly used notation for referencing individual bits in a register. This particular example references (Modicon notation) register 40001, bit 7. Bits are generally numbered starting at bit 0, which is the least significant or right most bit in the field of 16 bits found in a Modbus register. If this style notation is used, you may see 40001:0 through 40001:15.
How Do I Read Individual Bits in a Register?
Documentation tends to be slightly different for every Modbus device. But if your device packs multiple bits into a single holding register, the documentation will note up to 16 different items found at the same register number or address. The bits may be identified with “Bn” or “Dn” or just “bit n”. Most of the time, the least significant bit will be called bit 0 and the most significant will be bit 15. It is possible you could find reference to bit 1 through bit 16, in which case just subtract one from the number to reference the table below.
You cannot read just one bit from a holding register. There is no way to do that - Modbus protocol simply does not provide that function. You must read all 16 bits, and then test the individual bit you are interested in for true or false (1 or 0). Babel Buster gateways provide an automatic way of doing that by including a "mask" in each register map or rule. Each time the register is read, the mask will be logically AND-ed with the data from the register, and the result will be right justified to yield a 1 or 0 based on whether the selected bit was 1 or 0. Babel Buster gateways provide optimization when successive read maps or rules are selecting different bits from the same register. The Modbus register will be read from the slave once, and the 16-bit data will be shared with successive maps or rules, with each map or rule selecting its bit of interest.
The bit mask shown in the expanded form of the Babel Buster RTU read map is a 4 digit hexadecimal (16 bit) value used to mask out one or more bits in a register. The selected bits will be right justified, so a single bit regardless of where positioned in the source register will be stored locally as 0 or 1. The hex bit mask values would be as follows:
B0/D0/bit 0 mask = 0001
B1/D1/bit 1 mask = 0002
B2/D2/bit 2 mask = 0004
B3/D3/bit 3 mask = 0008
B4/D4/bit 4 mask = 0010
B5/D5/bit 5 mask = 0020
B6/D6/bit 6 mask = 0040
B7/D7/bit 7 mask = 0080
B8/D8/bit 8 mask = 0100
B9/D9/bit 9 mask = 0200
B10/D10/bit 10 mask = 0400
B11/D11/bit 11 mask = 0800
B12/D12/bit 12 mask = 1000
B13/D13/bit 13 mask = 2000
B14/D14/bit 14 mask = 4000
B15/D15/bit 15 mask = 8000
Some Modbus devices also back two 8-bit values into a single 16-bit register. The two values will typically be documented as “high byte” and “low byte” or simply have “H” and “L” indicated. If you run into this scenario, the masking for bytes is as follows:
High byte mask = FF00
Low byte mask = 00FF
When the mask value in a Babel Buster gateway is more than just one bit, the mask is still logically AND-ed with the data from the Modbus slave, and the entire resulting value is right justified to produce an integer value of less than the original bit width of the original register.
There have been a few instances of documenting packed bits in a 32-bit register. Although Modbus protocol is strictly 16-bit registers, some implementations force you to read pairs of registers. If your device documents 32 packed bits, then you would insert 0000 in front of each mask above, and the remainder of the list would be as follows:
B16/D16/bit 16 mask = 00010000
B17/D17/bit 17 mask = 00020000
B18/D18/bit 18 mask = 00040000
B19/D19/bit 19 mask = 00080000
B20/D20/bit 20 mask = 00100000
B21/D21/bit 21 mask = 00200000
B22/D22/bit 22 mask = 00400000
B23/D23/bit 23 mask = 00800000
B24/D24/bit 24 mask = 01000000
B25/D25/bit 25 mask = 02000000
B26/D26/bit 26 mask = 04000000
B27/D27/bit 27 mask = 08000000
B28/D28/bit 28 mask = 10000000
B29/D29/bit 29 mask = 20000000
B30/D30/bit 30 mask = 40000000
B31/D31/bit 31 mask = 80000000
Can I Put 2 Gateways on the Same Modbus Network?
You can not have more than one Master on a Modbus RTU (RS-485) network. Therefore, if the gateway is to be configured as the Master, you can only have 1 gateway. You cannot use multiple gateways to read more points from the same Modbus slave device.
Multiple gateways configured as slaves can reside on the same Modbus RS-485 network.
If you are using RS-232 devices, you can have only two devices total, regardless of how they are configured. RS-232 is not multi-drop.
How Many Devices Can I Have on a Modbus Network?
Логично предположить, что можно подключить более 250 устройств; однако трансиверы RS-485 физически не способны управлять таким количеством устройств. Протокол Modbus устанавливает ограничение в 32 устройства, и большинство трансиверов RS-485 с этим согласны. Более 32 устройств можно подключить только в том случае, если все устройства в сети имеют трансиверы с низкой нагрузкой.- Комментарии
