ModBus TCP. Промышленный протокол для TCP/IP-сетей.
В предыдущей статье мы разобрали общую структуру протокола ModBus. Сегодня мы рассмотрим разновидность этого протокола — ModBus TCP, которая используется для реализации ModBus в сетях Ethernet.
ModBus TCP всегда работает поверх TCP/IP стека, поэтому не может считаться полноценным ModBus протоколом в его классическом виде.
Основное отличие, которое накладывает TCP/IP на ModBus при их совместном использовании — непосредственное подключение к определённому адресу. Протокол TCP/IP устроен по принципу «клиент-сервер». Для обмена данными клиент открывает сеанс связи с сервером, указывая его адрес.
Переходя на терминологию протокола ModBus ведущее устройство (мастер) в TCP-сети становится клиентом (т.к. именно клиент является инициатором обмена данными), а подчинённое устройство (слейв) — сервером.
Таким образом, для того чтобы передать запрос подчинённому устройству в TCP-сети мастер должен сначала открыть сеанс связи с ним. Причём открытие сеанса реализуется не на уровне протокола ModBus, а на уровне TCP/IP. Поэтому ведущее устройство не может средствами ModBus передавать запросы разным устройствам, так же, как это происходит в ModBus RTU или ASCII.
По этой же причине в ModBus TCP отсутствуют широковещательные сообщения (сразу всем подчинённым устройствам).
Однако, Master-устройство может подключаться к необходимому узлу (слейву) средствами протокола TCP/IP, а затем уже общаться с ним на языке ModBus.
На рисунке рабочее место диспетчера под управлением SCADA-системы является сервером сбора данных и одновременно мастером в сети ModBus TCP. Оно последовательно подключается к каждому удалённому контроллеру, открывая сеанс связи в сети TCP/IP и обменивается с ним ModBus-пакетами.
Безусловно, такой обмен происходит дольше, чем в случае ModBus RTU, т.к. дополнительное время уходит на открытие и закрытие сеанса TCP/IP. Однако, это даёт возможность объединить устройства находящиеся на значительном удалении витой парой или даже по WiFi.
Кроме того, протокол ModBus TCP может использоваться в сетях со шлюзом, где шлюз является интеллектуальным устройством и маршрутизирует сообщения остальным устройствам сети ModBus.
При такой конфигурации клиент сети TCP (он же мастер сети ModBus) подключается к шлюзу (серверу) и ведёт общение только с ним. Шлюз же переадресует сообщение внутри шины ModBus (RTU или ASCII) тому устройству, адрес которого указан в ModBus-пакете.
Структура пакета ModBus TCP
Сначала вспомним структуру классического ModBus-пакета (RTU или ASCII):
Он состоит из четырёх блоков: адрес слейва, номер функции, блок данных и блок контроля чётности.
А вот так выглядит структура пакета ModBus TCP:
Как вы можете видеть, в пакете ModBus TCP по сравнению с ModBus RTU добавлены блоки идентификаторов обмена и протокола, а так же от отсутствует блок контроля подлинности пакета. Последнее объясняется тем, что контроль целостности пакета обеспечивается средствами протокола TCP/IP, поэтому отпадает необходимость в его ModBus-реализации.
Рассмотрим что означает каждый из блоков пакета ModBus TCP:
- id обмена — чаще всего два нуля. Применяется только в том случае, если мастер отсылает подчинённому устройству несколько запросов подряд без ожидания ответа. При этом id позволяет затем понять какому из запросов какой ответ соответствует.
- id протокола — всегда нули, не применяется. Поле оставлено в качестве резерва для будующих применений.
- длина пакета — совокупная длина блоков «адрес», «номер функции» и «данные». Длина пакета передаётся двумя байтами, первым из которых идет старший.
- адрес ведомого устройства — аналог такого же блока в структуре пакета ModBus RTU, но обычно не используется, т.к. ,как уже говорилось, в ModBus TCP мастер и так открывает сеанс обмена только с одним слейвом (у которого, конечно, есть и IP адрес в сети TCP/IP). Данное поле используется только в варианте ModBus TCP-сети со шлюзом. Тогда шлюз сам перенаправляет пакет по указанному адресу.
- поля код функции и данные аналогичны соответствующим полям в классическом ModBus-пакете.


Добавить комментарий