Сообщение от
Serhioromano
Блин, счастье длилось не долго. Это функция работает в проекте с тестовой программой. Если сохраняю ее как библиотеку .lib тоже работает если залить на ПЛК, а если подключаю ее к другому проекту, то там ни фига не работает. Хотя код вызова ФБ одинаковый. Что может быть?
Сокеты у Овена своеобразные, но вроде работают
1. создать сокет ( SysSockCreate )
2. настроить неблокирующий режим ( SysSockSetOption )
3. попытка соединения с сервером ( SysSockConnect )
4. немного подождать
5. отправка сообщения серверу ( SysSockSend ), если отправка удалась, то переходим (6) иначе (3)
6. можно совсем немного подождать
7. прием ответа ( SysSockRecv )
Замечания:
1. ( bStep = 10 ), чтобы нечаянно не потерять сокет, я бы сделать так
Код:
IF ( handle = SOCKET_INVALID ) THEN
answer := SysSockCreate( SOCKET_AF_INET, SOCKET_STREAM, SOCKET_IPPROTO_TCP );
if ( answer = SOCKET_INVALID ) then
....
else
handle := answer;
....
end_if
else
SysSockShutdown( handle, 2 );
SysSockClose( handle );
handle := SOCKET_INVALID;
end_if
2. ( bStep = 20 ) – не нужно анализировать возврат SysSockConnect, можно сразу переходить к отправке, можно немного подождать, и потом переходить к отправке
3. ( bStep = 20 ) – вызов SysSockSetOption, наверно, лучше перенести в ( bStep = 10 )
4. ( bStep = 30 ) – я не уверен, что нужно использовать флаги в SysSockSend, попробуйте 0
5. ( bStep = 30 ) – я не уверен, что SysSockSend может вернуть отрицательное значение
6. ( bStep = 30 ) – в Modbus Tcp «маленькие» пакеты, не нужно пытаться отправлять запрос по частям, т.е
Код:
answer := SysSockSend( handle, adr( data ), sizesof( data ), 0 );
if ( answer = sizeof( data ) ) then
переход на прием
else
...
end_if
7. ( bStep = 40 ) – я не уверен, что нужно использовать флаги в SysSockRecv, попробуйте 0
8. ( bStep = 40 ) – я не уверен, что SysSockRecv может вернуть отрицательное значение
9. ( bStep = 40 ) – нужно проверять ответ, а не просто
Код:
IF diResult > 0 THEN
10. ( bStep = 40 ) - размер буфера для чтения, наверно, должен быть больше 25 байт
Код:
arbBuffer: ARRAY[0..24] OF BYTE;
наверно для FC = 3 или FC = 4 размер должен быть не меньше 259 ( 9 + REG_NUM * 2, если читать до 125 регистров ), или 263 ( 9 + REG_NUM * 2, если читать до 127 регистров )
11. ( bStep = 40 ) - вашему FB очень не хватает таймера (watchdog)