Modbus — это протокол последовательной связи, первоначально разработанный корпорацией Modicon (ныне частью Schneider Electric) в 1979 году для использования с ее ПЛК (программируемыми логическими контроллерами). Modbus стал широко используемым протоколом связи в промышленной сфере, особенно в системах мониторинга и управления. Протокол Modbus поддерживает различные методы связи, включая RTU (удаленный терминальный блок, режим удаленного терминального устройства), TCP/IP и ASCII (американский стандартный код обмена информацией) и т. д.
В этой статье в основном представлена структура сообщений Modbus RTU, Modbus TCP и Modbus ASCII.
Modbus RTU (удаленный терминальный блок) — это протокол, широко используемый в последовательной связи и в основном используемый между устройствами в промышленной сфере. Этот протокол основан на архитектуре главный/подчиненный (или клиент/сервер), которая позволяет главному устройству (часто называемому главным) взаимодействовать с несколькими подчиненными устройствами (часто называемыми подчиненными). В протоколе Modbus RTU данные передаются в двоичной форме, что делает связь более эффективной.
Типичная структура сообщения Modbus RTU выглядит следующим образом:
использовать | Адрес устройства | Код функции | данные | проверка CRC |
---|---|---|---|---|
длина | 8bit | 8bit | Переменная (от 0 до 252 8 бит) | 16bit |
описывать | Каждый подчиненный имеет уникальный адрес. Диапазон адресов от 0 до 247. Адрес 0 является широковещательным адресом и отправляет сообщения всем ведомым устройствам, но ведомые устройства не будут отвечать на широковещательную информацию. | Используется для указания типа операции, которую ведущий требует от ведомого для выполнения. | переменная длины в части данных,Содержит конкретные параметры команды,Точный формат длины зависит от функции Кода. | Используется для проверки наличия ошибок при передаче данных. |
В стандартном протоколе Modbus функциональные коды делятся на три категории: общедоступные функциональные коды, пользовательские функциональные коды и зарезервированные функциональные коды.
Хост отправляет часть данных:
Хост отправляет данные с кодом функции 03, указывая, что он хочет прочитать содержимое трех регистров, начиная с 0x0032.
использовать | Зарегистрировать начальный адрес высокого уровня | Начальный адрес регистрации – низкий | Количество регистров - высокое | Количество регистров - низкое |
---|---|---|---|---|
длина | 8bit | 8bit | 8bit | 8bit |
Пример | 0x00 | 0x32 | 0x00 | 0x03 |
Информационная часть ответа подчиненного устройства:
Ведомое устройство отправляет данные с кодом функции 03, что означает, что считанные данные составляют в общей сложности 6 байтов: 0x00, 0x01, 0x00, 0x02, 0x00 и 0x03. То есть считываемые данные трех регистров равны 0x0001. 0x0002, 0x0003.
использовать | Возвращаемое количество байтов | Регистр 1 с высоким уровнем данных | Регистр 1, низкий уровень данных | Регистр 2, высокий уровень данных | Регистр 2, низкий уровень данных | Регистр 3, высокий уровень данных | Регистр 3, низкий уровень данных |
---|---|---|---|---|---|---|---|
длина | 8bit | 8bit | 8bit | 8bit | 8bit | 8bit | 8bit |
Пример | 0x06 | 0x00 | 0x01 | 0x00 | 0x02 | 0x00 | 0x03 |
Данные, отправленные ведущим в функциональном коде 06, аналогичны данным, возвращаемым ведомым.
Если хост хочет записать 0x0001 в регистр 0x0032, данные будут следующими:
использовать | Зарегистрировать адрес-высокий | Адрес регистрации - низкий | Запись данных - высокий | Запись данных - низкий |
---|---|---|---|---|
длина | 8bit | 8bit | 8bit | 8bit |
Пример | 0x00 | 0x32 | 0x00 | 0x01 |
Хост отправляет часть данных:от0x0032начать регистрацию,3 последовательных регистра,Запишите данные как 0x0001, 0x0002, 0x0003 соответственно.
использовать | Зарегистрировать начальный адрес высокого уровня | Начальный адрес регистрации – низкий | Количество регистров - высокое | Количество регистров - низкое | Регистр 1 с высоким уровнем данных | Регистр 1, низкий уровень данных | Регистр 2, высокий уровень данных | Регистр 2, низкий уровень данных | Регистр 3, высокий уровень данных | Регистр 3, низкий уровень данных |
---|---|---|---|---|---|---|---|---|---|---|
длина | 8bit | 8bit | 8bit | 8bit | 8bit | 8bit | 8bit | 8bit | 8bit | 8bit |
Пример | 0x00 | 0x32 | 0x00 | 0x03 | 0x00 | 0x01 | 0x00 | 0x02 | 0x00 | 0x03 |
Подчиненный отвечает на часть данных:от0x0032начать регистрацию,писатьданныеприезжать3 последовательных регистра。
использовать | Зарегистрировать начальный адрес высокого уровня | Начальный адрес регистрации – низкий | Количество регистров - высокое | Количество регистров - низкое |
---|---|---|---|---|
длина | 8bit | 8bit | 8bit | 8bit |
Пример | 0x00 | 0x32 | 0x00 | 0x03 |
Обычно при связи Modbus могут возникать три типа нештатных ситуаций:
использовать | Код исключения |
---|---|
длина | 8bit |
Пример | 0x04 |
Общие коды исключений следующие:
Код исключения | имя | Причина |
---|---|---|
01 (0x01) | Недопустимый функциональный код | Ведомая машина не поддерживает функциональные коды. |
02 (0x02) | Незаконный адрес данных | В подчиненной машине соответствующего регистра нет. |
03 (0x03) | незаконное значение данных | Данные выходят за пределы доступного диапазона или данные недоступны. |
04 (0x04) | Сбой ведомой машины | На ведомом компьютере произошла неизвестная ошибка. |
05 (0x05) | подтверждать | Ведомое устройство приняло команду и обрабатывает ее, чтобы избежать ошибок тайм-аута. |
06 (0x06) | Раб занят | Ведомое устройство обрабатывает длинную команду |
07 (0x07) | отрицательное подтверждение | Ведомое устройство не может выполнить команду хоста |
08 (0x08) | ошибка четности хранилища | Расширенная файловая область не может пройти проверку целостности. |
Modbus проверка, обычно используемая в протоколе RTU CRC采用的даCRC-16алгоритм,具体的多项式для0x8005
(или его двоичная форма1000 0000 0000 0101
),初始ценитьдля0xFFFF
。
Основные этапы проверки CRC следующие:
0xFFFF
。0x8005
Выполнить операцию XOR;если最高Кусочекдля0,Затем просто сдвиньте одну позицию влево. Повторите этот процесс,Пока не будут обработаны все 8 бит. Затем продолжите обработку следующего байта,Пока все байты не будут заполнены.Когда получатель получает сообщение,Один и тот же процесс вычисления CRC будет использоваться для всего сообщения (включая проверочный код CRC). Если сообщение не было подделано,вычислитьрезультат应для0x0000
(考虑приезжать了CRCкод的加入ивычислитьправило)。еслирезультат不да0x0000
,Это указывает на то, что существующее сообщение могло быть подделано или во время передачи могли возникнуть ошибки.
Modbus TCP — это расширение, основанное на протоколе Modbus RTU, который является протоколом связи, используемым в Ethernet. По сравнению с Modbus RTU, формат сообщения Modbus TCP в основном добавляет заголовок MBAP (заголовок протокола приложения Modbus) перед сообщением для передачи в сети TCP/IP.
использовать | идентификатор транзакции | идентификатор протокола | Поле длины | идентификатор объекта | *Код функции | данные |
---|---|---|---|---|---|---|
длина | 16bit | 16bit | 16bit | 8bit | 8 | Переменная (от 0 до 252 8 бит) |
описывать | Используется для определения соответствия между запросом и ответом.,Каждому запросу, инициированному клиентом, присваивается уникальный идентификатор транзакции.,Сервер существует, ответит тем же идентификатором. | Используется для идентификации протокола верхнего уровня, фиксированного по адресу 0x0000. | Представляет общую длину следующего идентификатора объекта Код функции в байтах. | Используется для идентификации ведомого устройства на удаленном сервере при подключении к шлюзу Modbus. Используется для указания типа операции ведомого ведомого устройства запроса ведущего устройства. | переменная длины в части данных,Содержит конкретные параметры команды,Точный формат длины зависит от функции Кода. |
идентификатор транзакции、идентификатор протокола、Поле длины、идентификатор объекта四部分Прямо сейчасдляMBAPголова。
Указывает следующий идентификатор объекта、Код функциииданныеобщего количествадлина,Единица измерения — байты. Например, длина поля равна 0x0008.,Тогда длина следующей части составит 8 байт.
Modbus ASCII (Американский стандартный код обмена информацией) Формат Сообщения — это вариант протокола Modbus, который позволяет устройствам обмениваться данными в текстовом формате. Этот формат особенно подходит для приложений, где скорость не имеет решающего значения и требуется проверка человеческого глаза.
использовать | Стартер | Адрес устройства | Код функции | данные | Контрольная сумма | терминатор |
---|---|---|---|---|---|---|
длина | 1 символ ASCII | 2 символа ASCII | 2 символа ASCII | Переменная (0–504 символов ASCII, должно быть четным числом) | 2 символа ASCII | 2 символа ASCII |
описывать | Начинается с символа двоеточия (":"), выраженного как 0x3A в коде ASCII. | Каждый подчиненный имеет уникальный адрес. Диапазон адресов от 0 до 247. Адрес 0 является широковещательным адресом и отправляет сообщения всем ведомым устройствам, но ведомые устройства не будут отвечать на широковещательную информацию. | Используется для указания типа операции, которую ведущий требует от ведомого для выполнения. | переменная длины в части данных,Содержит конкретные параметры команды,Точный формат длины зависит от функции Кода. | Используется для проверки наличия ошибок при передаче данных. | Каждое сообщение заканчивается символами возврата каретки и перевода строки (CR LF, коды ASCII 0x0D и 0x0A). |
В режиме ASCII каждый символ занимает 10 бит, а формат каждого символа:
использовать | стартовый бит | данные Кусочек | проверка четности | Стоп-бит |
---|---|---|---|---|
длина | 1bit | 7bit | 1bit | 1bit |
Примечание | Отметить начало передачи данных | Фактическое содержимое данных, то есть отображаемый код ASCII. | для обнаружения ошибок | Отметить окончание передачи данных |
В начале каждого сообщения Modbus ASCII будет стоять такое двоеточие, чтобы сообщить принимающему устройству, что начинается новое сообщение.
Благодаря Модбусу Каждый байт в ASCII представлен двумя символами ASCII: адрес. устройство не является исключением. Например, если Адрес устройствада17(десятичный),Оно будет преобразовано в шестнадцатеричное число 11.,Тогда существование представлено в сообщении ASCII в виде двух символов «11».
такой же Модбус РТУ то же самое, которое использует символы ASCII для отображения кода Шестнадцатеричное число функций.
такой же Модбус РТУ то же самое, которое использует символы ASCII для отображения кода Шестнадцатеричное число функций.
Modbus ASCII использует простую Контрольную механизм пакета, называемый LRC (Продольный Redundancy Проверка, проверка вертикального избыточности). Целью LRC является обеспечение целостности и точности процесса передачи данныхсуществовать. LRCКонтрольная Размер получается путем вычисления значений ASCII всех символов сообщения.
Этапы расчета LRC следующие:
В режиме Modbus ASCII конечный символ каждого сообщения состоит из двух символов: CR (возврат каретки) и LF (перевод строки). В кодировке ASCII шестнадцатеричное значение CR равно 0x0D, а шестнадцатеричное значение LF — 0x0A. Поэтому в конце каждого сообщения Modbus ASCII будет такая последовательность символов: 0x0D0x0A.