Добрый день.
Проблема с SysSockRecv.
Не то чтобы он совсем не работал, перестает работать через час, полтора.
код приёма такой, лишнее убрано
Логика работы.Код:(* ### Чтение из сокета ### *) IF(diSocket > 0)THEN diRxCount := SysSockRecv(diSocket, ADR(rxBuf[1]), 255, SOCKET_MSG_OOB); IF(diRxCount > 0)THEN diLastRxCount := diRxCount; (*тут у меня вызов ФБ*) END_IF END_IF
Плк считывает rfid метку и отправляет запрос на сервер для аутентификации карты.
Сервер - мой, написал на java, смотрит по базе кто это и отвечает плк, приведенный код как раз принимает данные от сервера.
Скептикам сразу говорю, я засомневался в себе и хотя в логах выводится после отправки массив я запустил wireshark и убедился что от плк и в плк пакеты идут.
Дальше по логике, если сервер не отвечает, то плк через секунду повторяет запрос, опять же всё вижу, байты приходят на сервер и уходит ответ каждый раз но diRxCount = -1.
В результате плк получает всёравно ответ, но через некоторое время (секунд 5 - 20).
Так как я всё это еще разрабатываю, то перезаписывать программу в плк приходится очень часто, вот и грешу на codesys.
Моё предположение что после N-го количества раз подключения из codesys SysSockRecv перестает корректно работать.
После заводского сброса (из codesys) всё работает как надо и молниеносно.
Еще мысли, ответ от сервера заранее неизвестен, но максимум 15 байт, считывать же я пытаюсь в каждом цикле плк 255 байт, по сути нет функции которая скажет сколько доступно для чтения поэтому так. Может тут что-то упустил?