Доброго времени суток
Подскажите пожалуйста, я по вышеописанному принципу создал "один работающий FB" для обмена данными по UDP:
итерация 1. Сокет открыл, посылку отправил
итерация 2. жду ответа (n := n + 1; (*счетчик итераций*) далее просто проверяем если счетчик равен заданному количеству или пакет получен, закрываем сокет)
Если я использую один экземпляр данного FB, все хорошо.
Но если экземпляров становится больше (например 2) и один экземпляр обращается к несуществующему устройству Dev1 (сокет открывается, посылка идет, но ответа нет), а другой экземпляр к существующему Dev2 (ответы приходят), то ответные пакеты от устройства Dev2 начинаются теряться, либо приходят но с очень большим запозданием.
В коде использовал функцию SysSockSelect(), в которой указывал тайм-аут 1 сек. Но даже закомментив данный кусок кода все равно получаю такую бяку =(
Пробовал в SysSockSelect() выставить тайм-аут = 0, ситуация улучшилась, количество потерянных пакетов уменьшилось, но все равно полностью от этого избавиться пока не смог.
1. Такое ощущение, что функция SysSockRecvFrom() устройства Dev1 блокирует поток на N-ое время, за которое SysSockRecvFrom() устройства Dev2 теряет ответный пакет. Возможно ли такое?
2. Есть ли у функции SysSockRecvFrom() какое-то ограничение по времени по принятию пакета?
3. Или может быть эту функцию тоже как и открытие сокета нельзя вызывать в одной итерации ПЛК (хотя в ней же указывается с какого сокета принимать)?
4. Может ли влиять на эту ситуацию тот факт, что экземпляры выше описанного FB вызываются в программе PLC_PRG друг за другом в одной итерации, т.е. получается, что сокеты этих экземпляров открываются в одной итерации?
Спасибо большое всем откликнувшимся!