Дата публикации

Автор статьи: Rinat Khairulin

15

Промышленные протоколы связи: Modbus RTU и TCP/IP на практике

Modbus RTU и TCP/IP: обзор протокола, отличия, примеры подключения датчиков к ESP32. Советы по монтажу RS-485 для промышленной автоматизации.

Протокол Modbus

Если вы сталкивались с промышленной автоматизацией, то почти наверняка встречали Modbus. Этот протокол связывает датчики, контроллеры и исполнительные механизмы на заводах уже более сорока лет. Несмотря на возраст, он остаётся стандартом де-факто благодаря своей простоте и открытости – его поддерживают тысячи производителей, от мелких компонентов до сложных роботов.

В этой статье разберём:

  • чем отличаются две основные реализации Modbus – RTU (по RS-485) и TCP/IP (по Ethernet);
  • как подключить Modbus-датчик к ESP32 и обмениваться данными без блокировки процессора;
  • что важно учитывать при монтаже линий RS-485.

Как устроен Modbus

Modbus разработали в 1979 году для программируемых контроллеров Modicon. С тех пор права на протокол стали открытыми, и сейчас он есть практически везде, где нужно собрать данные с устройств или управлять ими.

Принцип работы прост: одно устройство (master) опрашивает остальные (slaves). Slaves никогда не начинают передачу первыми – только отвечают на запросы. Все данные в устройствах хранятся в таблицах регистров четырёх типов:

  • Катушки (Coils) – битовые значения, можно читать и писать (например, для управления реле).
  • Дискретные входы (Discrete Inputs) – битовые значения, только чтение (состояние датчиков).
  • Регистры хранения (Holding Registers) – 16-битные слова, чтение и запись (уставки, настройки).
  • Регистры ввода (Input Registers) – 16-битные слова, только чтение (измеренные значения).

Modbus RTU и Modbus TCP/IP: две архитектуры одного протокола

На практике сегодня используют два основных варианта протокола – классический последовательный Modbus RTU и сетевой Modbus TCP/IP. Несмотря на одинаковую логику команд и регистров, различия между ними лежат в архитектуре передачи данных. Именно она определяет масштабируемость системы, характер задержек, требования к монтажу и дальнейшему обслуживанию.

Modbus RTU строится вокруг последовательной линии связи. Обмен организован по принципу «один запрос – один ответ» в строгой очередности. Такая модель обеспечивает предсказуемость цикла опроса и хорошо подходит для компактных распределённых систем, где устройства физически расположены вдоль одной технологической линии или внутри нескольких шкафов автоматики. При проектировании учитывают длину сегмента, согласование линии, экранирование и устойчивость к промышленным помехам. Чем больше узлов в сети, тем длиннее становится общий цикл опроса – это естественное ограничение последовательной архитектуры.

Modbus TCP/IP переносит ту же структуру данных в сетевую среду Ethernet. Устройства получают IP-адреса и становятся полноценными участниками локальной сети предприятия. Обмен может обслуживаться параллельно, что снижает задержки при большом количестве запросов. Упрощается интеграция с серверными системами, SCADA и системами удалённого мониторинга. Однако поведение сети уже зависит не только от самих устройств, но и от конфигурации коммутаторов, маршрутизации и общей загрузки инфраструктуры.

Выбор между RTU и TCP/IP – это не вопрос «старого» и «нового», а вопрос архитектуры объекта. В компактной, физически распределённой системе с предсказуемым циклом обмена рациональнее последовательная модель. В проектах с высокой плотностью данных, удалённым доступом и интеграцией в корпоративную сеть чаще используют IP-вариант. На практике нередко применяют гибридную схему, объединяя локальные сегменты в общую сетевую структуру через шлюзы.

Далее рассмотрим каждую реализацию отдельно – с точки зрения физического уровня, ограничений и практического применения.

Modbus RTU по RS-485

Физически Modbus RTU работает через интерфейс RS-485 по витой паре. Данные передаются байтами с контрольной суммой в конце кадра. Такое решение даёт:

  • дальность связи до 1200 метров;
  • до 32 устройств на одну линию (с повторителями – до 247);
  • скорость от 9600 до 115200 бит/с;
  • высокую помехоустойчивость за счёт дифференциального сигнала – это критично для цехов с электромагнитными помехами.

Структура кадра стандартна: адрес устройства, код функции, данные и контрольная сумма CRC. Подробнее о физическом уровне RS-485 можно почитать в Wikipedia. Если линия длинная, для защиты оборудования часто требуется гальваническая развязка.

Modbus TCP/IP по Ethernet

В этом варианте Modbus-кадр упаковывается в TCP-пакет и передаётся по локальной сети или интернету. Контрольная сумма не нужна, её роль выполняет протокол TCP. Основные особенности:

  • скорость ограничена только сетевой инфраструктурой (обычно до 1 Гбит/с);
  • дальность не ограничена физически, можно работать через интернет;
  • простая интеграция с SCADA-системами и облачными сервисами.

Грубо говоря, RS-485 выбирают для грязных условий и длинных линий, а TCP/IP для высокоскоростного обмена и удалённого доступа.

Подключаем Modbus-датчик к ESP32 без блокировок

Теперь перейдём к практике. Возьмём типовой датчик температуры и влажности с интерфейсом Modbus RTU (адрес 1, скорость 9600, температура в регистре 0, влажность в регистре 1) и подключим его к ESP32. Если вы ещё не выбрали платформу для проекта, поможет наше сравнение Raspberry Pi, Arduino и ESP32.

Схема подключения

У ESP32 уровни сигналов TTL, а RS-485 использует дифференциальные уровни, поэтому нужен преобразователь, например на микросхеме MAX485. Даташит можно найти на сайте Analog Devices. Подключается он так:

  • RO (приём) к GPIO16
  • DI (передача) к GPIO17
  • DE и RE (управление направлением) объединяем и подключаем к GPIO4 (HIGH – передача, LOW – приём)
  • Питание: VCC (5V) и GND
  • Клеммы A и B преобразователя к витой паре датчика (A к A, B к B). На концах линии при необходимости ставят согласующие резисторы 120 Ом.

Чтение регистров по таймеру

Для работы с протоколом используем библиотеку ModbusMaster (документация на GitHub). В примерах часто можно встретить delay(1000), но он блокирует выполнение программы на всё время паузы. Чтобы процессор мог параллельно делать другие задачи (обрабатывать кнопки, опрашивать другие датчики), организуем опрос по таймеру:

#include <ModbusMaster.h> #define MAX485_DE_RE 4 #define MAX485_RO 16 #define MAX485_DI 17 ModbusMaster node; unsigned long prevUpdate = 0; const long interval = 1000; void preTransmission() { digitalWrite(MAX485_DE_RE, HIGH); } void postTransmission() { digitalWrite(MAX485_DE_RE, LOW); } void setup() { Serial.begin(115200); pinMode(MAX485_DE_RE, OUTPUT); digitalWrite(MAX485_DE_RE, LOW); Serial2.begin(9600, SERIAL_8N1, MAX485_RO, MAX485_DI); node.begin(1, Serial2); node.preTransmission(preTransmission); node.postTransmission(postTransmission); } void loop() { unsigned long currentMillis = millis(); if (currentMillis - prevUpdate >= interval) { prevUpdate = currentMillis; uint8_t result; uint16_t data[2]; result = node.readHoldingRegisters(0, 2); if (result == node.ku8MBSuccess) { data[0] = node.getResponseBuffer(0); data[1] = node.getResponseBuffer(1); float temperature = data[0] / 10.0; float humidity = data[1] / 10.0; Serial.print("Temperature: "); Serial.print(temperature); Serial.print(" C, Humidity: "); Serial.print(humidity); Serial.println(" %"); } else { Serial.print("Ошибка связи, код: 0x"); Serial.println(result, HEX); } } // Здесь можно выполнять другой код – обработку кнопок, опрос других датчиков }

Если после получения данных нужно чем-то управлять (реле, моторами), посмотрите статью про силовые ключи и драйверы.

Modbus TCP/IP на ESP32

Для датчиков с поддержкой Modbus TCP/IP код ещё проще – библиотека ModbusIP берёт на себя всю сетевую часть. Пример для Ethernet-модуля (или Wi-Fi):

#include <Ethernet.h> #include <ModbusIP.h> ModbusIP mb; IPAddress remote(192, 168, 1, 100); void setup() { Serial.begin(115200); Ethernet.begin(); mb.begin(); mb.addConnection("dev1", remote, 502); } void loop() { mb.task(); static unsigned long lastRead = 0; if (millis() - lastRead > 1000) { lastRead = millis(); uint16_t res = mb.readHreg("dev1", 0); if (res != 0xFFFF) { Serial.print("Value: "); Serial.println(res); } } }

Что важно при монтаже RS-485

Правильная разводка линии часто влияет на стабильность работы сильнее, чем код. Вот основные правила:

  • Топология «шина». Все устройства подключаются к одной витой паре (A и B). Ответвления должны быть минимальной длины.
  • Терминаторы. На обоих концах линии устанавливают резисторы 120 Ом между A и B – это подавляет отражения сигнала.
  • Экранирование. В промышленных условиях используйте экранированную витую пару. Экран заземляйте только с одной стороны (обычно со стороны master), чтобы не создавать паразитных контуров.
  • Питание. Многие полевые датчики требуют внешнего питания 12–24 В – это нужно учесть при проектировании блока.

Резюме

Modbus остаётся одним из самых устойчивых и универсальных протоколов промышленной автоматизации. Независимо от среды передачи – последовательной линии или IP-сети – логика обмена остаётся простой и предсказуемой.

Выбор между RTU и TCP/IP определяется архитектурой объекта: длиной линий, уровнем помех, требуемой скоростью обмена и необходимостью удалённого доступа. В большинстве современных систем эти два подхода не конкурируют, а дополняют друг друга.

Промышленные протоколы связи: Modbus RTU и TCP/IP на практике

Чтобы оставить комментарий, авторизируйтесь

Комментарии (0)