контроль/диагностика соединения ModBusTCP Slave из кода
Имеется СПК (MB TCP Master), несколько модулей Mx210 (MB TCP Slave), подключенных с использованием шаблона Owen.
Имеется книжка "CDS 3.5 Modbus v 3", а точнее пункт 4.6 из этой книжки.
Задача: из кода контролировать состояние Ведомых модулей.
Практика показала:
1. использовать $(DeviceName).xError невозможно - он не поднимается, зато вместо него вечно поднят $(DeviceName).xBusy независимо от того, подключен физически модуль или отключен.
2. $(DeviceName).byModbusError использовать для получения подробностей состояния канала тоже не получается: значения либо Response_successful, либо Undefined.
3.$(DeviceName)_OwenDriver.ComState - значение "Connecting" при разрыве связи. Но создать переменную такого же типа "ModbusTcpComState" у меня не получилось, так же как и найти таблицу значений, которая есть для "byModbusError" в пункте 4.6 книги.
Из интересного:
1. можно использовать $(DeviceName).xInitDone для определения текущего состояния связи с модулем: поднят, когда устройство подключено и опущен, когда связи с устройством нет.
2. можно использовать byModbusError для определения текущего состояния связи, но не более: ни причину, ни ошибку получить не получится - Undefined.
3. Можно использовать ModBusTCPMasterName.uiConnectedClients, чтобы узнать, что количество клиентов меньше или равно требуемому (в течение работы кол-во модулей не меняется).
Дальше начинаются вопросы:
1. Есть ли возможность что-то сделать с ведомым устройством в случае потери связи: перезагрузить, повторно инициализировать, перенастроить и тд используя только протокол ModBus TCP и команды из кода?
2. Есть ли возможность перезапустить "устройство ModbusTCP Master" из кода для повторной инициализации всех ведомых устройств?
3. Есть ли возможность перезапустить "устройство Ethernet" (на котором висит ModbusTCP Master) из кода?
4. Есть ли более корректные способы получения информации о состоянии связи? Чтобы видно было "CRC_Fail" или "Response_timeout" вместо Undefined?
5. Возможно ли что-то сделать ещё из кода, чтобы предпринять попытки принудительного восстановления связи?