-
Вложений: 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.
-
Насколько помню tcp\ip не гарантирует ни длину соблюдать ни очередность, главное доставить, а как - дело второе.
-
как то так: Транспортный уровень стека TCP/IP (уровень 3) обеспечивает передачу данных между прикладными процессами. Транспортный уровень включает два протокола TCP и UDP. Протокол управления передачей TCP (Transmission Control Protocol) является надёжным протоколом с установлением соединения, позволяющим управлять потоком, т.е. без ошибок доставлять байтовый поток с одной машины на любую другую машину составной сети. Для того чтобы обеспечить надёжную доставку данных, протокол TCP предусматривает установление логического соединения. Это позволяет ему нумеровать пакеты, подтверждать их прием квитанциями, в случае потери организовывать повторные передачи, распознавать и уничтожать дубликаты, доставлять прикладному уровню в том порядке, в котором они были отправлены.
-
Ну тогда вот)
1.2.2 TCP
Если IP-пакеты содержат инкапсулированные пакеты TCP, программы IP передадут их вверх уровню TCP. TCP последовательно нумерует все пакеты и выполняет исправление ошибок, и реализует таким образом виртуальные соединения между хостами. Пакеты TCP содержат последовательные номера и подтверждения о приеме пакетов, поэтому пакеты, принятые не в порядке передачи, могут быть переупорядочены , а испорченные пакеты повторно посланы.
-
Нет, вообще я всегда думал что обязаны придти хотябы в том порядке что были отправлены, иначе всё усложняется в разы, то что дробиться могут как угодно это понятно. Но где-то тоже сталкивался с такой проблемой через 3g сеть. Часто было что они слипались по 2-3 штуки и бывало id 4 приходил раньше id 3 (сам помечал).
-
и что значит эта фраза (#5)? ровно вот что:
TCP делит информацию, которую надо переслать, на несколько частей и нумерует каждую часть, чтобы позже восстановить порядок. Чтобы пересылать эту нумерацию вместе с данными, он обкладывает каждый кусочек информации своей обложкой — TCP-конвертом, который содержит соответствующую информацию.
Получатель по получении распаковывает IP-конверты и видит TCP-конверты, распаковывает и их и помещает данные в последовательность частей в соответствующее место. Если чего-то недостает, он требует переслать этот кусочек снова. В конце концов, информация собирается в нужном порядке и полностью восстанавливается. )
(#6)да, пакеты могут приходить склеенными (или разорванными), но порядок не отменяецо )
-
ок. правильно SOCKET_IPPROTO_TCP? щя попробую )
-
была ведь уже тема, где с помощью wireshark искали проблемы в М02
-
SOCKET_IPPROTO_TCP не помогает по ходу (
-
Вложений: 2
У меня с modbus tcp тоже проблем нет, правда обмен 15-30 мс. А вот тут, все что с задержкой меньше 40 мс... пакеты начинают приходить в разнобой.
Вроде делал по образу и подобию... Я проект выложу, может не лень кому глянуть будет. В действии Default нужно менять r_ServerOpt.tTimeOut - сейчас 40ms;
Получать пакеты и сохранять в файл можно программой Terminal.