Просмотр полной версии : Пустые входящие пакеты по UDP
Hi
Создали модбас сервер на ПЛК 100 через GPRS соединение по UDP.
Возникла проблема. Принимаем запросы длинной 12байт (истинная длина запроса), но в приемном буфере одни нули.
Используем функцию SysSockRecvFrom(). вопрос как победить, куда копать, может кто уже победил.????
победителей то много, а где вложение, телепатия на этом форуме не приветствуется
Извиняемся. Проект тестовый, много барахла. 19614
при выполнении кода чему равен Client.diSocket? и diSocket?
Nikosoff
20.08.2015, 15:51
при выполнении кода чему равен Client.diSocket? и diSocket?
Но у нас в проекте нет переменных Client, но SysSockBind возвращает TRUE и сокет = 16.
Этим же сокетом отсылаю тестовые данные после SysSockRecvFrom, отсылает нормально.
На PC приходит udp пакет.
ЗдОрово! а это откуда? :)
IF Client.diSocket = -1 THEN
Client := TcpServerWaitForConnect(diSocket,100);
END_IF
IF Client.diSocket <> -1 THEN
TcpReceiveData(Client.diSocket, ADR(byRecv), SIZEOF(byRecv), 1000);
TcpSendData(Client.diSocket, ADR(bySend), SIZEOF(bySend), 1000);
END_IF
IF bCloseClient THEN
bCloseClient := FALSE;
SysSockClose(diSocket:=Client.diSocket);
Client.diSocket := -1;
END_IF
кста SysSockRecvFrom в проектие не нашел )
PS: дошло, не тот PRG смотрю )
не помню по какой причине но я пишу ADR(R3_BUF[0])
Nikosoff
21.08.2015, 08:53
не помню по какой причине но я пишу ADR(R3_BUF[0])
Пробовал и этот вариант, то же самое происходит. Перед вызовом SysSockRecvFrom прописывал в буфер "мусор".
Происходит очищение буфера на количество байт возвращенных функцией SysSockRecvFrom.
а как прокомментируете эти две строчки
bytes_received := SysSockRecvFrom(sock, ADR(R3_BUF), 36, 0, ADR(cln_adr), SIZEOF(cln_adr));
и если bytes_received больше нуля внутри
mbas_inPLC(S_BUF:= S_BUF, R2_BUF:=R2_BUF , DATA:= DATA, ERROR=> ERROR);
Nikosoff
21.08.2015, 09:16
Извините , не понял что именно прокоментировать. Если Вы о разных буферах приема SysSockRecvFrom(sock, ADR(R3_BUF).... и передачи этого буфера в mbas_inPLC(S_BUF:= S_BUF, R2_BUF:=R2_BUF ... то это след эксперимента.
Я смотрю приёмный буфер R3_BUF в отладчике. mbas_inPLC сейчас не использует приёмный буфер.
а в структуре cln_adr после приема что находится? ее кста часом заполнять не надо?
Извините , не понял что именно прокоментировать. Если Вы о разных буферах приема SysSockRecvFrom(sock, ADR(R3_BUF).... и передачи этого буфера в mbas_inPLC(S_BUF:= S_BUF, R2_BUF:=R2_BUF ... то это след эксперимента.
Я смотрю приёмный буфер R3_BUF в отладчике. mbas_inPLC сейчас не использует приёмный буфер.
тогда создайте новый проект, напишите только проблемную часть и выкладывайте здесь если не получится ни чего принять, а то в этой каше у всех получается только отвлекаться на неиспользуемые объекты
ЗЫ еще можно попробовать что то из моего http://www.owen.ru/forum/showthread.php?t=14315&p=102734&viewfull=1#post102734
Nikosoff
21.08.2015, 10:15
Счас нет компьютера с codesys и проектом точных имён структуры не скажу, но там по приёму вроде всё правильно: порт и адрес с которого прибыл пакет. Но вот тип соединения (первый член структуры) если не ошибаюсь равен 0. Поэтому перед вызовом SysSockRecvFrom прописываю cln_ad.family.
Nikosoff
21.08.2015, 11:00
capzap и lazy спасибо за помощь. После выходных создам новый проект.
Nikosoff
25.08.2015, 09:37
capzap и lazy спасибо за помощь. После выходных создам новый проект.
День добрый всем! И опять про баранов. Создал два проекта. Первый очищенный свой проект и второй с использованием бибки от capzap.
К сожалению результат нулевой. То есть функция SysSockRecvFrom возвращает количество принятых байт, в моём случае 12 а приёмный буфер пуст в обоих проектах.
Уже не знаю куда копать.
значит прокладка или мастер виноват, соедините напрямую кабелем и проверте
Nikosoff
25.08.2015, 12:38
Похоже мастер с прокладкой не приделах. Напрямую всё работает. Из проекта в конфигурации удален Universal Network Module вместе с модемом и PPP драйвером.Кривая реализация
Universal Network Module ? Кто нибудь сталкивался с проблемами при использовании именно в связке Universal Network Module вместе с модемом и PPP по UDP. Именно при использовании UDP транспорта, по TCP всё работает.
раз напрямую всё работает, значит прокладка: модемы, опсос и т.п.
Nikosoff
25.08.2015, 13:02
Уважаемый capzap можно поподробней про т.п. :). Модем и опсос думаю исключены так как со стороны плк пакеты проходят к PC. Прикрутить к модему на плк снифер и посмотреть ppp фреймы?
я ни разу не подключал модем через конфигуратор и не пробовал gprs, тут мало чем помогу. А вот по поводу что с плк доходят пакеты на ПК, какие именно, тоже UDP?
Nikosoff
25.08.2015, 13:20
Да именно UDP. После приёма пустого пакета использую тот же сокет и отправляю на PC:
cln_adr.sin_family := SOCKET_AF_INET;
bytes_received := SysSockRecvFrom(sock, ADR(R2_BUF[0]), 36, 0, ADR(cln_adr), SIZEOF(cln_adr));
IF bytes_received > 0 THEN
S_BUF.SIZE := 0;
R2_BUF.SIZE := DINT_TO_UINT(bytes_received);
mbas_inPLC(S_BUF:= S_BUF, R2_BUF:=R2_BUF , DATA:= DATA, ERROR=> ERROR);
bytes_sent := SysSockSendTo(sock, ADR(S_BUF.BUFFER), S_BUF.SIZE, 0, ADR(cln_adr), SIZEOF(cln_adr));
.....
mbas_inPLC заглушка заполняющая S_BUF поскольку R2_BUF пуст.
Приходит пакет.
ну незнаю, это же не ТСР чтоб один и тот же сокет использовать, если Вы в плк создали клиента, он как сервер не должен работать
Nikosoff
25.08.2015, 15:58
А как быть с ICMP_TEST_PING.pro с сайта овен. Там один сокет и для приёма и для передачи UDP. Или UdpOpenReceiveSocket в TcpUdpLib.lib где создается слушающий UDP сокет?
В принципе то проект рабочий по ethernet, и частично (только передача) по модему с GPRS. Ксати создал второй отдельный сокет для передачи. Та жа песня, но:
если с одним сокетом отправка происходила с одного порта (502), то с двумя сокетами, с порта 1 с последуюющим увеличением на 1. По моему это не есть хорошо.
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot