PDA

Просмотр полной версии : UDP и SysLibSockets.lib



cer_cer
13.02.2013, 19:44
Здравствуйте. Нигде не могу найти примера кода отсылки и приёма 1го пакета (фрейма) в сеть Ethernet по протоколу UDP с использованием библиотеки SysLibSockets.lib. Помогите чем-нибудь кто может.

Николаев Андрей
14.02.2013, 10:13
http://www.owen.ru/forum/showthread.php?t=13588

cer_cer
15.02.2013, 21:08
Спасибо за ссылку, но там я не нашел ничего подобного тому, что мне надо. Вот здесь
==================
Пример сетевого обмена по протоколу UDP через Ethernet.
====================
Просто пример конфигурации и ни какого кода с приминением библиотеки для Сокетов. Мне нужно отсылать команды и данные С ПК
на контроллер по Ethernet.

cer_cer
15.02.2013, 21:17
Где хоть подробное описание библиотеки SysLibSockets.lib. найти?
В справке написано:
diFlags (параметр)
DINT
Определяет способ вызова функции; зависит от опций сокета. (в Win32 параметр flags)

Ну и как разузнать какой сюда флаг ставить???

cer_cer
15.02.2013, 21:26
pSockAddr (параметр)
DWORD
Указатель на переменную типа SOCKADDR; (См. SysSockAccept)

Как структуру SOCKADDR инициализировать?

Николаев Андрей
16.02.2013, 00:12
Плюс на диске с ПЛК описание библиотеки.

cer_cer
16.02.2013, 08:49
Плюс на диске с ПЛК описание библиотеки.

Андрей, на диске описание точно такое-же как в справочной системе
CODESYS про функции из SisLibSocets написано в основном следующее

вызывает функцию socket операционной системы.
Детальное описание функции socket дано в справочной системе соответствующей ОС.

В связи с этим возникает вопрос - Что за операционная система стоит
на моём PLC150 A-M? и где к ней справочная система? Разьясните пожалуйста.

cer_cer
18.02.2013, 16:44
В библиотеке блок приема контроллером пакетов по UDP
Ваша библиотека byCapzap.lib без пароля не открывается.
Какую я нашёл библиотеку tcpudplib там никаких примеров нет

cer_cer
18.02.2013, 20:28
Спасибо, CapZap. Как попробую, напишу.

vishwa
08.11.2013, 10:14
Hai.. I am running your program but socket is not creating.. its returning -1 please guide me.. i am trying to simulate it not using any board..

vishwa
08.11.2013, 16:44
Thanks for suggestion, sorry for bad English,
so tell me why server socket is not binding with the client socket? and Do we need to set the communication parameters for simulation ? if yes How? sorry i am student, and I am from INDIA, Karnataka, Bangalore.

capzap
08.11.2013, 16:51
марка контроллера у вас какая, точно от компании ОВЕН?
смотрите http://www.owen.ru/forum/showthread.php?t=12718&p=83532&viewfull=1#post83532 в архиве проекты-примеры как организовать и сервер и клиент, я всё делал по этим примерам
видео http://www.owen.ru/forum/attachment.php?attachmentid=6212&d=1338273262 и вот http://www.owen.ru/forum/showthread.php?t=12729&p=83823&viewfull=1#post83823

vishwa
11.11.2013, 13:57
Hai,, there is function DWORD_OF_BYTE in that program whats that exactly doing? And you used SysSockNtohs, function for conversion of port but in codesys2.3 document i have read that it has to be SysSockHtons(), why you used it? And i tried all the things but socket descriptors returning 0 and server socket not listening. I followed your both the videos but still i am not able to do it.. do you have any other suggestion for me.. please..

capzap
11.11.2013, 14:35
пожалуйста, вот еще вариант http://www.oscat.de/downloadmanager/viewdownload/4-oscatnetwork/84-oscat-network-codesys-2-x.html
и документация http://www.oscat.de/downloadmanager/viewdownload/4-oscatnetwork/91-oscat-network-docu-english.html
но разобранный там пример не будет работать с плк ОВЕН, для PLCWinNT у меня получалось

vishwa
11.11.2013, 15:23
i have set target to 3s CodeSys PLCWinNT V2.4, As i said before i dont have any real hardware device. i just want to simulate it in CodeSys tool.

vooodooo22
24.01.2016, 13:03
Доброго времени суток!

Подскажите пожалуйста, такая ситуация.

Организовал связь по UDP симулятора CoDeSys SP PLCWinNT v2.4 с коммутатором EtherWAN EX87604 с помощью библиотеки SysLibSockets.lib. Посылка уходит, пакет приходит, все нормально. Заливаю проект на ПЛК ОВЕН 110-30М. Пытаюсь связать ПЛК с коммутатором EtherWAN EX87604. Посылка уходит, ответ приходит нулевой:
(diNumByte_Recv := SysSockRecvFrom( diSocket_SendRecv, ADR(byRecv[0]), SIZEOF(byRecv), 0, ADR(sa_SendRecv), SIZEOF(sa_SendRecv)); (*тут diNumByte_Recv = 0*)).

Заметил такую особенность, в симуляторе функция SysSockHtons(wPort) смещает биты влево на 8 разрядов, а в ПЛК ОВЕН110-30M данная функция оставляет переменную wPort без изменения.

Что может быть не так?

Заранее спасибо!

Yegor
24.01.2016, 16:45
Может, проект покажете?

vooodooo22
25.01.2016, 12:42
Вопрос решился.

Походу конвертирование IP адреса на ПЛК ОВЕН 110-30М происходит в другой последовательности нежели на симуляторе PLC WinNT v2.4. В итоге из ПЛК посылка уходила на другой айпишник (вместо 192.168.220.18 уходила на 18.220.168.192), а в симуляторе посылка шла на айпи 192.168.220.18. Код использовался один и тот же.

+ шлюз на ПЛК прописал айпи коммутатора (на всяк случай), теперь все работает ;)

vooodooo22
25.01.2016, 15:26
и тут же возникает вопрос =)

как можно узнать на какой айпишник отправляет ПЛК пакет. WireShark я так понял цепляет пакеты отправленные только на его сокет. А что делать если пакеты летят на неизвестный сокет, какими-то средствами это вычислить можно? Куда улетел пакет? =))))

Scream
25.01.2016, 16:09
и тут же возникает вопрос =)

как можно узнать на какой айпишник отправляет ПЛК пакет. WireShark я так понял цепляет пакеты отправленные только на его сокет. А что делать если пакеты летят на неизвестный сокет, какими-то средствами это вычислить можно? Куда улетел пакет? =))))

что значит на его сокет? WireShark покажет все пакеты связанные с вашим ПК, тоесть ваш ip в source или distanation, чтобы отследить другие пакеты нужна другая ОС и другие средства.

vooodooo22
26.01.2016, 15:20
да, прошу прощения не правильно выразился =)

"чтобы отследить другие пакеты нужна другая ОС и другие средства." - не подскажите что за такие средства и ОС? Линукс? :)

Филоненко Владислав
28.01.2016, 08:14
Вопрос решился.

Походу конвертирование IP адреса на ПЛК ОВЕН 110-30М происходит в другой последовательности нежели на симуляторе PLC WinNT v2.4. В итоге из ПЛК посылка уходила на другой айпишник (вместо 192.168.220.18 уходила на 18.220.168.192), а в симуляторе посылка шла на айпи 192.168.220.18. Код использовался один и тот же.

+ шлюз на ПЛК прописал айпи коммутатора (на всяк случай), теперь все работает ;)
На симуляторе ВЕ а на ПЛК LE. Функции htons() и htonl() придумали не просто так :)

vooodooo22
28.01.2016, 12:34
На симуляторе ВЕ а на ПЛК LE. Функции htons() и htonl() придумали не просто так :)

Эммм... а как расшифровывается BE, LE?

Подскажите пожалуйста, как в данном случае можно указать адрес (.sin_addr) в правильном формате с помощью htonl() ? :confused:

Вот отрывок из рабочего кода на данный момент в ПЛК ОВЕН110-30М:



IF diSocket = SOCKET_INVALID THEN

diSocket := SysSockCreate(SOCKET_AF_INET, SOCKET_DGRAM, SOCKET_IPPROTO_UDP);

IF diSocket <> SOCKET_INVALID THEN
sa_SendRecv.sin_addr := SHL( SHL( SHL(
BYTE_TO_DWORD(strIPaddress[0] ), 8 )
OR BYTE_TO_DWORD( strIPaddress[1] ), 8 )
OR BYTE_TO_DWORD( strIPaddress[2] ), 8 )
OR BYTE_TO_DWORD( strIPaddress[3] );
sa_SendRecv.sin_family := SOCKET_AF_INET;
sa_SendRecv.sin_port := SysSockHtons(wPort);
END_IF
END_IF

Филоненко Владислав
28.01.2016, 14:32
BE vs LE это как битва тупо и остроконечников.
Порядок байт, на Интел BE (Big Endian), на ARM LE (little endian).
Соответственно
sa_SendRecv.sin_addr := SysSockHtonl(IP_addr);
И ведь 1/2 Вы сделали, поставив sa_SendRecv.sin_port := SysSockHtons(wPort); ?!?

vooodooo22
29.01.2016, 10:41
...
Соответственно
sa_SendRecv.sin_addr := SysSockHtonl(IP_addr);...

я так понимаю тип данных переменной IP_addr тут будет DWORD. Т.е. изначально все равно необходимо привести IP адрес к DWORD`у из байтового массива. Например:


dwIP_addr : DWORD;
abyIPaddress : ARRAY[0..3] OF BYTE := '192.168.225.021';

dwIP_addr := SHL( SHL( SHL(
BYTE_TO_DWORD(abyIPaddress[0] ), 8 )
OR BYTE_TO_DWORD( abyIPaddress[1] ), 8 )
OR BYTE_TO_DWORD( abyIPaddress[2] ), 8 )
OR BYTE_TO_DWORD( abyIPaddress[3] );

sa_SendRecv.sin_addr := SysSockHtonl(dwIP_addr);


так? =)

Филоненко Владислав
29.01.2016, 11:37
я так понимаю тип данных переменной IP_addr тут будет DWORD. Т.е. изначально все равно необходимо привести IP адрес к DWORD`у из байтового массива. Например:
так? =)
да, именно так

vooodooo22
29.01.2016, 17:39
Спасибо большое! Теперь все работает и на реальном ПЛК и на симуляторе!

Сейчас разбираюсь с блокирующими сокетами. Есть такая функция SysSockSelect(). Не до конца понимаю что должны принимать ее параметры fdRead, fdWrite и fdExcept.

Подскажите пожалуйста правильно ли я понимаю, что каждый из этих параметров это массив (тип данных не понял), который в каждой ячейке памяти хранит значение дискриптора сокета (или значение SOCKET_INVALID)?

Как в таком случае правильно задать параметры для функции SysSockSelect()? :confused:



Прошу прощения за расторопность, описание нашел в справке Codesys v2.3 =)