Промышленные протоколы связи: 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 определяется архитектурой объекта: длиной линий, уровнем помех, требуемой скоростью обмена и необходимостью удалённого доступа. В большинстве современных систем эти два подхода не конкурируют, а дополняют друг друга.

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