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

Тема: Подвисание ПЛК110 М02 SysSockConnect

  1. #1
    Пользователь
    Регистрация
    12.07.2007
    Адрес
    Воронеж
    Сообщений
    882

    По умолчанию Подвисание ПЛК110 М02 SysSockConnect

    Добрый день!
    Проблема такая:
    ПЛК110-30 М02
    0.3.68
    ПЛК отправляет данные на внешний сервер.
    Если ПЛК подключен к роутеру, а на роутере отсутсвует интернет, получаем подвисание на команде
    SysSockConnect
    При этом отключаются все выхода и приостанавливается программа.

    При отсутствии подключения Ethernet (отключаем кабель из роутера) - все проходит нормально и SysSockConnect возвращает 0.

    Код отправки на сервер (На старом ПЛК все работает без проблем)
    CASE step OF 0:
    nbRecv:=0;
    nbSend:=0;
    hSocket:=SysSockCreate(SOCKET_AF_INET, SOCKET_STREAM, 0);
    IF hSocket <> SOCKET_INVALID THEN
    sa.sin_family:=SOCKET_AF_INET;
    dwIP:=SHL( SHL( SHL(
    BYTE_TO_DWORD(arrIp[0] ), 8 )
    OR BYTE_TO_DWORD( arrIp[1] ), 8 )
    OR BYTE_TO_DWORD( arrIp[2] ), 8 )
    OR BYTE_TO_DWORD( arrIp[3] );
    sa.sin_addr:=SysSockHtonl(dwIP);
    sa.sin_port:=SysSockHtons(port);
    step:=1;
    tries:=0;
    ELSE
    step:=4;
    END_IF


    1:
    tries:=tries+1;
    result:=BOOL_TO_DINT(SysSockConnect(hSocket, ADR(sa), SIZEOF(sa)));
    IF result<0 THEN
    step:=4;
    tries:=0;
    ELSE
    step:=2;
    END_IF


    IF tries >20 THEN
    triesGL:=triesGL+1;
    step:=4;
    END_IF


    2:
    tries:=tries+1;
    nbSend:= SysSockSend (hSocket, ADR(arrPostData), sizeRead+LEN(strPost) ,0);
    IF nbSend>0 THEN
    step:=3;
    tries:=0;
    ELSE
    step:=4;
    END_IF
    IF tries >10 THEN
    triesGL:=triesGL+1;
    step:=4;
    END_IF


    3:
    tries:=tries+1;
    nbRecv:= SysSockRecv (hSocket, ADR(strRecv), 1024, 0);
    IF nbRecv>0 THEN
    (*Проверка ответа*)
    ELSIF nbRecv=-1 THEN
    step:=4;
    END_IF


    IF tries >10 THEN
    triesGL:=triesGL+1;
    step:=4;
    END_IF


    4:
    tries:=0;
    SysSockClose (hSocket);
    step:=0;
    bGoGet:=FALSE;
    END_CASE

  2. #2
    Пользователь
    Регистрация
    30.11.2012
    Адрес
    40RUS
    Сообщений
    316

    По умолчанию

    Добавьте в step 0 после создания сокета перевод в неблокирующий режим:
    SysSockSetOption(hSocket, SOCKET_SOL, SOCK_NBIO, 0, 0);
    где SOCK_NBIO: WORD:=16#1014;

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

  3. #3

    По умолчанию

    я SysSockConnect и SysSockListen вызываю не в каждом цикле ибо да, они изрядно подтормаживают ПЛК.
    например так то так:

    m_y := m_y + 1;
    IF ( m_y MOD 50 ) = 0 THEN
    (* каждый пиЙсятый цикл *)
    END_IF

  4. #4
    Пользователь
    Регистрация
    12.07.2007
    Адрес
    Воронеж
    Сообщений
    882

    По умолчанию

    Спасибо за советы, действительно помогло.
    Правда следом притянуло новые проблему.
    SysSockSend не отправляет больше 1460 байт (в блокирующем режиме я отправлял и 11000 байт разом, сейчас уменьшил пакет, данные отправляются).
    SysSockRecv периодически возвращает -1 (Почитал соседние темы, добавил таймаут, буду пробовать с ним).

    Будем наблюдать.

Похожие темы

  1. Ответов: 15
    Последнее сообщение: 13.10.2016, 16:27
  2. Ответов: 5
    Последнее сообщение: 09.08.2016, 13:30
  3. Ответов: 20
    Последнее сообщение: 18.03.2014, 14:14
  4. Ответов: 8
    Последнее сообщение: 12.06.2013, 19:32
  5. Подвисание Web-визуализации
    от Солнечный заяц в разделе СПК2хх
    Ответов: 23
    Последнее сообщение: 15.09.2012, 08:56

Ваши права

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