PDA

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



osipov86
28.02.2013, 12:46
Здравствуйте, уважаемые форумчане.
Использую ПЛК100, Codesys v2.3. Библиотеку SyslibSockets v.20.2.06(взята с диска поставки).
Во-первых не работает функция SysSockInetAddr('string IP'). Ну ладно, можно и обойтись без нее.
Во-вторых функция SysSockConnect() при любом случае у меня возвращает FALSE. Имею в виду, если успешно подключаюсь к серверу TCP, то результат False, если не подключается, то все равно False. Сервер TCP на Windows. Как такое может быть?
Код:

address.sin_addr:=172*256*256*256+17*256*256+98*25 6+44;
address.sin_family:=SOCKET_AF_INET;
address.sin_port:=SysSockHtons(port);
addressPointer:=ADR(address);
IF socketId=0 THEN
socketId:=SysSockCreate(SOCKET_AF_INET,SOCKET_STRE AM,0);
result:=SysSockConnect(socketId,addressPointer,SIZ EOF(address));
END_IF
Сама функция, если сервер TCP доступен, выполняет подключение(вижу на сервере подключение). И в принципе дальше работает Send, и сервер все получает. Но вопрос: как проверять выполнилось ли подключение? какую функцию для этого использовать? как получить ошибки(сервер сбросил подключение, таймаут и т.п.)

Yegor
01.03.2013, 05:57
Где-то обсуждалось — не могу найти тему. Короче, там кто-то всё напутал, и функции этой библиотеки возвращают что попало.

capzap
01.03.2013, 07:18
Здравствуйте, уважаемые форумчане.
Использую ПЛК100, Codesys v2.3. Библиотеку SyslibSockets v.20.2.06(взята с диска поставки).
Во-первых не работает функция SysSockInetAddr('string IP'). Ну ладно, можно и обойтись без нее.
Во-вторых функция SysSockConnect() при любом случае у меня возвращает FALSE. Имею в виду, если успешно подключаюсь к серверу TCP, то результат False, если не подключается, то все равно False. Сервер TCP на Windows. Как такое может быть?
Код:

address.sin_addr:=172*256*256*256+17*256*256+98*25 6+44;
address.sin_family:=SOCKET_AF_INET;
address.sin_port:=SysSockHtons(port);
addressPointer:=ADR(address);
IF socketId=0 THEN
socketId:=SysSockCreate(SOCKET_AF_INET,SOCKET_STRE AM,0);
result:=SysSockConnect(socketId,addressPointer,SIZ EOF(address));
END_IF
Сама функция, если сервер TCP доступен, выполняет подключение(вижу на сервере подключение). И в принципе дальше работает Send, и сервер все получает. Но вопрос: как проверять выполнилось ли подключение? какую функцию для этого использовать? как получить ошибки(сервер сбросил подключение, таймаут и т.п.)

А как сами думаете, зачем в Вашем коде переменная результ?

osipov86
01.03.2013, 08:45
Результат потом можно обрабатывать, просто проблема в том, что он всегда возвращает false(при удачном установлении связи и при неудачном)

capzap
01.03.2013, 09:04
ну тогда банально если сокет отличен от инвалид_сокет значит соединение установлено

osipov86
01.03.2013, 10:36
SysSockCreate(SOCKET_AF_INET,SOCKET_STREAM,0); - просто возвращает сокет
А само подключение к серверу
SysSockConnect(socketId,addressPointer,SIZEOF(addr ess));
Возвращает только BOOL(всегда false), INVALID_SOCKET как я понимаю вернет SysSockCreate, в случае если не сможет создать у себя сокет(это будет дополнительная проверка, это как
IF socketId=0 THEN). Вообщем, насколько я понял, на ПЛК100 поддержка сокетов реализована постолько-поскольку(простой реализации, вроде create socket, connect->result, getsost-> sost socket(connect)), возможно это из-за того что плк100 не имеет ос* и полную реализацию сокетов тяжело сделать. Теперь еще хотел спросить по плк304 и codesys3.5, видел проект (https://plccloud.pro/), они реализовали что-то уже более серьезное. Какая поддержка работы с сокетами там реализована? Более продвинутая? Подскажите, если кто-нибудь работал?

capzap
01.03.2013, 11:15
:) опять правы, плохо высказывать свое мнение имея под рукой только телефон. Я выкладывал видео как работает ТСР и не раз, не знаю что у Вас вызывает проблемы.
Что касается 304, то там действительно проще и переменная для ошибок входит в состав аргументов функций

osipov86
01.03.2013, 14:30
Я же не говорю что в плк100 сокеты не работают. Они работают. И даже связываются с TCP сервером и получают и отправляют ему данные(могу видео приложить). Просто есть одна проблема: SysSocketConnect даже при удачной связи с ТСР сервером все равно возвращает false, хотя дальше можно отправлять данные. Просто тут проверку установки связи с сервером подругому не знаю как сделать(примитивная логика должна быть при установке соединения возврат true, при неудачном false). Поэтому и вопрос был конкретный по syssocketconnect. Спасибо большое за инфу по 304, буду изучать.
Еще хотел спросить capzap, есть ли у вас проекты по удаленной диспетчеризации объектов? Писал в личку, но что-то вы не ответили(

capzap
01.03.2013, 14:49
там еще есть тип данных сокетадрес, возможно он может дать ответ по установлению соединения.
По удаленной на плк я не занимался еще, у меня для этого другой язык программирования

osipov86
01.03.2013, 15:07
socketaddress, содержит информацию по ip куда подключаться(sin_addr), порт(sin_port), и семейство адресации(sin_family, ip, ipx,IRDA,bluetooth- это из msdn). Так что, что-то полезное отсюда не взять.

alext1981
01.03.2013, 16:04
Может пригодится, вложил проект примера, по которому сделано видео пользователя capzap.

OlegH
02.03.2013, 12:28
У меня нет опыта в сокетах для ПЛК, но есть кое-какой опыт в сокетах вообще. И мне пришло в голову, что проблема возврата false может не быть такой банальной ошибкой, как кажется на первый взгляд. Функция SysSockConnect может быть реализована неблокирующей (т.е. она только иницирует начало установки соединения и сразу возвращается). Сам процесс установления соединения протяженный во времени и может длиться неопределенно долго. А блокировать работу задачи функция не в праве. Поэтому она возвращает false в расчете на то, что за итогом установки соединения пользователь библиотеки будет следить другими методами, когда и как ему будет это удобно.

osipov86
04.03.2013, 08:14
Соглашусь с вами, возможно это так и есть. Но тогда бы сделали какой-нить callback при завершении асинхронного соединения. Другого способа проверить успешность соединения я так и не нашел(((

Yegor
04.03.2013, 10:49
Не, мужики. Асинхронное добро выведено в SysLibSocketsAsync.lib и рогатыми ПЛК не поддерживается.

capzap
04.03.2013, 11:50
Соглашусь с вами, возможно это так и есть. Но тогда бы сделали какой-нить callback при завершении асинхронного соединения. Другого способа проверить успешность соединения я так и не нашел(((
Ну как бы соединение в плк требуется для диспетчеризации, а не игры с торрентов скачивать. Поэтому если уж послали запрос и нет ответа в течении таймаута значит соединение не установлено

osipov86
04.03.2013, 14:59
Ну как бы соединение в плк требуется для диспетчеризации, а не игры с торрентов скачивать.
Вас куда-то не туда понесло. Асинхронная и синхронная работа тут непричем.

capzap
04.03.2013, 15:14
Вас куда-то не туда понесло. Асинхронная и синхронная работа тут непричем.

По крайней мере я так контролирую установлена у меня связь или нет, если после первого же запроса приходит ошибка таймаута значит нет коннекта, закрываю сокет делаю паузу и снова пытаюсь соединится
А тонкости функций меня не сильно волнуют

Ильнур
06.09.2013, 15:19
Здравствуйте!!!Изучаю библиотеку SysLibSockets. Не могу понять одно.
Есть строка diSocket:=SysSockCreate(SOCKET_AF_INET, SOCKET_STREAM, 0) , которая должна возвращать номер сокета. Но почему то возвращает постоянно -1. Пробывал на другом ПЛК-все нормально отрабатывает.У пробывал кнопку сброс, вкл/выкл ПЛК. При отладке SysSockCreate(SOCKET_AF_INET, SOCKET_STREAM, 0) возвращает три знака вопроса. ПЛК 150. Куда копать????

Foregit
27.01.2014, 18:43
Ребят подскажите такое дело, надо связать старенькую машину под ДОСом с ПЛК, на компе есть поднятая прога, которая работает по IPX(с исходниками в которых можно поковыряться) , надо с ней завести разговор. Как под ПЛК запрограмировать работу по этому протоколу.
Если взять пример с диска про пинг, какие изменения надо сделать в открытии сокета?
Полазив по исходникам досовской проги нашел что при формировании заголовка IPX в поле PacketType устанавливается 4, в библиотеке SysLibSockets этому отвечает что?
Если (* AddressFamily *) то там 4 соответствует в описании
SOCKET_AF_PUP:INT:=4; (* pup protocols: e.g. BSP *)
есть там и IPX но почему то другой номер
SOCKET_AF_IPX:INT:=23; (* Novell Internet Protocol *)
Если это относится к секции (* Protocols *), то там нет цифры 4

Вобщем как правильно поднять IPX-сокет под ПЛК ( конкретно 110-60), ну и естественно поднимется ли он вообще?
Буду благодарен за любую подсказку.