При тестировании реализации Modbus TCP в SMH4 выявлена следующая "особенность":
Modbus TCP сервер принимает неверно сформированный запрос "Write Multiple Registers (0x10)", не формирует никакой ошибки, а в регистрах устройства оказывается мусор.
Ожидается, что неверно сформированный запрос будет или проигнорирован (вплоть до закрытия коннекта), или вернется исключение 0x03 или 0x04.
При этом, в регистры Modbus не должны модифицироваться, и тем более, в них не должны попадать мусорные значения.
Пример 1 неверного запроса и ответ:
Код:
Запрос: 0000 0000 0007 01 10 03e8 0002 04
Ответ: 0000 0000 0006 01 10 03e8 0002
Пример 2 неверного запроса и ответ:
Код:
Запрос: 0000 0000 000b 01 10 03e8 0002 04
Ответ: 0000 0000 0006 01 10 03e8 0002
Пример правильно сформированного запроса:
Код:
Запрос: 0000 0000 000b 01 10 03e8 0002 04 0001 0002
Ответ: 0000 0000 0006 01 10 03e8 0002
Результат попадания мусора в регистры:
Для теста использовалась простая программа:
По спецификации (например,
http://www.modbus.org/docs/Modbus_Ap...col_V1_1b3.pdf) функция 0x10 может возвращать исключения 0x03 (ILLEGAL DATA VALUE), 0x04 (SERVER DEVICE FAILURE).
Ниже приведена диаграмма обработки функции 0x10 из спецификации: