Да у меня тоже сокет закрывается только по таймауту или ошибки ( SysSockSend ) - TCP_CLIENT_2().
А Вы пробовали мой код или свой?
свой. попробуйте все же дождаться от SysSockConnect FALSE
IF ( step = 3 ) THEN
connectCounter := connectCounter + 1;
sa.sin_family := SOCKET_AF_INET;
sa.sin_addr:=SysSockHtonl( tmpHost );
sa.sin_port := SysSockHtons( tmpPort );
IF NOT SysSockConnect( handle, ADR( sa ), SIZEOF( sa ) ) THEN
step := 5;
END_IF
RETURN;
END_IF
сделайте все-таки проверку хэндла не только на неравенство с "-1", но и с "0" перед закрытием сокета и попробуйте. Скорее всего, проблема, как отмечал уже Артем, в закрытии закрытого сокета.
честно говоря никогда не писал проекты с несколькими PRG и даже не понимаю как оно там реально на ПЛК крутицо.
я бы переделал TCP_CLIENTы в FB. а если один из TCP_CLIENTов например, убрать тоже виснет?
и чтобы PRG исполнилось его нужно вызывать обязательно?
у меня еще закрытие сокетов происходит в два этапа SysSockShutdown отдельно от SysSockClose и я у всех проверяю чо там они возвращают.
как то так:
ST_BREAK:
o_dnRes := BOOL_TO_DINT ( SysSockShutdown( m_dnSocket, 2 ) );
CASE i_pOptions^.ePCL OF
OVEN_100: m_b := o_dnRes = 1;
OVEN_110: m_b := o_dnRes = 1;
OVEN_110_v2: m_b := o_dnRes = 0;
END_CASE
IF m_b THEN
o_eCondition := ST_CLOSE;
END_IF
ST_CLOSE:
o_dnRes := BOOL_TO_DINT( SysSockClose ( m_dnSocket ) );
CASE i_pOptions^.ePCL OF
OVEN_100: m_b := o_dnRes = 1;
OVEN_110: m_b := o_dnRes = 0;
OVEN_110_v2: m_b := o_dnRes = 1;
END_CASE
IF m_b THEN
m_dnSocket := SOCKET_INVALID;
o_eCondition := ST_EXPECT;
END_IF
попробуйте всё таки отладить с точками останова. открыли сокет, всё ок, далее. настроили , стоп. отправили , стоп. и т.д. чтобы выявить слабое место.
я смотрю по буферу Вы модбас поднимаете? попробуйте библиотеку , что прикладывал. у меня она отлично бегает как с переинициальзацие сокета каждый раз , так и с сохранением сокета.
Пытаюсь. Запускаю TCP_CLIENT_2, жду пока пойдет обмен, ставлю точки останова на всех шагах, кроме 0, 5 ( SysSockSend ) и 7 ( SysSockRecv ). Отрубаю сервер. Наблюдаю. Несколько секунд растет счетчик recvCounter. Потом все замирает и ПЛК уходит в перезагрузку. Точки останова не срабатывают. Т.е это либо отправка или прием или не сработали точки останова. Причем эффект стал нестабилен. Иногда приходиться раз 10 кабель передергивать.
Мне техподдержка примеры прислала. В примерах SysSockSend и SysSockRecv выполняются с флагом SOCKET_MSG_OOB. Завтра попробую может поможет...