PDA

Просмотр полной версии : ПЛК для обмена 700 словами по Ethernet UDP



Maestro777
21.12.2016, 08:25
Добрый день,
Есть ли у ОВЕН, ПЛК способный принимать такое количество слов в одном пакете 700-800 слов. Протокол общения у сенсора Ethernet UDP. Сенсор - это лазерный сканер 2D профиля. Других способов с ним коммуницировать нет.
Возможно получить пакет Z-координат 397 и отдельно X-координат 397. Если это сильно упростит задачу по единовременному приему количества слов в одном фрейме.
ВО вложении мануал к лазерному сканеру. Раздел 10.

P/s/ Ранее работал с ПЛК Delta, но обнаружил в Мануале не возможность передачи более 97 слов в одном письме. Тех Поддержка тоже сказала что не подойдет он. Известно об успешном случае увязывания сенсора с Сименс 300 серии.

capzap
21.12.2016, 08:45
здесь (http://www.owen.ru/forum/showthread.php?t=23997&p=222431&viewfull=1#post222431) есть наброски по UDP, сам проект стоит на реальном производстве, только в Вашем случае переменную byRecv нужно изменить на

byRecv : ARRAY[0..1593] OF BYTE;

попробуте и расскажите получилось ли принять, обработку массива можно не делать чтоб не мешала

Maestro777
21.12.2016, 09:13
ПЛК еще не приобретен. Поэтому интересуюсь какая модель из линейки ОВЕН подойдет для такого объема данных (принимала за доли секунды и в состоянии была обработать). За наброски по алгоритму спасибо большое.

capzap
21.12.2016, 09:35
плк100 дешевле всех, плк110-М02 более мощный процессор и ОС, кажется это может повлиять на стабильность соединения, плк304 коммуникационный контроллер на линуксе

Maestro777
21.12.2016, 10:18
Не могу никак открыть Ваш пример (набросок по udp). Я думал ОВЕН в кодесис программируется, кодесис его не открывает. *.exp
В данном случае экономить не планируется. ПЛК 110-М02 думаю лучше всего из линейки. Но не могу найти в руководствах предельное значение слов в одном пакете передачи. Вот этот пример где стоит там сколько Вы передаете? это же число Вы исправили под мою задачу уже.

capzap
21.12.2016, 10:23
это экспортный файл, Вам нужно в меню, проект->импорт
в моем примере передается мало, про udp таким вопросом не озадачивался, а по ТСР беспроблемно было около 490 байт вроде бы

Maestro777
21.12.2016, 10:34
Импортом тоже не получилось, этот формат не видит. Если все форматы сделать и попытаться открыть, выдает ошибку. Программа вопрос будущего. Мне бы хотелось быть более уверенным по поводу передачи такого количества информации. Поэтому хотелось бы услышать от кого-либо отзыв положительный по такому эксперименту. Может быть сталкивался кто-либо.
Насколько я понимаю TCP отличается в основе от UDP большей надежностью (потерялся пакет, запросит еще раз... и т.п.) Поэтому думаю есть надежда на успех.

capzap
21.12.2016, 10:39
а у меня просто не получается придумать как отправить такой объем по UDP, чтоб проверить плк

Владимир Ситников
21.12.2016, 10:46
а у меня просто не получается придумать как отправить такой объем по UDP, чтоб проверить плк

Так много же утилит для проверки UDP.
Например, JMeter + https://jmeter-plugins.org/wiki/UDPRequest/
Или такое: https://packetsender.com/

capzap
21.12.2016, 11:55
Или такое: https://packetsender.com/

спасибо, проверил. Как оказалось фрагментацию не поддерживает, поэтому удалось передать только 1472 байта полезной информации, согласно https://ru.wikipedia.org/wiki/UDP (помимо 8 байт на UDP-заголовок требуется ещё 20 на IP-заголовок) не больше 1500байт. Возможно если постараться, то можно что нибудь и придумать, но врядли

Владимир Ситников
21.12.2016, 12:04
спасибо, проверил. Как оказалось фрагментацию не поддерживает, поэтому удалось передать только 1472 байта полезной информации, согласно https://ru.wikipedia.org/wiki/UDP (помимо 8 байт на UDP-заголовок требуется ещё 20 на IP-заголовок) не больше 1500байт. Возможно если постараться, то можно что нибудь и придумать, но врядли

Т.е. сам ПЛК не поддерживает фрагментацию? Это, кстати, какой ПЛК был?

capzap
21.12.2016, 12:16
это plc-100l

Maestro777
21.12.2016, 15:35
Спасибо. Я думаю этого (1472 байта) достаточно для передачи скажем только Z-координат размером 376 слов= 2*376 байт =752 байта.
Поэтому приобрету новый ПЛК 110 (М02) и попробую. Просто одно дело возится с оборудованием когда не уверен что оно способно на это, а так Ваш эксперимент внушил доверие.

Maestro777
28.01.2017, 19:44
Добрый день, коллеги!
Я дождался ПЛК 110 М02 и попробовал познакомиться с сокетами. Задача для начала такая: обменяться какими-либо сообщениями между ПЛК и ПК по Ethernet UDP. На стороне ПК использовать программу для приема-передачи UDP данных - Hercules Terminal.
Что не получается. Во-первых, не отправляется массив данных в Hercules Terminal так и обратно в ПЛК из него. В режиме мониторинг, я замечаю зависание на шаге step1 (SysSockAccept). Может он вовсе не нужен для UDP ?
Во-вторых, пробовал без Accept, хотел увидеть изменение numberofbytes, но всегда -1. Прошу подскажите где ошибаюсь, думаю есть грубые ошибки
В-третьих, Listen всегда Faulse, вне зависимости есть ли посылы с Hercules Terminal или нет.
Код программы
CASE step OF
0:
hSocket := SysSockCreate(SOCKET_AF_INET,SOCKET_DGRAM,SOCKET_I PPROTO_UDP);
resultIoctl:=SysSockIoctl(hSocket,Socket_FIONBIO, ADR(mode));
sa.sin_family:=SOCKET_AF_INET;
sa.sin_addr:=SOCKET_INADDR_ANY;
sa.sin_port:=SysSockHtons(port);
result := SysSockBind(hSocket,ADR(sa), SIZEOF(sa));
result_L:=SysSockListen(hSocket, maxConnections);
step:=1;

1:
tries:=tries+1;
hClientSocket:=SysSockAccept(hSocket,ADR(sa),SIZEO F(sa));
IF hClientSocket<>16#FFFFFFFF
THEN
step:=2;
END_IF

IF tries>10 THEN
step:=5;
tries:=0;
END_IF

2:
tries:=tries+1;
numberOfBytes := SysSockSendTo (hClientSocket,ADR(MessageToPC),SIZEOF(MessageToPC ),0, ADR(sa),SIZEOF(sa));
IF numberOfBytes<>0
THEN step:=3;
END_IF

IF tries>10 THEN
step:=5;
tries:=0;
END_IF

3:
tries:=tries+1;
numberOfBytes := SysSockRecvFrom (hClientSocket,ADR(MEssageFromPC),1600,0,ADR(sa),S IZEOF(sa));
IF numberofbytes<>0 THEN step:=4;
END_IF

IF tries>10 THEN
step:=5;
tries:=0;
END_IF

4:
SysSockClose(hClientSocket);
IF stop THEN
step:=5;
ELSE
step:=1;
END_IF

5:
SysSockClose(hSocket);
step:=0;
tries:=0;

END_CASE

Maestro777
29.01.2017, 11:11
спасибо, проверил. Как оказалось фрагментацию не поддерживает, поэтому удалось передать только 1472 байта полезной информации, согласно https://ru.wikipedia.org/wiki/UDP (помимо 8 байт на UDP-заголовок требуется ещё 20 на IP-заголовок) не больше 1500байт. Возможно если постараться, то можно что нибудь и придумать, но врядли
Попробовал Ваш пример. Скачал, запустил. КДС поругался, что не та целевая платформа. Зашел в Ресурсы целевую платформу заменил на свой ПЛК. Но компиляцию не проходит - пишет что POU такие есть в бибилиотеке NetVarUDP. Ну есть и есть .Что ему не нравится? Как это обойти

Maestro777
29.01.2017, 11:21
Итак, попробовал все сначала. Создал проект с таргетом на ПЛК 110-24.30.K-M02. Во вкладке сетевая функциональность прописал ручкам UDP. Сразу в менеджере библиотек добавил SysLibSockets, NETVARUDP, SYSLIBCALLBACK. Сбрасываю ПЛК (рычаг на 6 секунд в положение сброс) мало ли сокетов на создавалось не может теперь открыть новый. Пишу программу (ниже). Компилирую, Загружаю, Запускаю. После меняю start на true и тут происхоидт зависание и связь теряется через несколько секунд. Связь с ПЛК установлена через RS-232 Debug - переходник USB (COM6). К слову таймер запускается отрабатывает нормально. Ну и простые алгоритмы OR AND и т.п. к потере связи не приводят.
HandleSocket как был -1 так и остается, хотя это может сязана с потерей связи ПЛК-ПК, последняя инфо от ПЛК полученная. Подскажите пожалуйста в чем могу ошибаться.

IF start THEN
IF HandleSocket<0 THEN
HandleSocket:=SysSockCreate(SOCKET_AF_INET, SOCKET_DGRAM, SOCKET_IPPROTO_UDP);
sa.sin_family:=SOCKET_AF_INET;
sa.sin_addr:=SOCKET_INADDR_ANY;
sa.sin_port:=SysSockHtons(iPort);

SysSockBind(HandleSocket, ADR(sa), SIZEOF(sa));

ELSE
SysSockRecvFrom(HandleSocket, ADR(MessageFromPC), 1600, 0, ADR(sa), SIZEOF(sa));
END_IF
ELSE
IF HandleSocket<>SOCKET_INVALID THEN
SysSockClose(HandleSocket);
HandleSocket:=SOCKET_INVALID;
MessageFromPC:=Zero;
END_IF
END_IF

tik(IN:=tik.IN,PT:=T#20s);
IF tik.Q THEN
tik(IN:=FALSE);
IF HandleSocket <> SOCKET_INVALID THEN
SysSockClose(HandleSocket);
HandleSocket := SOCKET_INVALID;
END_IF;
END_IF;

Maestro777
29.01.2017, 11:47
Убрал строчку
SysSockRecvFrom(HandleSocket, ADR(MessageFromPC), 1600, 0, ADR(sa), SIZEOF(sa));
сокет стал принимать значения отличные от (-1).
Почему получение данных приводит в ступор ПЛК и как результат потеря связи с КДС

Maestro777
29.01.2017, 17:57
После команды SysSockRecvFrom, ПЛК ожидает данных и видимо поэтому время цикла улетает в небо и происходит обрыв связи. Но если после пуска программы (полный код ниже) сразу из HerculesTerminal (например) послать данные, то ПЛК принимает данные и время цикла остается в разумных пределах и работа, и связь с ПЛК продолжается. Чтобы это избежать применил команду SysSockIoctl (неблокирующие сокеты, третий параметр 1 INT). Но это не помогло, если посылку с ПК не послать, то ПЛК блокируется и не реагирует на команды через 10 секунды КДС сообащет о потере связи. Как это обойти? И как отправлять данные командой SysSockSendTo? Пробовал отправлять ею заполненный массив на HerculesTerminal ничего не приходит. Почему NumberOfBytes не меняет свое значение, всегда (-1), хотя Recv прошел успешно

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

Maestro777
30.01.2017, 15:26
модераторы перенесите мою тему в более подходящий раздел. так как изначально речь шла об оборудование, подборе. теперь о программирование сокетов.

capzap
30.01.2017, 15:49
если посылку с ПК не послать, то ПЛК блокируется и не реагирует на команды через 10 секунды КДС сообащет о потере связи. Как это обойти?
непойму, разве так сложно придумать таймер, который будет перезапускать сервер, если обмена нет более сколькито секунд

Maestro777
30.01.2017, 19:39
Спасибо за совет, я придумал такой таймер (ниже). Но таймер как и цикл плк останавливается после Recv и ждет данных . Как только Recv закрыват (* *), то таймер каждые 2 секунды как задумывалось закрывает Сокет. Это приводит к первому условию ветвления HandleSOCKET<0 и создате новый. Но при появлении Recv таймер не работает как хотелось бы. Я такое поведение понял бы, если не SysSockIoctl, который должне был перевести в неблокирующее состояние сокеты и цикл шел как обычно.
IF start THEN
IF HandleSocket<0 THEN
HandleSocket:=SysSockCreate(SOCKET_AF_INET, SOCKET_DGRAM, 0);
result:= SysSockIoctl (HandleSocket, SOCKET_FIONBIO, ADR(mode));
sa.sin_family:=SOCKET_AF_INET;
sa.sin_addr:=SOCKET_INADDR_ANY;
sa.sin_port:=SysSockHtons(1300);

result_bind:=SysSockBind(HandleSocket, ADR(sa), SIZEOF(sa)) ;
ELSE
tik(IN:=tik.IN,PT:=T#2s);
Tik.in:=TRUE;
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
SysSockClose(HandleSocket);
HandleSocket:=SOCKET_INVALID;
MessageFromPC:=Zero;
END_IF
END_IF

IF tik.Q THEN
SysSockClose(HandleSocket);
tik(IN:=FALSE);
HandleSocket := SOCKET_INVALID;
END_IF;

capzap
30.01.2017, 21:24
а у меня срабатывает, правда пример по ТСР, http://www.owen.ru/forum/showthread.php?t=14520&p=234742#post234742

Maestro777
30.01.2017, 21:58
Попробовал отправку с помощью библиотеки NETVARUDP
ПЛК не зависает, но на ПК (Hercules) ничего не приходит. Порт и IP адрес те, проверил неоднократно.
IF start THEN
IF HandleSocket<0 THEN
HandleSocket:=UdpOpenSendSocket(iPort);
ELSE
tik(IN:=tik.IN,PT:=T#2s);
Tik.in:=TRUE;

numberofbytes:=UdpSendData(HANDLESocket, iPort, stDestIPAddress, ADR(bySend), SIZEOF(bySend));

END_IF
ELSE
IF HandleSocket<>SOCKET_INVALID THEN
SysSockClose(HandleSocket);
HandleSocket:=SOCKET_INVALID;
MessageFromPC:=Zero;
END_IF
END_IF

tik(IN:=tik.IN,PT:=T#2s);
IF tik.Q THEN
SysSockClose(HandleSocket);
tik(IN:=FALSE);
HandleSocket := SOCKET_INVALID;
END_IF;

capzap
30.01.2017, 22:39
NETVARUDP если и упоминается UDP то только как протокол передачи, ни какого отношения к взаимодействию не контроллеров она не имеет. То что Вы тут постоянно выкладываете, какой то не понятный недоделанный, лишенный смысла код. Примеров как организовать я выложил предостаточно, лучше разберитесь с ними, чем задавать вопросы по собственным кускам программы

Maestro777
30.01.2017, 23:23
ytnvarudp это что?
capzap, помогите разобраться. Я выкладываю код смысл которого (я так думаю) после старта создать сокет, Отправить данные ( в последнем варианте). Старт исчез тогда сокет закрылся. Вот и весь смысл который я вкладываю, для начала делать что-то попроще надо.
Касаемо, того что Вы выкладываете. Большое спасибо, прежде всего. Но, почему я не могу ими воспользоваться напрямую, когда меняю целевую платформу скомпилировать уже не получаете. КДС ссылается что эти блоки есть в билиотеке NetVarUDP. Ладно, пытаюсь воспроизвести в своем проекте. Вникаю в Ваш алгоритм, по смыслу близкий (проверка наличия, сокета, создание, заполнение SA и т.п.). Но результат получается вот такой. Если данные не отправляю, ПЛК выходит в потерю связи. Но если отправить с ПК на ПЛК, то он принимает их и отлично дальше реагирует на взаимодействие с ним. И start обнулить получается и запустить его заново, принять новый пакет. Но если его не отправлю, 10 секунд где-то и потеря связи КДС ПЛК.

capzap
31.01.2017, 07:47
Еще раз повторяю, NETVARUDP НЕ НУЖНА, выкиньте её из проекта. О том что связь рвется, читаем следующий пост после данной мной ссылки
Ваше сделать по проще, оборачивается сделать не правильно

Maestro777
31.01.2017, 08:53
Ваш пример udp_test.pro Я его открываю, компилирую все нормально. Меняю целевую платформу на ПЛК 110 M02 (свою). Библиотеки NETvarUDP еще нет в менеджере. Компилирую и тут выпадает следующее:
29036
Захожу в менеджере, Там эта присловутая библиотека появилась. Удаляю её. Нажимаю компиляцию и снова эти ошибки и в библиотеках появляется NetVarUDP. Но, повторюсь, до установки целевой платформы компиляция успешна проходит, этой библиотеки не появляется.

Я Ваши примеры, безусловно, читаю и стараюсь вникнуть в каждую строчку. Поэтому в принципе и мне удалось создать проект, который получает посылку от ПК. НО! Как пишет Филоненко Владислав
"Разрыв соединения при отсутствии по нему обмена - штатный функционал любой реализации сокетов. В ПЛК, т.к. это всё же промавтоматика, а не офисный компьютер, таймаут обмена сильно сокращён (с часов до секунд).
Просто надо что-нибудь посылать - и разрывов не будет."
Я бы с радостью таймером закрывал и поднимал сокет каждые 2 секунды. Но, таймер не работает при наличии строк Recv. Прошу Вас посмотреть мой проект. Я его создал без библиотеке NETVARUDP, без FUNкций. На Вашем ПЛК с моим проектом таймер работает?

Филоненко Владислав
31.01.2017, 10:32
Ещё есть нюанс с разворотом адресов и номера порта.
пример правильной работы с UDP смотрим в NetVarUDP.lib

capzap
31.01.2017, 10:40
у меня сейчас проверять не начем
но вот же код count := TcpReceiveData(Client.diSocket, ADR(BUF_RCV[0]), SIZEOF(BUF_RCV));
если count равна -1 нет соединения, если равно нулю соединение есть и нет данных, если больше нуля данные есть можно обрабатывать
вывод если соединение есть а данных нет длительное время то ОС разорвет соединение и программе надо где то в это же время или чуть раньше перезапустить сервер

Maestro777
31.01.2017, 13:20
Ещё есть нюанс с разворотом адресов и номера порта.
пример правильной работы с UDP смотрим в NetVarUDP.lib
Владислав, прошу прощенья, где в структуре этой библиотеки пример? в pdf файле к этой библиотеке только про сетевые переменные рассказано. 29043


но вот же код count := TcpReceiveData(Client.diSocket, ADR(BUF_RCV[0]), SIZEOF(BUF_RCV));
если count равна -1 нет соединения, если равно нулю соединение есть и нет данных, если больше нуля данные есть можно обрабатывать
вывод если соединение есть а данных нет длительное время то ОС разорвет соединение и программе надо где то в это же время или чуть раньше перезапустить сервер

Да, конечно, я изучал Ваш пример. Спасибо за его предоставление. И этот эпизод мне тоже был понятен. Но ни таймеры, ни ветвления.. да ничего, после Recv не работает. А посылочку послал и заработала связь КДС-ПЛК и никакого выхода в ошибку типа связь потеряна через несколько секунд нету. Проверяю массив приема данных и там те данные что отправлял с ПК.

Филоненко Владислав
31.01.2017, 13:39
UdpOpenSend(Receive)Socket наверное?

Maestro777
31.01.2017, 13:56
29044
Я нажимаю на нее, и показывает его только блоком. Может быть возможно как-то включить детализацию кода этой функции?
Но на англоязычном форуме КДС, я находил примеры. И там эта функция была расписана так:

diSocket:=SysSockCreate(SOCKET_AF_INET, SOCKET_DGRAM, 0); (* открыли сокет типа Datagram для UDP по умолчанию 0*)
sa.sin_family:=SOCKET_AF_INET;
sa.sin_addr:=SOCKET_INADDR_ANY; (* с любого адреса получать данные *)
sa.sin_port:=SysSockHtons(iPort);
bResult:=SysSockBind(diSocket, ADR(sa), SIZEOF(sa)); (*завязались *)
IF bResult = FALSE THEN (*если неудачно то diSocket:= -1 ну или SOCKET_INVALID*)
diSocket:=SOCKET_INVALID;
END_IF
UdpOpenReceiveSocket:=diSocket;

Я так и создаю сокет для UDP

Филоненко Владислав
31.01.2017, 15:48
Так саму библиотеку загрузите как проект :)

Maestro777
01.02.2017, 14:49
Ещё есть нюанс с разворотом адресов и номера порта.
пример правильной работы с UDP смотрим в NetVarUDP.lib
Хорошо, будем последовательными. Отправка из библиотеки NetVarUdp. Выглядит следующим кодом (без всяких подфункций, все вытащим в один код монолитный)
Положительно то, что на ПК (терминал) пришло сообщение, наконец-то. Но это если отключить GetIPAddress и вещать BROADCAST на всех кто слышит. Если stIPAddress я объявлял STRING:='10.0.6.11' так было в примере одной библиотеки иностранной, ну и в NetVar написано мол - stIPAddress:STRING;(* IP-address or name *) . Но Тогда он не передает сообщение.
Так как Вы писали "нюанс с разворотом IP адресов" , прошу пояснить чуть чуть подробнее. Как задать здесь правильно IP?
И почему в этой библиотеке SysOption был отключен (* *)? В прочем работает как с ней так и без нее.


IF start THEN
IF HandleSocket<0 THEN
HandleSocket:=SysSockCreate(SOCKET_AF_INET, SOCKET_DGRAM, 0);
bOption:=TRUE;
(*SysSockSetOption(diSocket, SOCKET_SOL, SOCKET_SO_BROADCAST, ADR(bOption), SIZEOF(bOption));*)
sa.sin_family:=SOCKET_AF_INET;
sa.sin_addr:=SOCKET_INADDR_ANY;
sa.sin_port:=SysSockHtons(iPort);
bResult:=SysSockBind(HandleSocket, ADR(sa), SIZEOF(sa));
IF bResult = FALSE THEN
diSocket:=SOCKET_INVALID;
END_IF

ELSE
sa.sin_family:=SOCKET_AF_INET;
(*IF stIPAddress <> '' THEN sa.sin_addr:=GetIPAddress(stIPAddress);
ELSE*)
sa.sin_addr:=SOCKET_INADDR_BROADCAST;
(*END_IF*)
sa.sin_port:=SysSockHtons(iPort);
numberofbyte:=SysSockSendTo(HandleSocket, ADR(MessageToPC), SIZEOF(MessageToPC), 0, ADR(sa), SIZEOF(sa));

IF numberOfByte>0 AND marker=0 THEN
marker := numberofByte;
SysSockClose(HandleSocket);
END_IF
IF numberOfByte>0 THEN
marker := numberofByte;
SysSockClose(HandleSocket);
END_IF
END_IF

ELSE
IF HandleSocket<>SOCKET_INVALID THEN
SysSockClose(HandleSocket);
HandleSocket:=SOCKET_INVALID;
MessageFromPC:=Zero;
END_IF
END_IF

Филоненко Владислав
01.02.2017, 15:16
1, IP задаём как DWORD
2. SOCKET_SO_BROADCAST - он и так включён по умолчанию вот и работает
3. GetIPAddress - это что за функция?
Мы пользуемся SysSockGetHostByName(), куда можно подавать как IP в символьном виде "10.2.1.1", так и имя "my_own_pupkin.server.net", если оно доступно через DNS

Возвращает 1-й IP из ответа DNS сервера или 0 если не получен ответ.
P.S. IP DNS серверов должны быть прописаны в local_adress.dat (ну или включён режим DHCP), иначе не работает :)

Maestro777
01.02.2017, 16:28
Правильно ли я понял ?
1. IPadr: DWORD:=16#A0006B; (*10.0.6.11*)
2. Как Вы научили открыл NetVarUDP_lib_V23 и там в FUN UdpSendData был этот GetIPaddress.
diIPAddress := SysSockInetAddr(stIPAddress);
IF (stIPAddress = '255.255.255.255') THEN
(*Avoid name-resolution on our default broadcast address.*)
GetIPAddress:=diIPAddress;
RETURN ;
END_IF
IF diIPAddress = SOCKET_INADDR_NONE THEN
diIPAddress := SysSockGetHostByName(ADR(stIPAddress));
END_IF
GetIPAddress:=diIPAddress; Такой код
3. sa.sin_addr:=SysSockGetHostByName(IPadr);
символьный вид это так? sa.sin_addr:=SysSockGetHostByName(10.0.6.11); но это не компилируется.

Филоненко Владислав
01.02.2017, 17:44
GetIPaddress - это внутренняя функция библиотеки. Ишак не мой :)
Символьное - это "10.0.6.11"

Maestro777
01.02.2017, 18:39
Я, прошу прощенья, за глупые вопросы, но так не компилируется
sa.sin_addr:=SysSockGetHostByName("10.0.6.11");

Ошибка 4268: PLC_PRG (16): Необходимо выражение

Я так понял, IP DNS серверов должны быть прописаны в local_adress.dat только в случае указания в стиле имени "my_own_pupkin.server.net"

p.s. из любопытства фраза "Ишак не мой" из какого фильма, что-то знакомое а вспомнить не могу. :-)

Филоненко Владислав
02.02.2017, 13:42
ошибся, должно быть 'string'

P.S. Ходжа Нассредин бессмертен, однако.

Maestro777
02.02.2017, 18:03
удалось прописать string'ом через указатель
sa.sin_addr:=SysSockGetHostByName(ADR(stIPAddress) ); но на терминал ничего не приходит.
меняю на
sa.sin_addr:=SOCKET_INADDR_BROADCAST; посылка приходит на терминал (при прочих равных условиях).

Владислав, спасибо Вам большое за науку. Но что-то не получается. Если есть идеи, скажите, я их попытаюсь реализовать. В CoDeSys я всего неделю, и видимо зашел не с подножья, а с вершины горы. Поэтому такой результат.

Maestro777
05.06.2017, 10:58
Добрый день,
Хотел все-таки показать что за машину я собирал.
https://www.youtube.com/watch?v=Mc_eodCKQ5k

Ну хоть сенсорная панель от ОВЕН. Вообще, она мне нравится. Чего не могу сказать о ПЛК 110 М02. ИМХО