Устройство: МКОН-24 H/W 2.0
Версия ПО: g2.43
Сер.номер: 116100240232065411
Дата пр-во: 02.2024
Собран стенд:
ПК1 <--- ethernet ---> МКОН <--- rs485 ---> ПК2, где
ПК1 - Master
ПК2 - Slave (ID=17)
ПК1 спрашивает у ПК2 один InputStatus (FC=02), по адресу (0).
Из журналов обмена:
Код:
Запрос ТСР от ПК1 к МКОН: 00 00 00 00 00 06 17 02 00 00 00 01
Запрос RTU от МКОН к ПК2: 17 02 00 00 00 01 BB 3C
Ответ RTU от ПК2 к МКОН: 17 02 01 01 64 00
Ответ TCP от МКОН к ПК1: 00 00 00 00 00 03 17 02 01
Рассмотрим подробнее Ответ TCP от МКОН к ПК1:
00 00 00 00 00 03 - это номер транзакции, код протокола, длина пакета
17 наш идентификатор
02 код фунции
01 длина данных
и всё
Обратим внимание что в ответе от МКОН нет байта с данными (т.е. пакет после преобразования приходит без данных).
После серии экспериментов установил, что в некоторых случаях ответ приходит на один байт короче, чем должен.
Естественно, мастер такой пакет считает некорректным, и обмен заканчивается ошибкой.
Из-за этого мастер может зависнут, зациклится ну или просто будет "иногда говорить", что связь, то есть, то нет.
Почему же так происходит, спросит внимательный читатель?
Проведя серию экспериментов выяснил, что эта ситуация возникает, если в ответе у (CRC16) старший байт равен 0.
Для нашего примера (см. Ответ от ПК2 к МКОН) 17 02 01 01, CRC16 = 0x0064 (в порт пишется старшим байтом вперед)
При этом "Сниффер" овен конфигуратора пишет:
Код:
1 19:32:50.595 Ethernet: master RS-485: Slave Modbus TCP (PDU) -> Modbus RTU 32 Запрос 17 02 00 00 00 01 BB 3C Slave ID: 0x17 (23) Код функции: 0x02 (2) - Read Discrete Inputs Адрес регистра: 0x0000 (0) Количество регистров: 0x01 (1) Контрольная сумма: 0xBB3C (47932)
2 19:32:50.886 RS-485: Slave Ethernet: master Modbus RTU -> Modbus TCP (PDU) 27 Ответ Ошибка Modbus. Код: 1 - Устройство не может обработать код функции. 17 02 01 Slave ID: 0x17 (23) Код функции: 0x02 (2) - Read Discrete Inputs Код ошибки: 0x01 (1)
Данная ошибка воспроизводится всегда, когда в конце ответа в RS линии стоит "0", отдельно хочу заметить, что я не исследовал, что произойдет, если "0" будет стоять в конце запроса в RS линии предполагаю, что тоже ничего хорошего).
О данной проблеме я сообщил в службу тех. поддержки 14.06.2024 (так же подробно, даже более). До сих пор нет решения, и даже подтверждения, что работа над устранением ведется.
Далее все тоже самое в картинках:
Запрос ТСР от ПК1 к МКОН: 00 00 00 00 00 06 17 02 00 00 00 01
Wireshark_Request.png
Запрос RTU от МКОН к ПК2: 17 02 00 00 00 01 BB 3C
Ответ RTU от ПК2 к МКОН: 17 02 01 01 64 00
sideRS485.png
Сниффер
OwenConfig_Request_Response.png
Ответ TCP от МКОН к ПК1: 00 00 00 00 00 03 17 02 01
Wireshark_Response.png