Перейти к содержанию

Почему устройство Modbus TCP не пускает второго клиента?

Обновлено Редакция GAW

Modbus TCP работает поверх обычного соединения TCP на порту 502: клиент (SCADA, панель, программа на ПК) открывает соединение с сервером и шлёт запросы, формат которых разбирает калькулятор кадра Modbus TCP. Каждое соединение занимает у сервера память и сокет.

Что говорит спецификация

Руководство Modbus Organization V1.0b (разд. 4.2.1) не задаёт число соединений: оно зависит от возможностей устройства. Правила, которые там даны:

ПравилоЗачем
Держать соединение открытым, а не открывать на каждый запросменьше нагрузки и задержек
Клиенту открывать минимум соединений, одно на приложениене занимать чужие места
При переполнении закрывать самое старое неиспользуемое соединениепустить нового клиента
Включать KEEPALIVE на обеих сторонахобнаружить оборванное соединение

У встроенных устройств мест мало. Например, Ethernet-контроллер W5500 имеет восемь аппаратных сокетов на все задачи сразу. Наш расчёт для устройства с тремя местами под Modbus: SCADA, панель оператора и отладчик на ноутбуке занимают все три, и четвёртый клиент получит отказ или вытеснит самое старое неиспользуемое соединение.

Что делать

  1. Узнать лимит соединений в документации устройства и распределить их между клиентами.
  2. Закрывать отладочные программы на ПК после проверки: открытое соединение занимает место, даже если запросов нет.
  3. Если клиентов больше, чем мест, ставят шлюз или концентратор, который сам опрашивает устройство и раздаёт данные; почему прибор за шлюзом иногда молчит, разобрано в ответе «Почему прибор за шлюзом Modbus TCP не отвечает».

Как устроен Ethernet у микроконтроллеров — в статье «Ethernet для микроконтроллера: W5500, ENC28J60, RMII и LAN8720».

Похожие вопросы

Почему соединение рвётся, если клиент молчит?

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

Можно ли отправлять несколько запросов, не дожидаясь ответа?

Спецификация допускает несколько транзакций на одном соединении, и ответы тогда сопоставляют по Transaction Identifier. Но многие простые устройства обрабатывают запросы строго по одному; если это не указано в документации, надёжнее ждать ответа.

Сколько соединений держит модуль на W5500?

У W5500 восемь аппаратных сокетов на все задачи сразу — Modbus, веб-интерфейс, DHCP, DNS. Наш вывод: на Modbus TCP прошивка обычно отводит лишь часть из них, и это число стоит искать в описании устройства.

Источники

  1. Modbus Organization. MODBUS Messaging on TCP/IP Implementation Guide V1.0b (October 24, 2006) — разд. 4.2.1: число клиентских и серверных соединений не определяется спецификацией и зависит от возможностей устройства; правила: держать соединение открытым, а не открывать и закрывать на каждую транзакцию; клиенту — минимум соединений с одним сервером, одно на приложение; несколько транзакций на одном соединении различаются Transaction Identifier; при превышении числа соединений рекомендуется закрывать самое старое неиспользуемое; разд. 4.3.2: опция KEEPALIVE на обеих сторонах
  2. WIZnet. W5500 Datasheet, Version 1.1.0 (2022) — 8 независимых аппаратных сокетов одновременно, внутренняя память 32 КБ на буферы передачи и приёма

Нашли ошибку?