Пытаюсь передавать одним пакетом 32 кБ между Siemens CPU317-2 PN/DP и Овен ПЛК-200-2 (вместо Овен сейчас стандартный симулятор Codesys на ПК) через сокеты TCP.
На сименсе использую FB63-66 (TCON,TSEND,TRCV,TDISCON), в Codesys библиотеку NBS.TCP_xx.
Отправка пакета из симулятора (с ПК) на сименс проходит без проблем. Все 32кб полностью заливаются без ошибок.
Проблема с обратной отправкой из сименса в Codesys на ПК. Wireshark показывает, что сименс отправляет пакет 32кб полностью, но в симулятор приходит только часть. Похоже, что функция NBS.TCP_Read отрабатывает несколько раз, с каждым разом указатель на блок данных для записи обнуляется и полученный пакет записывается частями каждый раз с начала блока данных.
NBS.TCP_Read крутится в основном цикле, никаких задержек и условий вызова перед ним нет.
В брэндмауэре windows исключения для программ добавлены, порты открыты.
Ниже в коде лог Wireshark. 10.16 - ПК; 10.120 - ПЛК. ПЛК шлет пакет TCP с флагом PSH, указывающий, что данные не должны складываться в буфер, возможно это влияет на то, как NBS.TCP_Read определяет конец посылки.
Собственно вопрос: почему данные не принимаются одним куском? Что может на это влиять?
Код: Выделить всё
7953 12.321344 192.168.10.16 192.168.10.120 TCP 7354 20001 → 20002 [ACK] Seq=1 Ack=1 Win=64240 Len=7300
7957 12.326423 192.168.10.120 192.168.10.16 TCP 60 20002 → 20001 [ACK] Seq=1 Ack=7301 Win=8192 Len=0
7958 12.326436 192.168.10.16 192.168.10.120 TCP 7354 20001 → 20002 [ACK] Seq=7301 Ack=1 Win=64240 Len=7300
7959 12.332485 192.168.10.120 192.168.10.16 TCP 60 20002 → 20001 [ACK] Seq=1 Ack=14601 Win=8192 Len=0
7960 12.332514 192.168.10.16 192.168.10.120 TCP 7354 20001 → 20002 [ACK] Seq=14601 Ack=1 Win=64240 Len=7300
7963 12.337461 192.168.10.120 192.168.10.16 TCP 60 20002 → 20001 [ACK] Seq=1 Ack=21901 Win=2676 Len=0
7964 12.337476 192.168.10.16 192.168.10.120 TCP 1514 20001 → 20002 [ACK] Seq=21901 Ack=1 Win=64240 Len=1460
7967 12.341526 192.168.10.120 192.168.10.16 TCP 60 [TCP Window Update] 20002 → 20001 [ACK] Seq=1 Ack=21901 Win=8192 Len=0
7968 12.341567 192.168.10.16 192.168.10.120 TCP 5894 20001 → 20002 [ACK] Seq=23361 Ack=1 Win=64240 Len=5840
7969 12.344612 192.168.10.120 192.168.10.16 TCP 60 20002 → 20001 [ACK] Seq=1 Ack=24821 Win=6732 Len=0
7970 12.344669 192.168.10.16 192.168.10.120 TCP 1514 20001 → 20002 [ACK] Seq=29201 Ack=1 Win=64240 Len=1460
7971 12.349413 192.168.10.120 192.168.10.16 TCP 60 20002 → 20001 [ACK] Seq=1 Ack=30661 Win=8192 Len=0
7972 12.349451 192.168.10.16 192.168.10.120 TCP 2160 20001 → 20002 [PSH, ACK] Seq=30661 Ack=1 Win=64240 Len=2106
7973 12.350549 192.168.10.120 192.168.10.16 TCP 60 20002 → 20001 [ACK] Seq=1 Ack=32767 Win=6086 Len=0
7974 12.352771 192.168.10.120 192.168.10.16 TCP 1514 20002 → 20001 [PSH, ACK] Seq=1 Ack=32767 Win=8192 Len=1460
7975 12.353660 192.168.10.120 192.168.10.16 TCP 1514 20002 → 20001 [PSH, ACK] Seq=1461 Ack=32767 Win=8192 Len=1460
7976 12.353670 192.168.10.16 192.168.10.120 TCP 54 20001 → 20002 [ACK] Seq=32767 Ack=2921 Win=64240 Len=0
7978 12.354778 192.168.10.120 192.168.10.16 TCP 1514 20002 → 20001 [ACK] Seq=2921 Ack=32767 Win=8192 Len=1460
7979 12.355757 192.168.10.120 192.168.10.16 TCP 1514 20002 → 20001 [ACK] Seq=4381 Ack=32767 Win=8192 Len=1460
7980 12.355765 192.168.10.16 192.168.10.120 TCP 54 20001 → 20002 [ACK] Seq=32767 Ack=5841 Win=64240 Len=0
7981 12.356690 192.168.10.120 192.168.10.16 TCP 1514 20002 → 20001 [ACK] Seq=5841 Ack=32767 Win=8192 Len=1460
7982 12.358582 192.168.10.120 192.168.10.16 TCP 946 20002 → 20001 [ACK] Seq=7301 Ack=32767 Win=8192 Len=892
7983 12.358587 192.168.10.16 192.168.10.120 TCP 54 20001 → 20002 [ACK] Seq=32767 Ack=8193 Win=64240 Len=0
7984 12.358702 192.168.10.120 192.168.10.16 TCP 1514 20002 → 20001 [ACK] Seq=8193 Ack=32767 Win=8192 Len=1460
7985 12.359282 192.168.10.120 192.168.10.16 TCP 1514 20002 → 20001 [PSH, ACK] Seq=9653 Ack=32767 Win=8192 Len=1460
7986 12.359286 192.168.10.16 192.168.10.120 TCP 54 20001 → 20002 [ACK] Seq=32767 Ack=11113 Win=64240 Len=0
7987 12.361730 192.168.10.120 192.168.10.16 TCP 1514 20002 → 20001 [ACK] Seq=11113 Ack=32767 Win=8192 Len=1460
7988 12.361730 192.168.10.120 192.168.10.16 TCP 1514 20002 → 20001 [PSH, ACK] Seq=12573 Ack=32767 Win=8192 Len=1460
7989 12.361762 192.168.10.16 192.168.10.120 TCP 54 20001 → 20002 [ACK] Seq=32767 Ack=14033 Win=64240 Len=0
7990 12.363716 192.168.10.120 192.168.10.16 TCP 1514 20002 → 20001 [PSH, ACK] Seq=14033 Ack=32767 Win=8192 Len=1460
7993 12.367505 192.168.10.120 192.168.10.16 TCP 946 20002 → 20001 [ACK] Seq=15493 Ack=32767 Win=8192 Len=892
7994 12.367520 192.168.10.16 192.168.10.120 TCP 54 20001 → 20002 [ACK] Seq=32767 Ack=16385 Win=64240 Len=0
7995 12.367672 192.168.10.120 192.168.10.16 TCP 1514 20002 → 20001 [PSH, ACK] Seq=16385 Ack=32767 Win=8192 Len=1460
7996 12.368292 192.168.10.120 192.168.10.16 TCP 1514 20002 → 20001 [PSH, ACK] Seq=17845 Ack=32767 Win=8192 Len=1460
7997 12.368297 192.168.10.16 192.168.10.120 TCP 54 20001 → 20002 [ACK] Seq=32767 Ack=19305 Win=64240 Len=0
7998 12.368680 192.168.10.120 192.168.10.16 TCP 1514 20002 → 20001 [PSH, ACK] Seq=19305 Ack=32767 Win=8192 Len=1460
7999 12.369297 192.168.10.120 192.168.10.16 TCP 1514 20002 → 20001 [PSH, ACK] Seq=20765 Ack=32767 Win=8192 Len=1460
8000 12.369303 192.168.10.16 192.168.10.120 TCP 54 20001 → 20002 [ACK] Seq=32767 Ack=22225 Win=64240 Len=0
8003 12.372705 192.168.10.120 192.168.10.16 TCP 1514 20002 → 20001 [PSH, ACK] Seq=22225 Ack=32767 Win=8192 Len=1460
8004 12.375586 192.168.10.120 192.168.10.16 TCP 946 20002 → 20001 [ACK] Seq=23685 Ack=32767 Win=8192 Len=892
8005 12.375598 192.168.10.16 192.168.10.120 TCP 54 20001 → 20002 [ACK] Seq=32767 Ack=24577 Win=64240 Len=0
8006 12.376143 192.168.10.120 192.168.10.16 TCP 1514 20002 → 20001 [PSH, ACK] Seq=24577 Ack=32767 Win=8192 Len=1460
8007 12.376682 192.168.10.120 192.168.10.16 TCP 1514 20002 → 20001 [PSH, ACK] Seq=26037 Ack=32767 Win=8192 Len=1460
8008 12.376690 192.168.10.16 192.168.10.120 TCP 54 20001 → 20002 [ACK] Seq=32767 Ack=27497 Win=64240 Len=0
8009 12.376785 192.168.10.120 192.168.10.16 TCP 1514 20002 → 20001 [PSH, ACK] Seq=27497 Ack=32767 Win=8192 Len=1460
8010 12.377647 192.168.10.120 192.168.10.16 TCP 1514 20002 → 20001 [PSH, ACK] Seq=28957 Ack=32767 Win=8192 Len=1460
8011 12.377655 192.168.10.16 192.168.10.120 TCP 54 20001 → 20002 [ACK] Seq=32767 Ack=30417 Win=64240 Len=0
8013 12.380808 192.168.10.120 192.168.10.16 TCP 1514 20002 → 20001 [PSH, ACK] Seq=30417 Ack=32767 Win=8192 Len=1460
8031 12.422079 192.168.10.16 192.168.10.120 TCP 54 20001 → 20002 [ACK] Seq=32767 Ack=31877 Win=64240 Len=0
8032 12.422696 192.168.10.120 192.168.10.16 TCP 944 20002 → 20001 [PSH, ACK] Seq=31877 Ack=32767 Win=8192 Len=890
8063 12.468514 192.168.10.16 192.168.10.120 TCP 54 20001 → 20002 [ACK] Seq=32767 Ack=32767 Win=63350 Len=0
Дополнение:
По выходу NBS.TCP_Read.xDone записываю количество полученных байт и количество пакетов TCP. Каждый раз при отправке получаю 3-5 пакетов с разным количеством байт, последний соответствует размеру, который показывает Wireshark для последнего TCP пакета (например 890 как в логе), но это всё равно кусочек от общих 32 кб.
Ошибок NBS.TCP_Read.xErros за время обмена не возникает.