После команды SysSockRecvFrom, ПЛК ожидает данных и видимо поэтому время цикла улетает в небо и происходит обрыв связи. Но если после пуска программы (полный код ниже) сразу из HerculesTerminal (например) послать данные, то ПЛК принимает данные и время цикла остается в разумных пределах и работа, и связь с ПЛК продолжается. Чтобы это избежать применил команду SysSockIoctl (неблокирующие сокеты, третий параметр 1 INT). Но это не помогло, если посылку с ПК не послать, то ПЛК блокируется и не реагирует на команды через 10 секунды КДС сообащет о потере связи. Как это обойти? И как отправлять данные командой SysSockSendTo? Пробовал отправлять ею заполненный массив на HerculesTerminal ничего не приходит. Почему NumberOfBytes не меняет свое значение, всегда (-1), хотя Recv прошел успешно
IF start THEN
IF HandleSocket<0 THEN (*нет сокета, тогда создаем*)
HandleSocket:=SysSockCreate(SOCKET_AF_INET, SOCKET_DGRAM, 0); (*создали сокет DGRAM для которого третий параметр 0 означает UDP *)
sa.sin_family:=SOCKET_AF_INET; (* заполняем структуру sa типа SOCKADDRESS*)
sa.sin_addr:=SOCKET_INADDR_ANY;
sa.sin_port:=SysSockHtons(1300);
result_bind:=SysSockBind(HandleSocket, ADR(sa), SIZEOF(sa)) ; (*связываем сокет*)
ELSE
numberOfBytes := SysSockRecvFrom (HandleSocket,ADR(MessageFromPC),1600,0,ADR(sa),SI ZEOF(sa));
IF numberofbytes<>-1 THEN SysSockClose(HandleSocket);
END_IF
END_IF
ELSE
IF HandleSocket<>SOCKET_INVALID THEN (* сокет закрываем, если START переведен в FALSE*)
SysSockClose(HandleSocket);
HandleSocket:=SOCKET_INVALID;
MessageFromPC:=Zero;
END_IF
END_IF