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

Тема: PLC 110-30 v2 & tcp ip

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию PLC 110-30 v2 & tcp ip

    Добрый день!

    Плк 110-220.30.К-М (м2) прошивка 0.3.76. MinCycleLength = 0(ms), в реальности, что то около 2ms.
    Задача, передавать данные по Ethernet как можно чаще, пакет около 70 байт (тестовый) планируется длиннее, но пока в нем всякие счетчики, счетчик отправленных пакетов, циклов ПЛК в котором идет передача, время итд... Отправка пакета происходит в каждом втором цикле ПЛК в среднем каждые 4мс.

    1. Открываем сокет: SysSockCreate( SOCKET_AF_INET, SOCKET_STREAM, SOCKET_IPPROTO_IP );
    2. Настраиваем: SysSockSetOption( m_aSockets[0], SOCKET_SOL, SOCK_NBIO, 0, 0 );
    3. Связываем:
    o_aSAddress[0].sin_family := SOCKET_AF_INET;
    o_aSAddress[0].sin_addr := SOCKET_INADDR_ANY;
    o_aSAddress[0].sin_port := SysSockHtons( i_pOptions^.wPort );
    SysSockBind( m_aSockets[0], ADR( o_aSAddress[0] ), SIZEOF( o_aSAddress[0] ) );
    4. Ждем коннекта SysSockListen... и коннектимся SysSockAccept все ок;
    5. Далее читаем SysSockRecv( m_aSockets[o_yCNow], i_pData, i_dnSize, 0 ), так как ничего не приходит переходим к передаче:
    SysSockSend( m_aSockets[o_yCNow], i_pData, i_dnSize, 0 ); Вообще передача выглядит так:

    (* при входе o_dnRes = 0 *)
    IF i_pDevice^.eIO = IO_S_REPLY THEN
    i_pSocket^.Write( i_pData := ADR( m_aBuffer[o_dnRes] ), i_dnSize := m_dnBufferCnt - o_dnRes, i_pExpect := i_pExpect );
    IF i_pSocket^.o_dnRes < 0 THEN (*здесь o_dnRes<0 только при срабатывании "таймаута"(500мс) иначе 0 или переданные байты*)
    i_pDevice^.yError := MB_TIME_OUT_ERROR;
    i_pDevice^.eIO := IO_S_LISTEN;
    o_bDone := TRUE;
    o_dnRes := 0;
    ELSE
    o_dnRes := o_dnRes + i_pSocket^.o_dnRes;
    IF o_dnRes = m_dnBufferCnt THEN
    i_pDevice^.eIO := IO_S_LISTEN;
    o_bDone := TRUE;
    o_dnRes := 0;
    END_IF
    END_IF
    END_IF

    Все передается в один вызов SysSockSend.
    Так вот, в течении 10 сек такой работы пакеты приходят не по порядку. то есть отправляли, например, 1й 2й 3й 4й, а приходят 1й 4й 2й 3й. Если передавать с задержкой хотя бы 20мс все приходит как положено. Есть подозрение, что данные в буфере SysSockSend перетираются.
    Прикладываю текстовый файл на стороне приема начинается с пакета 99758.
    Вложения Вложения

Ваши права

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