Страница 2 из 5 ПерваяПервая 1234 ... ПоследняяПоследняя
Показано с 11 по 20 из 41

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

  1. #11

    По умолчанию

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

  2. #12
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,243

    По умолчанию

    это plc-100l
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  3. #13

    По умолчанию

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

  4. #14

    По умолчанию

    Добрый день, коллеги!
    Я дождался ПЛК 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

  5. #15

    По умолчанию

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

  6. #16

    По умолчанию

    Итак, попробовал все сначала. Создал проект с таргетом на ПЛК 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;

  7. #17

    По умолчанию

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

  8. #18

    По умолчанию

    После команды 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; 29.01.2017 в 19:07.

  9. #19

    По умолчанию

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

  10. #20
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,243

    По умолчанию

    Цитата Сообщение от Maestro777 Посмотреть сообщение
    если посылку с ПК не послать, то ПЛК блокируется и не реагирует на команды через 10 секунды КДС сообащет о потере связи. Как это обойти?
    непойму, разве так сложно придумать таймер, который будет перезапускать сервер, если обмена нет более сколькито секунд
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

Страница 2 из 5 ПерваяПервая 1234 ... ПоследняяПоследняя

Похожие темы

  1. Преобразователи 232-Ethernet, 485-Ethernet
    от and909 в разделе Разработки
    Ответов: 23
    Последнее сообщение: 13.04.2023, 00:21
  2. Настройка обмена с МСД 200
    от Евгений Гераськин в разделе Сетевые технологии
    Ответов: 6
    Последнее сообщение: 22.12.2016, 17:01
  3. Скорость обмена ИП-320
    от desperadoes в разделе Панели оператора (HMI)
    Ответов: 21
    Последнее сообщение: 15.04.2013, 10:52
  4. Возможность обмена ПКП
    от o_nik в разделе Подбор Оборудования
    Ответов: 1
    Последнее сообщение: 20.08.2009, 09:45
  5. Время обмена
    от Трефилов в разделе ПЛК1хх
    Ответов: 9
    Последнее сообщение: 20.07.2009, 07:43

Ваши права

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