PDA

Просмотр полной версии : Вопрос по MB_TcpSlave из Owen Communication



hermano
01.10.2022, 20:50
Ситуация следующая.
Работает сервер modbus slave на ПЛК200. К нему конектится панель СП310. Отключаю/подключаю кабель между панелью и контроллером, связь пропадает и появляется автоматически. Все нормально.
Подключаю вместо панели ноут с эмулятором панели (овеновский) или OPC сервером. Связь есть пока не отключишь кабель. Как только кабель отключил/подключил, связь уже не восстановится пока не перезапущу MB_TcpSlave переменной xEnable.
Интересно что после отключения ноута и подключения панели, панель автоматически подключается к контроллеру. А если отключить ноут или панель и подключить ноут, то нужно перезапускать MB_TcpSlave.

Как быть в такой ситуации? Так как сервак с OPС может отключаться и соответственно связь нужно как-то восстанавливать. С чем связана разная реакция MB_TcpSlave на отключение кабеля от панели и от ноутбука?

Евгений Кислов
01.10.2022, 21:30
Ситуация следующая.
Спецификация TCP/IP описывает, что корректное завершение соединения должно производиться путем отправки специального пакета (FIN или RST).
Если вы физически отключаете и заново подключаете кабель - то в большинстве случаев master-устройство открывает новое соединение.
Старое соединение остается в "полуоткрытом" (https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BB%D1%83%D0%BE%D1%82%D0%BA%D1%80%D 1%8B%D1%82%D0%BE%D0%B5_TCP/IP-%D1%81%D0%BE%D0%B5%D0%B4%D0%B8%D0%BD%D0%B5%D0%BD%D 0%B8%D0%B5) состоянии.
У ФБ MB_TcpSlave есть ограничение на число одновременных соединений; оно определяется константой g_c_usiMaxCountClients, у которой значение по умолчанию - 1.
Т.е. после физического разрыва канала связи - блок продолжает ждать запросов в рамках "полуоткрытого" соединения, а мастер пытается установить новое соединение и не может этого сделать.

Справедливый вопрос - сколько блок будет продолжать ждать пакетов в рамках "полуоткрытого" соединения, прежде чем закроет его сам?
На самом деле, это зависит не от блока, а определяется реализацией стека TCP/IP для конкретной операционной системы и ее настройками.
Я не могу сходу сказать, какое значение у нас; для Windows, насколько я помню, значение по умолчанию составляет 2 часа.


С чем связана разная реакция MB_TcpSlave на отключение кабеля от панели и от ноутбука?

Вероятно, панель не успевает разорвать соединение со своей стороны и пытается работать по старому соединению, а ноутбук сразу создает новое.
Я так понимаю, кабель вы отключаете на несколько секунд.
Если подождать дольше (минут 5, например) - думаю, и поведение панели будет таким же, как у нотбука.


Как быть в такой ситуации?

У блока есть выход xNewRequest.
Заводите его инвертированное значение на вход IN экземпляра таймера TON c PT, например, 30 секунд.
Если выход таймера сработал - значит, в течение этого времени от мастера не было запросов - тогда перезапускаете блок с помощью xEnable.

В нашем трекере задач есть пожелание на доработку блока - чтобы у него появился вход tSocketTimeout, который будет обрабатываться по описанному выше алгоритму (нет запросов в течение заданного времени - значит, разрываем соединение).

62908

hermano
01.10.2022, 21:37
Спасибо за быстрый ответ. Техподдержка прямо молниеносная :)

hermano
02.10.2022, 16:29
А как лучше менять ip адрес ПЛК200 из пользовательской программы. В СПК все понятно, а в ПЛК200 не понял как сделать. Хотел сделать через UpdateConfiguredIPSettings, но на 200 не работает.

Евгений Кислов
02.10.2022, 17:00
А как лучше менять ip адрес ПЛК200 из пользовательской программы. В СПК все понятно, а в ПЛК200 не понял как сделать. Хотел сделать через UpdateConfiguredIPSettings, но на 200 не работает.

Уточните, пожалуйста, для какой задачи вам потребовалась такая возможность и как именно будет изменяться IP контроллера в процессе его работы.

hermano
02.10.2022, 18:43
Отгружаю установку на ПЛК 200 заказчику. Пароли ему не даю от вебморды (почему... отдельный вопрос). Хочу чтобы он с панели оператора поменял настройку сети на нужную и ничего не сломал. Во время работы на горячую менять не надо.

На СПК делаю экран настройки 62929, на 200 хотелось бы повторить.

т.е. заказчик не должен нигде ковыряться, только на моих экранах. Вбить значения и нажать обновить настройки. Можно с перезагрузкой контроллера.

Евгений Кислов
03.10.2022, 08:01
Отгружаю установку на ПЛК 200 заказчику. Пароли ему не даю от вебморды (почему... отдельный вопрос). Хочу чтобы он с панели оператора поменял настройку сети на нужную и ничего не сломал. Во время работы на горячую менять не надо.

На СПК делаю экран настройки 62929, на 200 хотелось бы повторить.

т.е. заказчик не должен нигде ковыряться, только на моих экранах. Вбить значения и нажать обновить настройки. Можно с перезагрузкой контроллера.

Для этого потребуется:

1. Добавить в менеджер библиотек проекта библиотеку CmpSysExec.
2. Узнать имя сетевого интерфейса, у которого вы хотите изменить IP (можно посмотреть в web-конфигураторе).

62932

Предположим, у вас есть сетевой интерфейс с именем WAN, которому вы хотите задать IP = 192.168.0.30.

Тогда в коде вашего проекта делайте так:



IF xChangeIp THEN

CmpSysExec.sysExecute('uci set network.wan.ipaddr=192.168.0.30');
CmpSysExec.sysExecute('uci commit');
CmpSysExec.sysExecute('reload_config');

xChangeIp := FALSE;

END_IF

hermano
03.10.2022, 08:30
Спасибо. Будем пробовать.

Jukki
10.11.2023, 08:51
Евгений, а как изменить значение g_c_usiMaxCountClients? Из-за того что это константа, не записать значение в OCL.Settings.g_c_usiMaxCountClients.

Евгений Кислов
10.11.2023, 09:06
Евгений, а как изменить значение g_c_usiMaxCountClients? Из-за того что это константа, не записать значение в OCL.Settings.g_c_usiMaxCountClients.

См. скриншот:

71484