Разрыв соединения после первой ошибки по таймауту при чтении по Modbus-TCP
-
rsv
- advanced

- Сообщения: 191
- Зарегистрирован: 18 июл 2019, 13:53
- Версия LabVIEW: 2020
- Откуда: Россия, Ижевск
- Благодарил (а): 40 раз
- Контактная информация:
Разрыв соединения после первой ошибки по таймауту при чтении по Modbus-TCP
Суть проблемы:
- при периодическом опросе по протоколу Modbus-TCP если возникает ошибка 56, то соединение сразу разрывается.
Насколько я знаю, протокол Modbus-TCP не требует обязательного переподключения при возникновении ошибки. Другие приложения, опрашивающие в это время ПЛК после возникновения ошибки не теряют соединения и продолжают опрос.
Как-то можно избежать разрыва соединения если возникает ошибка 56?
Ошибка №1:
LabVIEW: (Hex 0x38) The network operation exceeded the user-specified or system time limit.
Ошибка №2 и все последующие:
LabVIEW DSC: The communication between the Modbus master and slave devices was interrupted. Check the connection status between the two devices.
P.S.
Приведённая программа тестовая, специально написал, что бы разобраться в этой проблеме.
- при периодическом опросе по протоколу Modbus-TCP если возникает ошибка 56, то соединение сразу разрывается.
Насколько я знаю, протокол Modbus-TCP не требует обязательного переподключения при возникновении ошибки. Другие приложения, опрашивающие в это время ПЛК после возникновения ошибки не теряют соединения и продолжают опрос.
Как-то можно избежать разрыва соединения если возникает ошибка 56?
Ошибка №1:
LabVIEW: (Hex 0x38) The network operation exceeded the user-specified or system time limit.
Ошибка №2 и все последующие:
LabVIEW DSC: The communication between the Modbus master and slave devices was interrupted. Check the connection status between the two devices.
P.S.
Приведённая программа тестовая, специально написал, что бы разобраться в этой проблеме.
- Вложения
-
- Main.vi
- (32.97 КБ) 231 скачивание
-
ujin1
- developer

- Сообщения: 260
- Зарегистрирован: 06 ноя 2020, 15:37
- Версия LabVIEW: 19
- Благодарил (а): 19 раз
- Поблагодарили: 40 раз
- Контактная информация:
Re: Разрыв соединения после первой ошибки по таймауту при чтении по Modbus-TCP
Можно выяснить кем разрывается соединение. Wireshark покажет.rsv писал(а): 08 авг 2023, 10:05 Суть проблемы:
- при периодическом опросе по протоколу Modbus-TCP если возникает ошибка 56, то соединение сразу разрывается.
В Вашей программе нет блоков, которые разрывают соединение по таймауту
В описании ошибки присутствует LabVIEW DSC. Может в нем что-нибудь.
Другие программы могут разрывать соединение и снова устанавливать. И так несколько (обычно 3) попыток. При этом разрыва соединения показывать не будут.
В Modbus-TCP есть Transaction ID. Если ответ не пришел во время, возможно он придет позже. Так как устройство может задержать ответ или сетевая карта занята. Ответ придет на то же соединение и будет с предыдущим Transaction ID.
До LabVIEW 19 это поле не использовалось и я такой эффект получал (ответ на предыдущий запрос).
Поэтому при ошибке ответа нужно закрыть соединение и открыть снова. Такая ситуация не должна быть часто. Несколько раз в день приемлемо. Если чаще, то нужно смотреть таймауты, нагрузку ПЛК, нагрузку компьютера.
Wireshark все покажет.
-
rsv
- advanced

- Сообщения: 191
- Зарегистрирован: 18 июл 2019, 13:53
- Версия LabVIEW: 2020
- Откуда: Россия, Ижевск
- Благодарил (а): 40 раз
- Контактная информация:
Re: Разрыв соединения после первой ошибки по таймауту при чтении по Modbus-TCP
Такая ситуация возникает на каждую ошибку по превышению таймаута. Сначала думали, что случайность, потом ПЛК специально нагрузили что бы иногда выдавал ошибки и всё посыпалось. Это по наблюдениям за неделю на нескольких ПК.ujin1 писал(а): 08 авг 2023, 12:12 Такая ситуация не должна быть часто. Несколько раз в день приемлемо. Если чаще, то нужно смотреть таймауты, нагрузку ПЛК, нагрузку компьютера.
Wireshark все покажет.
Проблема, похоже, в самой LabVIEW.
Статистика ответов ПЛК на запросы по modbus-TCP из другой проги на скриншоте.
Буду разбираться с Wireshark.
- Вложения
-
- Статистика из модбаски.PNG (10.2 КБ) 9441 просмотр
-
ujin1
- developer

- Сообщения: 260
- Зарегистрирован: 06 ноя 2020, 15:37
- Версия LabVIEW: 19
- Благодарил (а): 19 раз
- Поблагодарили: 40 раз
- Контактная информация:
Re: Разрыв соединения после первой ошибки по таймауту при чтении по Modbus-TCP
Посмотрите мои наработки https://github.com/ujin117/LabVIEW-Modbus-API. Обновил до текущего состояния.
Прям сейчас экспериментальная установка на этой библиотеке работает.
Стандартную библиотеку переделал и добавил непрерывный опрос. Как раз с переподключением. Сложновато получилось, хотя и примеры есть.
Если будете пробовать нужно папку со стандартной библиотекой удалить в корзину. Потом можно восстановить. Так ничего не поломается.
-
rsv
- advanced

- Сообщения: 191
- Зарегистрирован: 18 июл 2019, 13:53
- Версия LabVIEW: 2020
- Откуда: Россия, Ижевск
- Благодарил (а): 40 раз
- Контактная информация:
Re: Разрыв соединения после первой ошибки по таймауту при чтении по Modbus-TCP
Спасибо, сначала попробую разобраться со штатной библиотекой.ujin1 писал(а): 08 авг 2023, 14:01 Посмотрите мои наработки https://github.com/ujin117/LabVIEW-Modbus-API.
WireShark показала следующее:
В какокй-то момент контроллер не отвечает на один запрос приложения и после этого всё рушится. Хотя приложение продолжает посылать запросы, а контроллер продолжает исправно отвечать.
На приведённом скриншоте контроллер не ответил на транзакцию 122. Последнее значение из ПЛК, показанное на форме относится к транзакции 121. Соединение не сбрасывается. Приложение по каким-то причинам после неответа ПЛК перестаёт правильно оценивать ответы ПЛК.
Может ещё что-то можно из WireShark вытащить, но я пока не знаю...
-
jane_wild
- leader

- Сообщения: 557
- Зарегистрирован: 30 июн 2016, 02:11
- Награды: 1
- Версия LabVIEW: 2026
- Благодарил (а): 108 раз
- Поблагодарили: 25 раз
- Контактная информация:
Re: Разрыв соединения после первой ошибки по таймауту при чтении по Modbus-TCP
Я бы тоже хотела посмотреть, но к сожалению LabVIEW 2021 у меня нет. Сохраните пожалуйста в версии 2020 на какой нибудь файлообменникujin1 писал(а): 08 авг 2023, 14:01 Посмотрите мои наработки https://github.com/ujin117/LabVIEW-Modbus-API. Обновил до текущего состояния.
Life is short. Smile while you still have teeth!
-
ujin1
- developer

- Сообщения: 260
- Зарегистрирован: 06 ноя 2020, 15:37
- Версия LabVIEW: 19
- Благодарил (а): 19 раз
- Поблагодарили: 40 раз
- Контактная информация:
Re: Разрыв соединения после первой ошибки по таймауту при чтении по Modbus-TCP
Контроллер притормозил. Окончился тайм-аут. LabVIEW посылает следующий запрос с Transaction ID увеличенным на 1. В этот момент контроллер отвечает на прошлый запрос. Ответ лежит в буфере сетевого драйвера. LabVIEW читает из буфера ответ. Если он полностью совпадает, то Transaction ID все равно будет неправильным. Но ошибку неправильный Transaction ID LabVIEW не вводили. Поэтому показывают ошибку 56. В новых версиях может и добавили.rsv писал(а): 08 авг 2023, 15:59 WireShark показала следующее:
В какокй-то момент контроллер не отвечает на один запрос приложения и после этого всё рушится. Хотя приложение продолжает посылать запросы, а контроллер продолжает исправно отвечать.
Приложение правильно оценивает ответы. Спрашивает с одним Transaction ID. Ему отвечают с другим. Это ошибка. Вы можете в этом запросе запросить другие адреса. А в ответе начального адреса нет насколько помню.rsv писал(а): 08 авг 2023, 15:59 Приложение по каким-то причинам после неответа ПЛК перестаёт правильно оценивать ответы ПЛК.
-
ujin1
- developer

- Сообщения: 260
- Зарегистрирован: 06 ноя 2020, 15:37
- Версия LabVIEW: 19
- Благодарил (а): 19 раз
- Поблагодарили: 40 раз
- Контактная информация:
Re: Разрыв соединения после первой ошибки по таймауту при чтении по Modbus-TCP
Сегодня уже не получится. Завтра выложу.jane_wild писал(а): 08 авг 2023, 16:47Я бы тоже хотела посмотреть, но к сожалению LabVIEW 2021 у меня нет. Сохраните пожалуйста в версии 2020 на какой нибудь файлообменникujin1 писал(а): 08 авг 2023, 14:01 Посмотрите мои наработки https://github.com/ujin117/LabVIEW-Modbus-API. Обновил до текущего состояния.
-
Borjomy_1
- doctor

- Сообщения: 2317
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 33 раза
- Поблагодарили: 38 раз
Re: Разрыв соединения после первой ошибки по таймауту при чтении по Modbus-TCP
А тайм-аут увеличить? Не?
-
Andrew Lunev
- VIP

- Сообщения: 989
- Зарегистрирован: 11 дек 2010, 12:31
- Награды: 2
- Версия LabVIEW: 2014-2021
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 19 раз
Re: Разрыв соединения после первой ошибки по таймауту при чтении по Modbus-TCP
Я делаю так.
Создаю машину состояний в которой есть состояние Reconnect и другие необходимые. Если возникает ошибка, то просто перехожу в состояние Reconnect и закрываю и снова открываю соединение. В этом случае есть небольшая задержка в опросе на переподключение, но если такая проблема возникает редко, то не страшно. Помогает и в случае, если реально связь потерялась, например устройство перезагрузили по питанию, или роутер. Или сетевой кабель выдернули и снова вставили. В вашей версии ПО надо всю программу перезапускать при разрыве соединения.
Ну и самый верный ответ, если возникают подобные ошибки, то надо увеличивать таймаут.
Создаю машину состояний в которой есть состояние Reconnect и другие необходимые. Если возникает ошибка, то просто перехожу в состояние Reconnect и закрываю и снова открываю соединение. В этом случае есть небольшая задержка в опросе на переподключение, но если такая проблема возникает редко, то не страшно. Помогает и в случае, если реально связь потерялась, например устройство перезагрузили по питанию, или роутер. Или сетевой кабель выдернули и снова вставили. В вашей версии ПО надо всю программу перезапускать при разрыве соединения.
Ну и самый верный ответ, если возникают подобные ошибки, то надо увеличивать таймаут.
-
ujin1
- developer

- Сообщения: 260
- Зарегистрирован: 06 ноя 2020, 15:37
- Версия LabVIEW: 19
- Благодарил (а): 19 раз
- Поблагодарили: 40 раз
- Контактная информация:
Re: Разрыв соединения после первой ошибки по таймауту при чтении по Modbus-TCP
https://drive.google.com/drive/folders/ ... sp=sharingjane_wild писал(а): 08 авг 2023, 16:47Я бы тоже хотела посмотреть, но к сожалению LabVIEW 2021 у меня нет. Сохраните пожалуйста в версии 2020 на какой нибудь файлообменникujin1 писал(а): 08 авг 2023, 14:01 Посмотрите мои наработки https://github.com/ujin117/LabVIEW-Modbus-API. Обновил до текущего состояния.
-
rsv
- advanced

- Сообщения: 191
- Зарегистрирован: 18 июл 2019, 13:53
- Версия LabVIEW: 2020
- Откуда: Россия, Ижевск
- Благодарил (а): 40 раз
- Контактная информация:
Re: Разрыв соединения после первой ошибки по таймауту при чтении по Modbus-TCP
То, что Вы пишите похоже на правду. Только странно что навороченная LabVIEW эту ситуацию не может разрулить, а самописные программки как-то её разруливют без переподключения и продолжают опрос.ujin1 писал(а): 08 авг 2023, 18:26 Приложение правильно оценивает ответы. Спрашивает с одним Transaction ID. Ему отвечают с другим. Это ошибка. Вы можете в этом запросе запросить другие адреса. А в ответе начального адреса нет насколько помню.
И как разрулить эту ситуацию в приложении без переподключения?
-
rsv
- advanced

- Сообщения: 191
- Зарегистрирован: 18 июл 2019, 13:53
- Версия LabVIEW: 2020
- Откуда: Россия, Ижевск
- Благодарил (а): 40 раз
- Контактная информация:
Re: Разрыв соединения после первой ошибки по таймауту при чтении по Modbus-TCP
Увеличивал до 1 500 мс таймаут при чтении и интервал опроса до 2 000 мс. Значения совсем уже запредельные и работать с ними невозможно, но всё равно не помогло.
-
rsv
- advanced

- Сообщения: 191
- Зарегистрирован: 18 июл 2019, 13:53
- Версия LabVIEW: 2020
- Откуда: Россия, Ижевск
- Благодарил (а): 40 раз
- Контактная информация:
Re: Разрыв соединения после первой ошибки по таймауту при чтении по Modbus-TCP
С переподключением понятно. Если других вариантов не найду придётся закрывать и заново создавать соединение.Andrew Lunev писал(а): 08 авг 2023, 21:52 Создаю машину состояний в которой есть состояние Reconnect и другие необходимые. Если возникает ошибка, то просто перехожу в состояние Reconnect и закрываю и снова открываю соединение. В этом случае есть небольшая задержка в опросе на переподключение, но если такая проблема возникает редко, то не страшно. Помогает и в случае, если реально связь потерялась, например устройство перезагрузили по питанию, или роутер. Или сетевой кабель выдернули и снова вставили.
Но, на мой взгляд, реация LabVIEW в данном случае несколько странная. Сначала буду искать решение без переподключения.
-
ujin1
- developer

- Сообщения: 260
- Зарегистрирован: 06 ноя 2020, 15:37
- Версия LabVIEW: 19
- Благодарил (а): 19 раз
- Поблагодарили: 40 раз
- Контактная информация:
Re: Разрыв соединения после первой ошибки по таймауту при чтении по Modbus-TCP
Два варианта.rsv писал(а): 09 авг 2023, 09:29 То, что Вы пишите похоже на правду. Только странно что навороченная LabVIEW эту ситуацию не может разрулить, а самописные программки как-то её разруливют без переподключения и продолжают опрос.
1. Программа смотрит что пришел ответ с предыдущим Transaction ID и читает с буфера еще раз.
2. Все таки переподключается. А переподключается или нет (закрывает ТСР соединение и открывает повторно) можно опять же проверить Wireshark' ом.
Стандартрой библиотекой никак. Чтение буфера закопано глубоко внутри и закрыто паролем.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 2 Ответы
- 134 Просмотры
-
Последнее сообщение Artem.spb
-
- 3 Ответы
- 306 Просмотры
-
Последнее сообщение AndreyDmitriev
-
- 9 Ответы
- 180 Просмотры
-
Последнее сообщение iGerodot