CODESYS форум

Добро пожаловать на официальный форум CODESYS
Deutsche Version English version russian version 
Текущее время: Вс июн 25, 2017 11:23 am

Часовой пояс: UTC+01:00




Начать новую тему  Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: Ethernet UDP. ПЛК ОВЕН 110 M02+ Leuze LPS 36.
СообщениеДобавлено: Пн янв 30, 2017 9:14 am 
Не в сети

Зарегистрирован: Вс янв 29, 2017 11:00 am
Сообщения: 3
Добрый день,
Конечная цель взаимодействие ПЛК и лазерного сканера по Ethernet UDP (ПЛК ОВЕН 110 M02+ Leuze LPS 36). Но для начала научится бы обмениваться сообщениями с ПК. Так между ПК и сканером посылки нормально уходят приходят, синтаксис в HerculesTerminal отработан.
Я так понимаю реализацию в CDS осуществляется с помощью библиотек SysLibSockets.
Вот код (ниже), который я написал для ПЛК. Вопросы, мои выводы следующие:
После команды SysSockRecvFrom, ПЛК ожидает данных и видимо поэтому время цикла улетает в "небо" и происходит обрыв связи. Но если после пуска программы сразу (до 10 секунд) из HerculesTerminal ( ПК ) послать данные, то ПЛК принимает данные и время цикла остается в разумных пределах и работа, и связь с ПЛК продолжается, и данные в массиве. Чтобы это избежать бесконечного ожидания приема - применил команду SysSockIoctl (неблокирующие сокеты, третий параметр 1 INT). Но это не помогло, если посылку с ПК не послать, то ПЛК блокируется и не реагирует на команды через 10 секунды КДС сообщает о потере связи.
Как это обойти блокировку ожидания? И как отправлять данные командой SysSockSendTo? Пробовал отправлять ею (установив sa.sin_addr:=GetIPAddress(stIPAddress), объявлен stIPAddress:string:='10.0.6.11') заполненный массив на HerculesTerminal ничего не приходит. А ведь это инициация обмена со сканером. Сначала ПЛК будет отправлять команду, и только потом получать от сканера ответ с данными.
Смотрел примеры на англоязычном форуме, и понял что для UDP команды Listen, Accept смысла не имеют. Так ли это?

IF start THEN
IF HandleSocket<0 THEN (*нет сокета, тогда создаем*)
HandleSocket:=SysSockCreate(SOCKET_AF_INET, SOCKET_DGRAM, 0); (*создали сокет DGRAM для которого третий параметр 0 означает UDP *)
sa.sin_family:=SOCKET_AF_INET; (* заполняем структуру sa типа SOCKADDRESS*)
sa.sin_addr:=SOCKET_INADDR_ANY;
sa.sin_port:=SysSockHtons(1300);

result_bind:=SysSockBind(HandleSocket, ADR(sa), SIZEOF(sa)) ; (*связываем сокет*)
ELSE
numberOfBytes := SysSockRecvFrom (HandleSocket,ADR(MessageFromPC),1600,0,ADR(sa),SI ZEOF(sa));

IF numberofbytes<>-1 THEN SysSockClose(HandleSocket);
END_IF

END_IF

ELSE
IF HandleSocket<>SOCKET_INVALID THEN (* сокет закрываем, если START переведен в FALSE*)
SysSockClose(HandleSocket);
HandleSocket:=SOCKET_INVALID;
MessageFromPC:=Zero;
END_IF
END_IF


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC+01:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB