Подробное объяснение сообщений Modbus
Подробное объяснение сообщений Modbus

Modbus — это протокол последовательной связи, первоначально разработанный корпорацией Modicon (ныне частью Schneider Electric) в 1979 году для использования с ее ПЛК (программируемыми логическими контроллерами). Modbus стал широко используемым протоколом связи в промышленной сфере, особенно в системах мониторинга и управления. Протокол Modbus поддерживает различные методы связи, включая RTU (удаленный терминальный блок, режим удаленного терминального устройства), TCP/IP и ASCII (американский стандартный код обмена информацией) и т. д.

В этой статье в основном представлена ​​структура сообщений Modbus RTU, Modbus TCP и Modbus ASCII.

1.Modbus RTU

1.1 Введение

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

1.2 Формат сообщения

Типичная структура сообщения Modbus RTU выглядит следующим образом:

использовать

Адрес устройства

Код функции

данные

проверка CRC

длина

8bit

8bit

Переменная (от 0 до 252 8 бит)

16bit

описывать

Каждый подчиненный имеет уникальный адрес. Диапазон адресов от 0 до 247. Адрес 0 является широковещательным адресом и отправляет сообщения всем ведомым устройствам, но ведомые устройства не будут отвечать на широковещательную информацию.

Используется для указания типа операции, которую ведущий требует от ведомого для выполнения.

переменная длины в части данных,Содержит конкретные параметры команды,Точный формат длины зависит от функции Кода.

Используется для проверки наличия ошибок при передаче данных.

1.3 Подробное объяснение сообщений

1.3.1 Адрес устройства

1.3.1.1 Диапазон адресов
  • В Modbus RTU каждому ведомому устройству присваивается уникальный адрес для идентификации в сети.
  • Этот адрес представляет собой 8-битное значение в диапазоне от 0 до 247.
  • Обычно адрес 0 зарезервирован для широковещательных команд, т. е. команд, отправляемых всем устройствам в сети.
  • Адреса с 248 по 255 обычно зарезервированы для специальных функций или использования в будущем. 1.3.1.2 Конфигурация адреса
  • Адрес устройства обычно требует настройки до того, как устройство будет подключено к сети Modbus.
  • Разные производители устройств могут предоставлять разные способы установки этих адресов, например, с помощью DIP-переключателей, программных интерфейсов или напрямую с помощью команд Modbus. 1.3.1.3 Процесс коммуникации
  • Когда ведущий отправляет команду ведомому, ведущий включает адрес ведомого в начало сообщения. После того, как ведомое устройство получит сообщение, оно сначала проверит адрес сообщения. Если сообщение отправлено самому себе, оно будет выполнено, в противном случае оно будет отброшено.
  • Для широковещательного адреса (0) все устройства будут выполнять эту команду. 1.3.1.4 Конфликт адресов
  • Если двум или более устройствам присвоен один и тот же адрес, это приведет к конфликту адресов и сбою связи. 1.3.2 Код функции

В стандартном протоколе Modbus функциональные коды делятся на три категории: общедоступные функциональные коды, пользовательские функциональные коды и зарезервированные функциональные коды.

  • Публичный код Функция одобрена Ассоциацией Modbus и предоставляет общедоступную документацию для Кода. функция. существование четко определено в документе, что обеспечивает уникальность.
  • Настроить функция настраивается каждым производителем (пользователем) функции, уникальность не гарантируется.
  • Сдержанный функциидасуществовать Формат сообщения Некоторый код, используемый, когда не дарят веер функция, которая сейчас существует, больше не предназначена для публичного использования. (Общественный код функцияинастроить Код Разницу между функциями можно приблизительно определить, сравнивая известный порт и зарегистрированный порт вычислительной машины) 1.3.2.1 Читать код функции
  • 01 (0x01): Чтение состояния катушки (Чтение Coils)- Используется для чтения текущего состояния (ВКЛ/ВЫКЛ) группы логических катушек.
  • 02 (0x02): Чтение состояния дискретного входа (Чтение Discrete Inputs)- Используется для считывания состояния (ВКЛ/ВЫКЛ) набора дискретных входов.
  • 03 (0x03): Чтение регистра хранения (Чтение Holding Registers)- Используется для чтения двоичного содержимого набора регистров временного хранения.
  • 04 (0x04): Чтение входного регистра (Чтение Input Registers)- Используется для чтения двоичного содержимого набора входных регистров.
1.3.2.2 Запись кода функции
  • 05 (0x05): Запишите одну катушку (Write Single Coil)- Используется для записи состояния (ВКЛ/ВЫКЛ) одной логической катушки.
  • 06 (0x06): Запишите один регистр (Write Single Register)- данные для записи в единый регистр временного хранения.
  • 15 (0x0F): Запись нескольких катушек (Запись Multiple Coils)- Используется для записи состояния набора логических катушек.
  • 16 (0x10): Запись нескольких регистров (Запись Multiple Registers)- данные, используемые для записи в набор регистров временного хранения.
1.3.2.3 Код диагностической функции
  • 08 (0x08): Диагностика - Код этой группы Функция используется для диагностики состояния каналов связи, а также тестирования и диагностики устройств Modbus. 1.3.2.4 Специальный код функции
  • 17 (0x11): Сообщить идентификатор подчиненного устройства (Отчет Slave ID)- Возвращает информацию об устройстве, такую ​​как рабочее состояние и идентификационную информацию.
  • 22 (0x16): Регистр записи маски (Маска Write Register)- Позволяет пользователю изменять содержимое регистров временного хранения без изменения содержимого неуказанных битов.
  • 23 (0x17): Чтение/запись нескольких регистров (чтение/запись Multiple Registers)- Операции чтения и записи выполняются одновременно. 1.3.2.5 Код исключения
  • Ненормальный код функции:Ненормальный код функциидля正常Код функции + 0x80,Если возвращается ошибка записи одного регистра Код исключениядля0x86。1.3.3 Данныеданные часть в основном содержит конкретное содержимое команды, а ее структура и длина зависят от Кода. Разница функций. В этой статье перечислены только несколько распространенных кодов. функция, а также структура и функции соответствующей части данных:
1.3.3.1 Чтение регистра временного хранения (код функции 03)

Хост отправляет часть данных

Хост отправляет данные с кодом функции 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

1.3.3.2 Запись одного регистра (код функции 06)

Данные, отправленные ведущим в функциональном коде 06, аналогичны данным, возвращаемым ведомым.

Если хост хочет записать 0x0001 в регистр 0x0032, данные будут следующими:

использовать

Зарегистрировать адрес-высокий

Адрес регистрации - низкий

Запись данных - высокий

Запись данных - низкий

длина

8bit

8bit

8bit

8bit

Пример

0x00

0x32

0x00

0x01

1.3.3.3 Запись нескольких регистров (код функции 16)

Хост отправляет часть данных:от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

1.3.3.4 Аномальные данные (аномальный функциональный код)

Обычно при связи Modbus могут возникать три типа нештатных ситуаций:

  • 1. По таким причинам, как сбои связи, если ведомое устройство не получает информацию от хоста, хост обработает ее в соответствии с тайм-аутом.
  • 2. Ведомое устройство получает сообщение, но сообщение неверное (проверка CRC не удалась). Ведомое устройство отбросит сообщение, а хост обработает его в соответствии с таймаутом.
  • 3. Ведомое устройство получило сообщение, но операция, требуемая сообщением, не может быть реализована (например, Код функция не содержит существования, диапазон регистров не равен), ведомое устройство вернет сообщение, содержащее Код ответное сообщение об исключении.

использовать

Код исключения

длина

8bit

Пример

0x04

Общие коды исключений следующие:

Код исключения

имя

Причина

01 (0x01)

Недопустимый функциональный код

Ведомая машина не поддерживает функциональные коды.

02 (0x02)

Незаконный адрес данных

В подчиненной машине соответствующего регистра нет.

03 (0x03)

незаконное значение данных

Данные выходят за пределы доступного диапазона или данные недоступны.

04 (0x04)

Сбой ведомой машины

На ведомом компьютере произошла неизвестная ошибка.

05 (0x05)

подтверждать

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

06 (0x06)

Раб занят

Ведомое устройство обрабатывает длинную команду

07 (0x07)

отрицательное подтверждение

Ведомое устройство не может выполнить команду хоста

08 (0x08)

ошибка четности хранилища

Расширенная файловая область не может пройти проверку целостности.

1.3.4 Проверка CRC

Modbus проверка, обычно используемая в протоколе RTU CRC采用的даCRC-16алгоритм,具体的多项式для0x8005(или его двоичная форма1000 0000 0000 0101),初始ценитьдля0xFFFF

Основные этапы проверки CRC следующие:

  1. Предустановка:CRCзарегистрироваться Предустановкадля0xFFFF
  2. данныевходить:сообщение кромепроверка Все байты, кроме кода CRC (включая адрес). устройства、Код функцииидные) обрабатываются по порядку.
  3. вычислить:за каждый байт,От самой высокой позиции до самой низкой позиции,Выполните операцию XOR с текущим значением регистра CRC. Если старший бит результата равен 1,则Волязарегистрироваться的ценить左移一Кусочек并与0x8005Выполнить операцию XOR;если最高Кусочекдля0,Затем просто сдвиньте одну позицию влево. Повторите этот процесс,Пока не будут обработаны все 8 бит. Затем продолжите обработку следующего байта,Пока все байты не будут заполнены.
  4. результат:наконецCRCзарегистрироватьсясередина的ценить就дапроверка CRCкод,Обычно существование преобразуется в форму существования младшего байта перед передачей (Little-Endian).,и добавляется в конец сообщения.

Когда получатель получает сообщение,Один и тот же процесс вычисления CRC будет использоваться для всего сообщения (включая проверочный код CRC). Если сообщение не было подделано,вычислитьрезультат应для0x0000(考虑приезжать了CRCкод的加入ивычислитьправило)。еслирезультат不да0x0000,Это указывает на то, что существующее сообщение могло быть подделано или во время передачи могли возникнуть ошибки.

2.Modbus TCP

2.1 Введение

Modbus TCP — это расширение, основанное на протоколе Modbus RTU, который является протоколом связи, используемым в Ethernet. По сравнению с Modbus RTU, формат сообщения Modbus TCP в основном добавляет заголовок MBAP (заголовок протокола приложения Modbus) перед сообщением для передачи в сети TCP/IP.

2.2 Формат сообщения

использовать

идентификатор транзакции

идентификатор протокола

Поле длины

идентификатор объекта

*Код функции

данные

длина

16bit

16bit

16bit

8bit

8

Переменная (от 0 до 252 8 бит)

описывать

Используется для определения соответствия между запросом и ответом.,Каждому запросу, инициированному клиентом, присваивается уникальный идентификатор транзакции.,Сервер существует, ответит тем же идентификатором.

Используется для идентификации протокола верхнего уровня, фиксированного по адресу 0x0000.

Представляет общую длину следующего идентификатора объекта Код функции в байтах.

Используется для идентификации ведомого устройства на удаленном сервере при подключении к шлюзу Modbus. Используется для указания типа операции ведомого ведомого устройства запроса ведущего устройства.

переменная длины в части данных,Содержит конкретные параметры команды,Точный формат длины зависит от функции Кода.

идентификатор транзакцииидентификатор протоколаПоле длиныидентификатор объекта四部分Прямо сейчасдляMBAPголова。

2.3 Подробное объяснение сообщений

2.3.1 Идентификатор транзакции

  • Используется для определения соответствующей связи между запросом и ответом. Каждому запросу, инициированному клиентом, будет присвоен уникальный идентификатор. Существующий сервер ответит тем же идентификатором. существует среда одновременного запроса, идентификатор передача особенно важна.
  • идентификатор Трансляция обычно генерируется отправителем запроса и генерируется различными методами, такими как инкрементный и случайный. 2.3.2 идентификатор протокола
  • идентификатор протокола используется для идентификации верхнего протокола. существуют Стандартный Modbus TCPВ приложении,Это значение установлено на 0x0000.,Указывает, что используется протокол Modbus.
  • Хотяидентификатор протокола обычно установлен в 0, но его хранилище существует для Modbus TCP предлагает расширенные возможности. Это означает, что в будущем, если потребуется, Modbus TCP может поддерживать другие языки помимо Modbus без изменения существующей архитектуры. 2.3.3 Поле длины

Указывает следующий идентификатор объекта、Код функциииданныеобщего количествадлина,Единица измерения — байты. Например, длина поля равна 0x0008.,Тогда длина следующей части составит 8 байт.

2.3.4 Идентификатор устройства

  • В чистом Modbus Идентификатор в сети TCP Объект обычно имеет значение 0 или 255. Это связано с тем, что в такой среде, как существование, IP-адресов достаточно, чтобы различать разные устройства, идентификаторы Объект не служит для различения устройств.
  • Modbus Шлюз TCP-RTU/ASCII, Modbus Запрос TCP отправляется по сети на шлюзовое устройство, которое затем преобразует запрос в Modbus. Формат RTU или ASCII и отправляется назначенному ведомому устройству через последовательную связь. существуют В этом случае идентификатор Объект используется, чтобы сообщить шлюзу, на какой подчиненный компьютер следует перенаправить этот запрос. 2.3.5 Код функциитакой же Модбус RTU то же,что и 2.3.6 данныетакой же Модбус РТУ то же самое

3. Modbus ASCII

3.1 Введение

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

3.2 Формат сообщения

использовать

Стартер

Адрес устройства

Код функции

данные

Контрольная сумма

терминатор

длина

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.

для обнаружения ошибок

Отметить окончание передачи данных

3.3 Подробное объяснение сообщений

3.3.1 Начальный символ

В начале каждого сообщения Modbus ASCII будет стоять такое двоеточие, чтобы сообщить принимающему устройству, что начинается новое сообщение.

3.3.2 Адрес устройства

Благодаря Модбусу Каждый байт в ASCII представлен двумя символами ASCII: адрес. устройство не является исключением. Например, если Адрес устройствада17(десятичный),Оно будет преобразовано в шестнадцатеричное число 11.,Тогда существование представлено в сообщении ASCII в виде двух символов «11».

3.3.3 Функциональный код

такой же Модбус РТУ то же самое, которое использует символы ASCII для отображения кода Шестнадцатеричное число функций.

3.3.4 Данные

такой же Модбус РТУ то же самое, которое использует символы ASCII для отображения кода Шестнадцатеричное число функций.

3.3.5 Контрольная сумма

Modbus ASCII использует простую Контрольную механизм пакета, называемый LRC (Продольный Redundancy Проверка, проверка вертикального избыточности). Целью LRC является обеспечение целостности и точности процесса передачи данныхсуществовать. LRCКонтрольная Размер получается путем вычисления значений ASCII всех символов сообщения.

Этапы расчета LRC следующие:

  1. Инициализировать LRC:LRC的初始ценитьдля0x00。
  2. вычислить Контрольная сумма:Удалить начальное двоеточие из сообщенияи Все символы, кроме завершающего символа возврата каретки и перевода строки.(实际上да它们的ASCIIценить)по два(因дляModbus ASCIIВоля每个字节分для两个ASCIIперсонажи, которые представляют),Преобразовать в байты (т.е.,Преобразуйте шестнадцатеричное число, соответствующее символу ASCII, в байты),Затем накапливались в LRC. Если во время этого процесса накопленный результат превышает диапазон представления в один байт (то есть превышает 0xFF),Тогда сохраняются только младшие 8 бит результата.
  3. Отменить и добавить один:После завершения накопления,ВоляLRC的ценить取反(Прямо сейчас0xFF - LRC), а затем прибавьте 1. Конечным результатом, полученным таким образом, является LRCКонтрольная, прикрепляемая при отправке сообщения. сумма。
  4. Обработка при отправке сообщений:вычислитьвнеLRCКонтрольная размер необходимо преобразовать в два символа ASCII, добавляемые в конце сообщения, за которыми следует завершающий возврат каретки и перевод строки. Таким образом, после того, как получатель существует, получит сообщение, он может использовать тот же метод вычислить Контрольная завершения, и с полученной Контрольной длительное сравнение для проверки полноты и точности данных. 2.3.6 терминатор

В режиме Modbus ASCII конечный символ каждого сообщения состоит из двух символов: CR (возврат каретки) и LF (перевод строки). В кодировке ASCII шестнадцатеричное значение CR равно 0x0D, а шестнадцатеричное значение LF — 0x0A. Поэтому в конце каждого сообщения Modbus ASCII будет такая последовательность символов: 0x0D0x0A.

  • CR(Carriage Return,Введите): существовала эпоха пишущих машинок,Эта операция возвращает заголовок в начало строки. существоватьвычислить машинный текстовый файл,Его эффект зависит от системы,Но обычно он используется для обозначения конца строки.
  • LF(Line Подача, перевод строки): существуют. В эпоху пишущих машинок эта операция прокручивала лист на одну строку вверх. существоватьвычислить В машинных текстовых файлах оно обычно используется для обозначения начала новой строки. В Modbus ASCII-протокол,Совместное использование CRиLF в качестве терминатора сообщения,Можно гарантировать, что независимо от того, какая операционная система существует,Принимающее устройство правильно распознает конец сообщения,выполнить соответствующую обработку.
boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose