Почему устройство Modbus TCP не пускает второго клиента?
Обновлено Редакция GAW
Modbus TCP работает поверх обычного соединения TCP на порту 502: клиент (SCADA, панель, программа на ПК) открывает соединение с сервером и шлёт запросы, формат которых разбирает калькулятор кадра Modbus TCP. Каждое соединение занимает у сервера память и сокет.
Что говорит спецификация
Руководство Modbus Organization V1.0b (разд. 4.2.1) не задаёт число соединений: оно зависит от возможностей устройства. Правила, которые там даны:
| Правило | Зачем |
|---|---|
| Держать соединение открытым, а не открывать на каждый запрос | меньше нагрузки и задержек |
| Клиенту открывать минимум соединений, одно на приложение | не занимать чужие места |
| При переполнении закрывать самое старое неиспользуемое соединение | пустить нового клиента |
| Включать KEEPALIVE на обеих сторонах | обнаружить оборванное соединение |
У встроенных устройств мест мало. Например, Ethernet-контроллер W5500 имеет восемь аппаратных сокетов на все задачи сразу. Наш расчёт для устройства с тремя местами под Modbus: SCADA, панель оператора и отладчик на ноутбуке занимают все три, и четвёртый клиент получит отказ или вытеснит самое старое неиспользуемое соединение.
Что делать
- Узнать лимит соединений в документации устройства и распределить их между клиентами.
- Закрывать отладочные программы на ПК после проверки: открытое соединение занимает место, даже если запросов нет.
- Если клиентов больше, чем мест, ставят шлюз или концентратор, который сам опрашивает устройство и раздаёт данные; почему прибор за шлюзом иногда молчит, разобрано в ответе «Почему прибор за шлюзом Modbus TCP не отвечает».
Как устроен Ethernet у микроконтроллеров — в статье «Ethernet для микроконтроллера: W5500, ENC28J60, RMII и LAN8720».
Похожие вопросы
Почему соединение рвётся, если клиент молчит?
Сервер может закрыть неиспользуемое соединение, чтобы освободить место для нового клиента, — так рекомендует руководство Modbus при нехватке мест. Клиент должен уметь принять закрытие и открыть соединение заново при следующем запросе.
Можно ли отправлять несколько запросов, не дожидаясь ответа?
Спецификация допускает несколько транзакций на одном соединении, и ответы тогда сопоставляют по Transaction Identifier. Но многие простые устройства обрабатывают запросы строго по одному; если это не указано в документации, надёжнее ждать ответа.
Сколько соединений держит модуль на W5500?
У W5500 восемь аппаратных сокетов на все задачи сразу — Modbus, веб-интерфейс, DHCP, DNS. Наш вывод: на Modbus TCP прошивка обычно отводит лишь часть из них, и это число стоит искать в описании устройства.
Источники
- Modbus Organization. MODBUS Messaging on TCP/IP Implementation Guide V1.0b (October 24, 2006) — разд. 4.2.1: число клиентских и серверных соединений не определяется спецификацией и зависит от возможностей устройства; правила: держать соединение открытым, а не открывать и закрывать на каждую транзакцию; клиенту — минимум соединений с одним сервером, одно на приложение; несколько транзакций на одном соединении различаются Transaction Identifier; при превышении числа соединений рекомендуется закрывать самое старое неиспользуемое; разд. 4.3.2: опция KEEPALIVE на обеих сторонах
- WIZnet. W5500 Datasheet, Version 1.1.0 (2022) — 8 независимых аппаратных сокетов одновременно, внутренняя память 32 КБ на буферы передачи и приёма
Нашли ошибку?
Смотрите также
- Modbus TCP: кадрыЗаголовок MBAP, функции 01–06, 15, 16 и 23, разбор, сравнение с RTU
- Почему прибор за шлюзом Modbus TCP не отвечает?Unit ID, настройки линии, таймауты, исключения 0A и 0B, доступ по IP
- W5500Ethernet по SPI с аппаратным TCP/IP: выводы, PMODE, обвязка, ток
- Ethernet для микроконтроллераW5500, ENC28J60, MAC + PHY по RMII, LAN8720, DP83848, трансформатор и разводка