Показано с 1 по 10 из 10

Тема: Проблема с UDP

  1. #1

    По умолчанию Проблема с UDP

    Проблема в следующем: С ПЛК отправляются 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 У-М.
    Хотелось бы устранить эти проблемы как можно скорее.
    Заранее спасибо.
    Последний раз редактировалось Andrey; 20.08.2007 в 08:07.

  2. #2

    По умолчанию

    Добрый день!
    1. Хотелось бы проект и лог снифера.
    2. Откройте сокет и переинициализируйте его только при ошибках.

  3. #3

    По умолчанию

    Привет Андрей

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

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

  4. #4

    По умолчанию

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

  5. #5

    По умолчанию

    Цитата Сообщение от Gans Посмотреть сообщение
    Привет Андрей

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

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

  6. #6

    По умолчанию

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

  7. #7

    По умолчанию

    Согласен 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; 21.08.2007 в 05:39.

  8. #8

    По умолчанию

    Когда ждать ответа?

  9. #9

    Smile

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

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

  10. #10

    По умолчанию

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

Ваши права

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