PDA

Просмотр полной версии : Поддержка Socket в ПЛК110 М02



Андрей Шатохин
17.04.2016, 20:56
Коллеги!
Портирую свой проект со старых ПЛК на М02 и с ужасом обнаруживаю, что SysLibSocket не работает, так как раньше на старых ПЛК.
Буду конечно ещё копать, но может уже всё откопано? Никто не замечал? может всё просто и уже есть рецепт? типа нового SysLibSocket.lib или ещё чего???

capzap
17.04.2016, 21:29
ну как бы да, постарались привести к более правильному варианту

Андрей Шатохин
18.04.2016, 12:23
ну как бы да, постарались привести к более правильному варианту

Отлично! Очень рад за нас за всех =)
Не сочтите за труд подскажите, пожалуйста, ссылку где написано как правильно и наиболее близко к стандарту работать с syslibsocket?
Буду очень благодарен.

С уважением,
Шатохин А.В.

Филоненко Владислав
18.04.2016, 14:49
msdn.com?
Пример в студию

Андрей Шатохин
19.04.2016, 17:50
с удовольствием =)


VAR_GLOBAL
state:BYTE:=0;
counter:WORD:=0;
yelka_adr:SOCKADDRESS; (* адрес *)
sock: DINT:=0; (* переменная для хранения сокета *)
diByte_s:DINT;
con_res:BOOL;
int_for_send: UINT; (*шлём вот такую штуку *)
END_VAR


CASE state OF
0: (* задаём адрес и больше сюда не лазием *)
yelka_adr.sin_family:=SOCKET_AF_INET;
yelka_adr.sin_port:=SysSockHtons(80);
yelka_adr.sin_addr:=16#4EAB40F2; (* *)
state:=1;
1: (* здесь сидим 10 секунд *)
counter:=counter+1;
IF counter > 10000 THEN
counter:=0;
state:=2;
END_IF;
2: (* начинаем *)
sock := SysSockCreate(SOCKET_AF_INET, SOCKET_STREAM, SOCKET_IPPROTO_TCP);
SysSockIoctl( sock, SOCKET_FIONBIO, ADR(diParam));
state:=3;
3: (* коннектимся *)
con_res:=SysSockConnect(sock, ADR(yelka_adr), SIZEOF(yelka_adr));
state:=4;
4: (* отправляем байты *)
diByte_s:=SysSockSend(sock, ADR(int_to_send), SIZEOF(int_to_send), SOCKET_MSG_OOB);
state:=5;
5: (* немного подождали *)
counter:=counter+1;
IF counter > 2000 THEN
counter:=0;
state:=6;
END_IF;
6: (* начинаем заново *)
SysSockShutdown(sock, 2);
SysSockClose(sock);
sock:=0;
state:=1;
END_CASE;

_Pavel_
19.04.2016, 20:44
SysSockIoctl( sock, SOCKET_FIONBIO, ADR(diParam));
;

Если Вы используете неблокирующий режим, то обратите внимание на это (http://www.owen.ru/forum/showthread.php?t=14520&p=189143&viewfull=1#post189143)

_Pavel_
19.04.2016, 22:09
Андрей, есть ещё проблема: если Вы пытаетесь передать объём данных >255 байт работать будет только на прошивке 45 и выше. Подробнее читайте тут (http://www.owen.ru/forum/showthread.php?t=14520&p=192601&viewfull=1#post192601) и ниже.

Андрей Шатохин
24.04.2016, 17:47
Всем спасибо за участие, помогли! Разобрались!
Для всех, кто пойдет следом подвожу итог, лишним не будет - сэкономлю чьё-то время
(в ссылках что давали выше нет одной ма-а-аленькой детали, которую ещё поискать надо).
Действительно в М02 сокеты работают, и, как говорят знающие люди, стали ближе к стандартам.
Моя проблема решилась переводом сокета в неблокирующий режим следующим образом.

SysSockSetOption( SOCK, SOCKET_SOL, SOCK_NBIO, 0, 0 ) ;

где SOCK_NBIO: WORD:= 16#1014;

P.S. А проблемы ограничения передачи 256 байт, как была в старых ПЛК110 с прошивкой 2.15.8, в М02 нет, что то же прям позитив-позитив. =)

Филоненко Владислав
25.04.2016, 08:00
И не забываем использовать HTONS и HTONL!