Modbus TCP — это вариант промышленного протокола Modbus, адаптированный для работы поверх стеков TCP/IP и сетей Ethernet, который широко используется в АСУ ТП благодаря простоте, открытой спецификации и
хорошей совместимости устройств. Его основная задача — обеспечить обмен
регистровыми данными между клиентами (мастерами) и серверами (слейвами)
по IP‑сетям в формате «запрос‑ответ».
История и область применения
- Протокол Modbus был разработан компанией Modicon (ныне Schneider
Electric) в 1979 году как простой протокол для ПЛК и других промышленных устройств. - В 1999 году появился Modbus TCP/IP (часто просто Modbus TCP) как
расширение Modbus RTU для работы поверх Ethernet и TCP/IP с целью
использовать стандартную сетевую инфраструктуру. - Сейчас Modbus TCP активно применяется в ПЛК, контроллерах привода,
измерительных модулях, IoT‑шлюзах и SCADA‑системах в промышленности,
энергетике, водоканалах, транспорте и др.
Архитектура и стек протокола
Modbus TCP логически находится на прикладном уровне поверх стандартного стека TCP/IP и Ethernet.
- Физический/канальный уровень: как правило, Ethernet (100BASE‑TX, 1000BASE‑T и т.п.), обеспечивающий передачу кадров и базовый контроль ошибок.
- Сетевой уровень: IP, отвечающий за адресацию и маршрутизацию пакетов между устройствами по IP‑адресам.
- Транспортный уровень: TCP, обеспечивающий надёжную, ориентированную на соединение доставку
сообщений, сегментацию, квитирование и повторную передачу. - Прикладной уровень: Modbus Application Protocol (MBAP) + PDU Modbus, реализующие командную модель чтения/записи регистров.
Клиент‑серверная модель
Modbus TCP использует модель клиент–сервер (client–server), которая соответствует master–slave в классическом Modbus.
- Modbus TCP‑клиент
- Инициирует TCP‑соединения с серверами и формирует Modbus‑запросы.
- Обычно это SCADA‑сервер, HMI‑панель, ПК‑приложение или верхнеуровневый контроллер.
- Modbus TCP‑сервер
- Слушает порт 502/TCP, принимает запросы, обращается к локальным регистрам и формирует ответы.
- Типичные серверы — ПЛК, модули ввода‑вывода, интеллектуальные датчики, интеллектуальные приводы.
- Соединение
- Клиент устанавливает TCP‑соединение с сервером по порту 502 и посылает серии Modbus‑кадров до закрытия соединения.
- Возможна работа с несколькими параллельными соединениями для повышения производительности и отказоустойчивости.
Формат кадра Modbus TCP
Кадр Modbus TCP состоит из заголовка MBAP и PDU с Modbus‑командой.
Структура кадра (над TCP):
- MBAP Header (7 байт)
Transaction Identifier (2 байта) — идентификатор транзакции для сопоставления запросов и ответов. - Protocol Identifier (2 байта) — для Modbus TCP всегда 0.
- Length (2 байта) — количество байт, следующих после этого поля (Unit ID + PDU).
- Unit Identifier (1 байт) — адрес «подчинённого» устройства за шлюзом (например, Modbus RTU‑устройств за Ethernet–RS‑485‑шлюзом).
- PDU (Protocol Data Unit)
Function Code (1 байт) — код функции (операции), которую должен выполнить сервер. - Data — параметр(ы) запроса, например начальный адрес и количество регистров, либо полезные данные для записи.
Адресное пространство и типы данных
Modbus организует данные в виде наборов регистров различных типов.
- Coils (0xxxx) — дискретные выходы (1 бит), доступные на чтение и запись, часто управляют реле, выходами ПЛК.
- Discrete Inputs (1xxxx) — дискретные входы (1 бит), только чтение, отражают состояние датчиков и входных клемм.
- Input Registers (3xxxx) — входные регистры (16 бит), только чтение для аналоговых значений, измерений и т.п.
- Holding Registers (4xxxx) — удерживаемые регистры (16 бит), чтение/запись, используются для параметров, установок и измерений.
В Modbus TCP фактический адрес передаётся как 16‑битное (иногда 0‑based)
значение, а «4xxxx» и т.п. чаще служат логической нотацией в
документации.
Основные коды функций
Коды функций определяют операции, которые клиент запрашивает у сервера.
Некоторые распространённые функции Modbus TCP:
- 01 (Read Coils) — чтение состояния выходных дискретных линий (coils).
- 02 (Read Discrete Inputs) — чтение дискретных входов.
- 03 (Read Holding Registers) — чтение 1–125 (или 1–123) регистров хранения.
- 04 (Read Input Registers) — чтение входных регистров.
- 05 (Write Single Coil) — запись одного coil.
- 06 (Write Single Register) — запись одного holding‑регистра.
- 15 (Write Multiple Coils) — запись группы coils.
- 16 (Write Multiple Registers) — запись нескольких holding‑регистров.
- 23 (Read/Write Multiple Registers) — комбинированная операция чтения и записи holding‑регистров (доступна только в Modbus TCP).
При ошибке сервер возвращает тот же код функции, но с установленным старшим битом (добавляется 0x80) и байтом кода исключения, описывающим тип ошибки (недопустимый код функции и т.п.).
Пример обмена запрос‑ответ
Типичный цикл Modbus TCP выглядит следующим образом.
- Клиент устанавливает TCP‑соединение с IP‑адресом сервера по порту 502.
- Клиент формирует запрос, например «прочитать 10 holding‑регистров, начиная с адреса 40001», то есть функцию 03, стартовый адрес и количество
регистров. - Запрос инкапсулируется в MBAP‑заголовок (transaction ID, protocol ID=0, length и unit ID) и отправляется по TCP.
- Сервер читает локальные регистры, формирует ответ с тем же transaction ID и возвращает значения в поле Data.
- Клиент парсит ответ, сопоставляет его по transaction ID с запросом и обновляет свои внутренние переменные или интерфейс.
Особенности по сравнению с Modbus RTU
Modbus TCP сохраняет логическую модель Modbus RTU, но меняет транспорт и формат кадра.
- Транспорт
Modbus RTU использует последовательные линии (RS‑485/RS‑232) и собственный CRC‑контроль, а Modbus TCP — Ethernet/TCP/IP и полагается на контроль ошибок TCP и Ethernet. - Адресация
В RTU каждому ведомому назначается адрес 1–247, тогда как в TCP основная
адресация идёт по IP‑адресу, а поле Unit ID часто используется для
доступа к RTU‑устройствам через шлюзы. - Формат кадра
В Modbus RTU есть старт/стоп‑условия и CRC в конце кадра, а в Modbus TCP
кадр начинается с MBAP‑заголовка и не содержит CRC, потому что этим
занимается стек TCP/Ethernet. - Broadcast
Широковещательная функция Modbus (адрес 0) не используется в Modbus TCP, так как протокол основан на соединениях.
Безопасность Modbus TCP
Исходная спецификация Modbus TCP не включает механизмы шифрования,
аутентификации и контроля целостности на уровне протокола. Это делает
системы уязвимыми к перехвату трафика, подделке команд и атакам типа
replay, особенно в небезопасных или общих сетях.
Подходы к усилению безопасности:
- Modbus/TCP Security с TLS
Modbus‑организация опубликовала спецификацию Modbus Security, которая инкапсулирует Modbus TCP в TLS с применением сертификатов X.509 для аутентификации и защиты целостности. - Лёгковесные криптографические расширения
Предлагаются схемы, добавляющие аутентификацию, шифрование и защиту от повторов на уровне полезной нагрузки Modbus TCP с использованием лёгких алгоритмов (например, SM‑семейство, ASCON и др.), чтобы минимизировать задержки и нагрузку на ПЛК. - Сетевые механизмы защиты
Фильтрация трафика, сегментация сети, использование eBPF для контроля и фильтрации Modbus TCP‑сообщений, а также IDS/IPS, нацеленные на промышленные протоколы.