Добрый день!
Плк 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.