Modbus RTU, ASCII и TCP с SerialTool

Последнее обновление автор Oliver Reed

Что такое Modbus

Протокол Modbus — это протокол последовательной связи, созданный в 1979 году компанией Modicon® (сегодня входящей в группу Schneider Electric) для организации обмена данными между программируемыми логическими контроллерами (PLC). Он стал стандартом de facto в промышленной связи и сегодня является одним из самых распространённых протоколов подключения среди промышленных электронных устройств во всём мире. Modbus — это протокол без лицензионных отчислений, спецификации которого опубликованы на сайте The Modbus Organization.

Проще говоря, это способ передачи информации по последовательным линиям между электронными устройствами. Устройство, которое запрашивает информацию, называется клиентом Modbus, а устройства, которые предоставляют информацию, — серверами Modbus. В стандартной сети Modbus есть один клиент и до 247 серверов, каждый с уникальным адресом от 1 до 247. Клиент также может записывать информацию на серверы.


Изначально предназначенный для промышленного применения, со временем этот протокол начал использоваться и в других сферах и стал одним из самых распространённых. Даже сегодня, несмотря на то что ему уже более 40 лет, он по-прежнему используется во многих устройствах: панелях оператора, PLC, системах домашней автоматизации и даже простых устройствах вроде Arduino.

Передача Modbus RTU и ASCII по последовательному интерфейсу

Когда протокол был создан, связь предполагалось осуществлять через последовательный порт, поэтому эта возможность была реализована в SerialTool. Modbus часто используется для соединения компьютера верхнего уровня с удалённым терминальным устройством (RTU) в системах SCADA (Supervisory Control and Data Acquisition). В зависимости от формата передачи данных протокол делится на:

  • MODBUS RTU - данные передаются в шестнадцатеричном формате.
  • MODBUS ASCII - данные передаются в формате ASCII.

Проверка ошибок в этих двух случаях различается: в MODBUS RTU используется CRC (Cyclic Redundancy Check), добавляемый к командам, а в MODBUS ASCII — LRC (Longitudinal Redundancy Check), который также передаётся после команд.

Передача Modbus TCP

В 1999 году был разработан «Modbus TCP» — стандарт для сетей, использующих стек протоколов TCP/IP. По сути это версия последовательного Modbus RTU, работающая поверх TCP/IP, что позволяет обмениваться данными через сети Internet/Intranet. В последние годы версия TCP/IP используется всё чаще, поскольку она является Open Source, проста в реализации, недорога в разработке и требует минимальной аппаратной поддержки.

Проверка ошибок в этих двух случаях различается: в MODBUS RTU используется CRC (Cyclic Redundancy Check), добавляемый к командам, а в MODBUS ASCII — LRC (Longitudinal Redundancy Check), который также передаётся после команд.

Протокол Modbus TCP/IP использует двоичное кодирование данных и механизм обнаружения ошибок TCP/IP. В отличие от последовательного Modbus, версия TCP/IP является ориентированной на соединение и позволяет выполнять одновременные соединения с одним и тем же slave-устройством или с несколькими устройствами. Modbus TCP/IP также использует модель master-slave; в этой коммуникации дополнительно используются четыре типа сообщений.

Modbus располагается на уровне 7 стека ISO/OSI (уровень приложения), определяя форматирование сообщений, называемое framing, а также способ передачи данных и управляющих функций. Связь осуществляется по модели клиент-сервер. Протокол определяет Protocol Data Unit (PDU), не зависящую от нижележащего уровня связи. Application Data Unit (ADU) добавляет дополнительные поля для адресации и контроля ошибок.

Клиент Modbus SerialTool (Master / Polling)

SerialTool — это клиент Modbus RTU, ASCII и TCP с polling, сканированием регистров, мониторингом трафика и графиками в реальном времени для тестирования и отладки промышленных устройств.

Клиент Modbus позволяет подключаться к устройству Modbus Slave/server по последовательному интерфейсу (RTU или ASCII) или по сети (TCP через IPv4 или IPv6), читать и записывать данные с помощью стандартных функций Modbus, а также создавать устройство Modbus с собственной картой, на котором может выполняться запланированный polling.
Внутри прототипа устройства можно добавлять структуры Modbus (Discrete Output Coils, Discrete Input Contacts, Analog Input Register, Analog Output Holding Register) и сохранять устройство, чтобы при необходимости загружать его повторно. Прототип устройства Modbus также можно экспортировать в форматах Text, CSV или PDF для простого и наглядного обмена.
После создания устройства с корректной картой можно отображать графики в реальном времени со значениями, считанными непосредственно со Slave-устройства при помощи запланированного polling.
SerialTool также предоставляет возможность просматривать трафик Modbus (Serial и TCP) в отдельном терминале для исходящего и входящего трафика. Расширенный терминал поддерживает экспорт данных и фильтрацию входящих и исходящих данных в реальном времени.
SerialTool также позволяет сканировать удалённое Slave-устройство с помощью функции Modbus Scanner. При правильной настройке фильтров можно попытаться определить карту удалённого устройства (Modbus Slave), даже не зная поддерживаемые в данный момент регистры. Функция Modbus Scanner особенно полезна, если требуется исследовать устройство, характеристики которого неизвестны или известны лишь частично.

Ниже показан главный экран модуля Modbus в SerialTool:

Modbus Client (Master/Polling) Main page

Главный экран клиента Modbus в SerialTool

Главный экран выделяет основные возможности SerialTool и клиента Modbus (Master).

Клиент Modbus SerialTool (Master / Polling)

В левой части экрана можно выбрать режим подключения Serial или TCP:

Modbus Client Connection

Экран подключения клиента Modbus

Как указано выше, последовательный протокол Modbus делится на два типа: RTU и ASCII. Чтобы корректно взаимодействовать с удалённым устройством, при последовательном соединении крайне важно знать, какой тип протокола Modbus поддерживается вашим Slave-устройством.

Соединение ModBus TCP, в свою очередь, поддерживает IPv4 и IPv6. Для настройки Modbus-подключения по TCP необходимо указать IP slave-устройства и удалённый порт, к которому нужно подключиться.

На экране подключения имеются два параметра для времени ожидания ответа, который должно предоставить устройство Modbus Slave.
Общий тайм-аут ответа (Response Timeout), по истечении которого клиент (Master) перестаёт ждать ответ от slave, и тайм-аут с момента получения последнего байта от Slave.

Эмуляция Modbus ENRON/Daniel

Среди параметров подключения доступна эмуляция ENRON/Daniel (часто называемая просто Enron Modbus или Daniels Modbus), которая относится к специальному варианту стандартного протокола связи Modbus.
Изначально она была разработана компанией Enron Corporation и широко внедрена в flow computer компании Daniel Measurement and Control. Со временем она стала стандартом de facto для электронной измерительной аппаратуры потоков (EFM), особенно в секторе Oil & Gas.

Включение эмуляции ENRON/Daniel на устройстве изменяет поведение Modbus для поддержки следующих ключевых особенностей:

  • 1. Обработка 32-битных данных в одном регистре: Это наиболее важное техническое отличие. В Standard Modbus регистры имеют размер 16 бит (2 байта), и для получения 32-битного значения необходимо читать два регистра. В Enron Modbus 32-битные значения отображаются в одном регистре (4 байта на регистр).
  • 2. Специальная адресная карта: Используются предопределённые диапазоны для 32-битных данных. Серия 5000 (например, 45001 - 45999) предназначена для Long Integers, а серия 7000 (например, 47001 - 47999) — для Floating Points.
  • 3. Исторические данные и события: Поддерживаются специальные команды для извлечения исторических журналов и архивов тревог, в отличие от стандартного Modbus, который почти полностью ориентирован на чтение данных в реальном времени.
  • 4. Отсутствие offset: Запрашиваемый адрес точно соответствует номеру регистра, что устраняет классический «offset +1», характерный для стандартного Modbus.

Кратко: Эта эмуляция необходима для предотвращения ошибок связи (смещения байтов) при работе с устройствами, которые передают нативные 32-битные данные в секторе Oil & Gas.


Функции клиента Modbus

В центральной части экрана находятся функции Modbus, поддерживаемые SerialTool.

Функции клиента Modbus

Функции, поддерживаемые в режиме клиента Modbus

Функции клиента ModBus можно свести к следующей таблице.

Код функции Действие Имя таблицы / Описание
0x01 Чтение Discrete Output Coils
0x02 Чтение Discrete Input Contacts
0x03 Чтение Analog Output Holding Register
0x04 Чтение Analog Input Registers
0x05 Одиночная запись Discrete Output Coil
0x06 Одиночная запись Analog Output Holding Register
0x07 Чтение Exception Status
0x08 Диагностика Диагностика (Serial Line only)
0x0B (dec 11) Чтение Comm Event Counter (Serial Line only)
0x0F (dec 15) Множественная запись Discrete Output Coils
0x10 (dec 16) Множественная запись Analog Output Holding Registers
0x11 (dec 17) Отчёт Server ID (Serial Line only)
0x16 (dec 22) Запись с маской Holding Register
0x17 (dec 23) Чтение/Запись нескольких Holding Registers
0x2B / 0x0E (dec 43 / 14) Чтение Device Identification

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

Информация хранится в устройстве Server в четырёх разных таблицах. Две таблицы хранят дискретные значения вкл./выкл. (coils), а две — числовые значения (registers). Для coils и registers предусмотрены таблица только для чтения и таблица чтения/записи. Каждая таблица содержит 9999 значений. Каждый coil или contact имеет размер 1 бит и адрес данных в диапазоне от 0000 до 270E. Каждый register — это 1 слово = 16 бит = 2 байта и также имеет адрес данных от 0000 до 270E.

Номера coil/register Адреса данных Тип Имя таблицы
1-9999 0x0000 to 0x270E Чтение/Запись Discrete Output Coils
10001-19999 0x0000 to 0x270E Только чтение Discrete Input Contacts
30001-39999 0x0000 to 0x270E Только чтение Analog Input Register
40001-49999 0x0000 to 0x270E Чтение/Запись Analog Output Holding Register

Устройство Modbus

SerialTool позволяет создать устройство Modbus Slave, которое представляет карту регистров Slave-устройства, к которому вы планируете подключаться. Эта карта очень важна, поскольку позволяет видеть в локальной таблице значения, присутствующие на удалённом slave-устройстве.

Функции клиента Modbus

Modbus Slave functions map

Функции, доступные для клиента Modbus

На панели функций можно загрузить ранее созданное устройство с помощью функции "Load Device", сохранить текущее устройство с помощью "Save Device" и добавить отдельные регистры через "Add Item" или несколько регистров через "Add Items" в карту устройства.

Add Multiple Modbus Registers

Добавление регистров Modbus в карту устройства Modbus


Устройство Modbus Slave Memory Mapping

Область памяти устройства Modbus Slave (устройство Modbus)

После создания карты устройства Modbus Slave SerialTool позволяет сохранить её для дальнейшего использования или экспортировать содержимое в формате CSV, Text или PDF для обмена и обработки третьими сторонами. На следующем изображении показан пример экспорта карты устройства Modbus Slave:

Modbus Slave Mapping

Пример экспорта карты устройства Modbus Slave в PDF

Вы можете скачать PDF по этой ссылке.

Polling Modbus

Создание устройства Modbus Slave позволяет выполнять polling, то есть периодическое чтение некоторых регистров slave-устройства, к которому вы подключены.
Для этого сначала нужно создать и смоделировать Slave, а затем добавить регистр или регистры, для которых должен выполняться polling, как показано на следующем рисунке:

Modbus Master to Slave Polling

Изображение показывает добавление элемента в polling по направлению к slave

После добавления одного или нескольких элементов в polling можно запустить polling элементов, связанных со списком polling.

Modbus Master to Slave Polling Mask

Изображение показывает элементы, выбранные для polling

Доступ к функциям Modbus

Клиент Modbus SerialTool (Master/Polling) предназначен для выполнения функций в трёх режимах:

Modbus execute function

Выполнение функций Modbus

  • "Execute from Device Table" - Выполняет функцию Modbus, используя карту устройства.
  • "Execute Function" - Выполняет прямую функцию Modbus и показывает результат в окне журнала.
  • "Send Raw Data" - Отправляет прямой запрос, сформированный из шестнадцатеричных байтов, и ожидает ответ.

Execute from Device Table

Этот режим выполняет выбранную функцию Modbus, напрямую используя локально загруженную или созданную таблицу устройства. Пользователь может выбрать тип ссылки Modbus, например Coils, Discrete Inputs, Holding Registers или Input Registers, указать начальный адрес и количество элементов для чтения или записи, а затем отправить команду slave одним щелчком.
Главное преимущество этого режима заключается в том, что результат сразу отображается в карте устройства и обновляет значения, показанные в локальной таблице. Таким образом можно получить упорядоченное и постоянное представление о состоянии удалённого устройства, полезное как на этапе испытаний, так и при мониторинге и обслуживании.
Когда команда относится к функции записи, SerialTool позволяет легко подготовить передаваемые данные, выбирая тип данных, формат отображения и содержимое, которое будет записано в выбранные регистры. Поэтому этот режим особенно удобен, когда нужно работать непосредственно с логической структурой устройства Modbus.

Execute Function

Режим Execute Function позволяет выполнять функцию Modbus, выбирая её напрямую из списка доступных кодов функций, таких как чтение coils, чтение discrete inputs, чтение holding registers, чтение input registers, одиночная или множественная запись и другие функции, поддерживаемые протоколом.
В этом случае операция не ограничивается только отображением на карте устройства, поскольку результат выводится в область журнала приложения. Такой подход особенно полезен, когда нужно быстро проверить содержимое полученного ответа, протестировать конкретную функцию Modbus или выполнить целевые тесты с переменными адресами и количествами без обязательного изменения карты устройства.
Режим Execute Function также очень удобен для отладки, поскольку позволяет сразу увидеть результат выполненной команды, возможные ошибки, возвращённые slave, а также информацию, связанную с запросом и ответом.

Send Raw Data

Эта функция отправляет и принимает произвольные команды, посылаемые slave в шестнадцатеричном формате. Она позволяет пользователю вручную вводить последовательность байтов, которую нужно передать по активному соединению, например последовательному или TCP/IP, без автоматического формирования кадра программой.
Эта функция очень полезна для расширенного тестирования, reverse engineering, диагностики или валидации устройств Modbus и совместимых протоколов. На практике клиент передаёт ровно те байты, которые ввёл пользователь, оставляя полный контроль над содержимым пакета. Это позволяет имитировать пользовательские запросы, тестировать аномальные ответы или отправлять полностью подготовленные вручную кадры.
При включении опции ожидания ответа SerialTool также может получить ответный кадр от slave и показать его в журнале трафика, что позволяет сразу сравнивать отправленные и полученные данные.

Modbus Raw Data

Отправка сырых данных

Функция Modbus Scanner

SerialTool включает функцию сканирования адресов Modbus подключённого Slave-устройства. Эта функция позволяет быстро исследовать диапазон адресов от начального до конечного, а также указывать код функции, который должен использоваться во время сканирования.
Сканер особенно полезен, когда полная карта удалённого устройства неизвестна точно или когда необходимо проверить, какие адреса являются валидными и какие содержат значимые данные. Для каждого опрошенного адреса SerialTool показывает в таблице тип использованной функции, адрес, считанное значение и результат операции.
Этот режим значительно ускоряет диагностику и интеграцию со сторонними устройствами, поскольку позволяет быстро определить области памяти Modbus, реально используемые slave, и экспортировать результаты сканирования для последующего анализа или обмена.

Modbus Slave Scanner

Таблица адресов

График регистров Modbus устройства Slave

Значения регистров Modbus можно отображать на графике. Эта функция позволяет привязать один или несколько элементов карты устройства к отдельному окну графика, где значения отображаются во времени во время polling или операций обновления.
Каждый регистр, подключённый к графику, может отображаться собственной кривой, идентифицируемой определённым цветом и информацией, такой как ссылка Modbus, адрес, текущее значение и имя, присвоенное элементу. Таким образом можно легко наблюдать изменение во времени аналоговых переменных, уставок, измерений или числовых регистров, которые меняются во время работы устройства.
Функция графиков особенно полезна для мониторинга, испытаний и динамического анализа, поскольку позволяет сразу видеть, как данные изменяются во времени, не ограничиваясь только табличным представлением.

Modbus Client/Slave Chart

График регистров Modbus

Журнал трафика Modbus

Все отправленные и полученные команды отображаются в окне журнала трафика Modbus в байтах. Журнал трафика является фундаментальным инструментом для отладки связи, поскольку позволяет детально визуализировать данные, передаваемые клиентом, и данные, получаемые от slave-устройства, отображая последовательности байтов в удобочитаемом виде.
Благодаря этому окну можно проверить фактическое содержимое кадров, убедиться в корректности сформированных команд и диагностировать возможные тайм-ауты, аномальные ответы, исключения Modbus или неожиданные данные. Трафик можно просматривать при обычном использовании клиента, во время автоматического polling или при отправке сырых данных.
Окно трафика также предлагает расширенные функции, такие как копирование данных в формате ASCII или hex, сохранение в файл, поиск по содержимому, выделение строк и параметры графической настройки, например цвета, шрифты, интервалы и параметры отображения. Это делает журнал трафика не только простым просмотрщиком, но и очень полезным рабочим инструментом для разработчиков, техников и интеграторов.

Modbus Client/Slave Traffic

Трафик Modbus