PDA

Просмотр полной версии : работа с сокетами по UDP помогите.



евгений_125
23.06.2020, 02:56
доброго времени суток всем, пытаюсь наладить связь с неким прибором с ПЛК 100 v2.17 по UDP. и вот в чем проблемы:

создаю сокет
IF hClientSocket <>16 THEN
stClientSettings.sin_family := SOCKET_AF_INET; (*тип сокета*)
stClientSettings.sin_port := wPort; (*порт севера*)
stClientSettings.sin_addr := dwIPaddr;
hClientSocket := SysSockCreate(SOCKET_AF_INET, SOCKET_DGRAM, SOCKET_IPPROTO_UDP);
END_IF

hClientSocket возвращает число 16 - сокет создался.

отправляю массив
diSendBytes := SysSockSendTo(hClientSocket, ADR(send_1), 10, c_diFlags, ADR(stClientSettings), SIZEOF(stClientSettings) );

потом через небольшую задержку читаю
diRecvBytes := SysSockRecvFrom(hClientSocket, ADR(sReadFromServer),100, c_diFlags, ADR(stClientSettings), SIZEOF(stClientSettings) );
сокет не закрываю, так как нужен для диалога программа зациклена отправили, мониторю сниффером 49772
приходит один пакет и все...
если из кода убираю функцию приема то запросы отправляются как положено....
подскажите, что не так? почему я немогу организовать периодическую отправку ?

евгений_125
23.06.2020, 04:40
иеще вопрос: на скрине контроллер в роли клиента с адресом 10,119,129,200 создает у себя сокет с портом 10001 и обращается к серверу с адресом 10,119,129,17 портом 5001,
как сделать что бы на контроллере обмен происходил всегда через порт 5001?

евгений_125
23.06.2020, 07:40
я прошу прощения, https://owen.ru/forum/showthread.php...lib#post311580 а можно в кратце описать что этот пример делает?.....

capzap
23.06.2020, 07:46
пользуйте упомянутую библиотеку и примеры с ней и решайте свою задачу

евгений_125
23.06.2020, 09:58
спасибо за библиотеку, я думаю это то что мне нужно, но появилась проблема - контроллер вместо нужного мне адреса отправляет посылки на адрес 255,255,255,255.... подскажите в какую сторону копать?
PROGRAM PLC_PRG
VAR
diSendSocket : DINT;
iPort : INT:=5001;
stDestIPAddress : STRING := '10.119.129.10';
diRecvSocket: DINT;
bySend : ARRAY[0..9] OF BYTE := 255,255,01,03,63,254,00,00,40,36 ;
bSent: BOOL;
bActive: BOOL;
END_VAR

IF bActive THEN
IF diSendSocket = 0 THEN
diSendSocket := UdpOpenSendSocket(iPort);
END_IF

IF diSendSocket > 0 AND bSent THEN
bSent := FALSE;
UdpSendData(diSendSocket, iPort, stDestIPAddress, ADR(bySend), SIZEOF(bySend));
END_IF
END_IF

евгений_125
23.06.2020, 10:01
49777

снимок экрана

capzap
23.06.2020, 10:17
видимо из-за этих строк
IF stIPAddress <> '' THEN
sa.sin_addr:=GetIPAddress(stIPAddress);
ELSE
sa.sin_addr:=SOCKET_INADDR_BROADCAST;
END_IFлучше адрес сделать массивом, типа stIPAddress : ARRAY [0..3] OF BYTE := 192,168,0,8;
а sa.sin_addr переделать на sa.sin_addr := SHL( SHL( SHL(
BYTE_TO_DWORD(stIPAddress[0] ), 8 )
OR BYTE_TO_DWORD( stIPAddress[1] ), 8 )
OR BYTE_TO_DWORD( stIPAddress[2] ), 8 )
OR BYTE_TO_DWORD( stIPAddress[3] );

евгений_125
25.06.2020, 03:12
что то ничего не получается.... в кратце: есть прибот (ВКТ-7) есть у него Ethernet и нестандартный протокол. описание читал. отсылаю с терминала запрос, ответ приходит. посылаю с контроллера ничего не приходит...
вот код:

iPort : INT:=5001;
bySend : ARRAY[0..9] OF BYTE := 255,255,01,03,63,254,00,00,40,46 ;
byRecv : ARRAY[0..100] OF BYTE;
IP_1: ARRAY [0..3] OF BYTE:= 10,119,129,154;


IF bSent THEN
IF diSendSocket_1 = 0 THEN
diSendSocket_1:= UdpOpenSendSocket(iPort);
END_IF
IF diSendSocket_1 > 0 THEN
UdpSendData(diSendSocket_1, iPort, IP_1, ADR(bySend), SIZEOF(bySend));
END_IF
bSent:=FALSE;
END_IF



IF diRecvSocket = 0 THEN
diRecvSocket := UdpOpenReceiveSocket(iPort);
END_IF
IF diRecvSocket > 0 THEN
Reply := UdpReceiveData(diRecvSocket, iPort, ADR(byRecv), SIZEOF(byRecv));
END_IF

помогите кто нибудь!!!!