PDA

Просмотр полной версии : Проблема с UDP



Andrey
20.08.2007, 07:10
Проблема в следующем: С ПЛК отправляются UDP сообщения на сервер Syslog. Код примерно такой

diSocket: DINT;
SockAddr: SOCKADDRESS;
res: DINT;
err: BOOL;
buf: STRING(255);

SockAddr.sin_addr:=((10*256+0)*256+6)*256+11;
SockAddr.sin_port:=514;
SockAddr.sin_family:=SOCKET_AF_INET;

buf:='Некоторое сообщение сформированное используя CONCAT()';
diSocket:=SysSockCreate(SOCKET_AF_INET, SOCKET_DGRAM, SOCKET_IPPROTO_UDP);
res:=SysSockSendTo(diSocket,ADR(buf),LEN(buf),SOCK ET_MSG_OOB,ADR(SockAddr),SIZEOF(SockAddr));
err:=SysSockClose(diSocket);

В результате замечено две проблемы.
Проблема №1
Если между пакетами пауза превышает примерно 2 минуты и при этом больше нет ни какого обмена по TCP с ПЛК включая CodeSys (logout) то пакеты начинают терятся, тоесть они не вылетают из ПЛК и соответственно не прилетают на ПК, проверялось с помощью снифера Ethereal. Если в этот момент запустить ping ПЛК с ПК то все нормально.

Проблема №2
Иногда отправляются неправильные пакеты, тоесть содержащие некоректные данные, например

отправляется
"Некоторое сообщение"

а на ПК приходит два пакета.
1 пакет "Конец сообщения"
1 пакет "Конец сообщения Середина сообщения" - а начало перетирается концом сообщения.

Причем чем интенсивней обмен тем больше таких ошибок.

Во всех случаях функции SysSockCreate,SysSockSendTo,SysSockClose никаких ошибок не возвращают и говорят что все нормально и данные переданы. Версии прошивки, таргета и CodeSys самые последние с сайта, ПЛК-150 У-М.
Хотелось бы устранить эти проблемы как можно скорее.
Заранее спасибо.

Филоненко Владислав
20.08.2007, 08:40
Добрый день!
1. Хотелось бы проект и лог снифера.
2. Откройте сокет и переинициализируйте его только при ошибках.

Gans
20.08.2007, 08:42
Привет Андрей

У меня аналогичные проблемы но это всё разрешимо:
1. по первой проблеме просто шлите пакеты чаще чем 2 минуты.
2. по второй проблеме контролируйте длину пакета + контрольная сумма (если сеть плохая).

P. S. Тоже очень очень очень жду решения этих проблем

Andrey
20.08.2007, 13:57
Добрый день!
1. Хотелось бы проект и лог снифера.
2. Откройте сокет и переинициализируйте его только при ошибках.
Проект полностью отдать не могу, а тестовый и лог снифера пришлю завтра, хотя на мой взгляд привиденного текста достаточно.
чтоб увидеть первую проблему достаточно кидать пакет раз в 2-3 мин.
чтоб увидеть первую проблему достаточно кидать 2-3 пакета в сек, ну и для большей надежности формировать строку используя операции со строками типа CONCAT.

Andrey
20.08.2007, 14:01
Привет Андрей

У меня аналогичные проблемы но это всё разрешимо:
1. по первой проблеме просто шлите пакеты чаще чем 2 минуты.
2. по второй проблеме контролируйте длину пакета + контрольная сумма (если сеть плохая).

P. S. Тоже очень очень очень жду решения этих проблем

1 проблему решаю примерно также, просто кидаю раз в минуту левый пакет, и в сислоге его отфильтровываю.
а 2 проблему так просто решить нельзя так как для этого нужна обратная связь с ПЛК, тоесть нужно кидать ответ с ПК -> ПЛК. А на ПК стоит syslogd и естественно этого нельзя сделать.

Филоненко Владислав
20.08.2007, 15:00
Вообще-то UDP - протокол с не гарантированной доставкой. Поэтому либо пользуйтесь TCP, либо как-то контролируйте качество пакета (СRC/размер) или обеспечивайте избыточность.
Жду лог и проект.

Andrey
21.08.2007, 05:36
Согласен UDP протокол не гарантированной доставки, и возможны потери в сетях где работаю >2 устройств, или линия длинная и ограничена полоса пропускания. Но в данном случае пакеты теряются и искажаются даже в том случае когда ПЛК подключен непосредственно к ПК и им никто не мешает. Так что списывать ошибки на протокол в данном случае нельзя, тут налицо ошибки ПО контроллера. К томуже в самом пакете UDP есть контрольные суммы как заголовка пакета так и тела, значит содержимое пакета было искажено до отправки.
Как и обещал выкладываю проект и протоколы обмена в подтверждение моих слов. Архивы SFX если сменить расширение на *.exe
В архиве содержатся логи с сервера SysLogd и пртокол Ethereal(http://www.ethereal.com/) во внутреннем формате(смотреть намного удобнее) и текстовом.
bag-1 v-1 демонстрирует потери пакетов (пакеты кидаются 1 раз в 2 мин) хотя ARP запросы посылаются. причем хорошо видно что после пинга UDP пакеты приходят.
bag-1 v2 тоже самое но одновременно кидается 4 пакета, и видно что доходит 4-ый пакет иногда 3 и 4.
bag-2 демонстрирует искажение содержимого пакета (пакеты кидаются 1 раз в 1 сек) причем из протокола ethereal видно что контрольные суммы правильные.

Andrey
23.08.2007, 14:17
Когда ждать ответа?

Gans
23.08.2007, 14:31
Когда ждать ответа?

Как народ сделает так на сайте сразу и выложат:). Лучше скажи, логи ведешь в Linux или где? Мне очень интересен опыт применения операционных систем не Windows для диспетчеризации! А то я реально не знаю с чего начать, а все таки придется.

P. S. В Linuxe кроме прослушивания музыки и просмотра видео ничего не делал :-(но регулярно :) подумываю реализовать диспетчеризацию на Linuxe)

Andrey
24.08.2007, 09:48
Делаю в Windows но в Линуксе получилосьбы лучше, для него есть замечательный rsyslogd который может работать по TCP. С самим ПЛК работать из Linux можно теоретически через WEB. Пример Web сервера где то на форуме встречался.