i have set target to 3s CodeSys PLCWinNT V2.4, As i said before i dont have any real hardware device. i just want to simulate it in CodeSys tool.
i have set target to 3s CodeSys PLCWinNT V2.4, As i said before i dont have any real hardware device. i just want to simulate it in CodeSys tool.
Доброго времени суток!
Подскажите пожалуйста, такая ситуация.
Организовал связь по UDP симулятора CoDeSys SP PLCWinNT v2.4 с коммутатором EtherWAN EX87604 с помощью библиотеки SysLibSockets.lib. Посылка уходит, пакет приходит, все нормально. Заливаю проект на ПЛК ОВЕН 110-30М. Пытаюсь связать ПЛК с коммутатором EtherWAN EX87604. Посылка уходит, ответ приходит нулевой:
(diNumByte_Recv := SysSockRecvFrom( diSocket_SendRecv, ADR(byRecv[0]), SIZEOF(byRecv), 0, ADR(sa_SendRecv), SIZEOF(sa_SendRecv)); (*тут diNumByte_Recv = 0*)).
Заметил такую особенность, в симуляторе функция SysSockHtons(wPort) смещает биты влево на 8 разрядов, а в ПЛК ОВЕН110-30M данная функция оставляет переменную wPort без изменения.
Что может быть не так?
Заранее спасибо!
Делая что-то не правильно, вы никогда не потеряете полученный опыт
Вопрос решился.
Походу конвертирование IP адреса на ПЛК ОВЕН 110-30М происходит в другой последовательности нежели на симуляторе PLC WinNT v2.4. В итоге из ПЛК посылка уходила на другой айпишник (вместо 192.168.220.18 уходила на 18.220.168.192), а в симуляторе посылка шла на айпи 192.168.220.18. Код использовался один и тот же.
+ шлюз на ПЛК прописал айпи коммутатора (на всяк случай), теперь все работает![]()
Делая что-то не правильно, вы никогда не потеряете полученный опыт
и тут же возникает вопрос =)
как можно узнать на какой айпишник отправляет ПЛК пакет. WireShark я так понял цепляет пакеты отправленные только на его сокет. А что делать если пакеты летят на неизвестный сокет, какими-то средствами это вычислить можно? Куда улетел пакет? =))))
Делая что-то не правильно, вы никогда не потеряете полученный опыт
да, прошу прощения не правильно выразился =)
"чтобы отследить другие пакеты нужна другая ОС и другие средства." - не подскажите что за такие средства и ОС? Линукс?![]()
Делая что-то не правильно, вы никогда не потеряете полученный опыт
Эммм... а как расшифровывается BE, LE?
Подскажите пожалуйста, как в данном случае можно указать адрес (.sin_addr) в правильном формате с помощью htonl() ?
Вот отрывок из рабочего кода на данный момент в ПЛК ОВЕН110-30М:
IF diSocket = SOCKET_INVALID THEN
diSocket := SysSockCreate(SOCKET_AF_INET, SOCKET_DGRAM, SOCKET_IPPROTO_UDP);
IF diSocket <> SOCKET_INVALID THEN
sa_SendRecv.sin_addr := SHL( SHL( SHL(
BYTE_TO_DWORD(strIPaddress[0] ), 8 )
OR BYTE_TO_DWORD( strIPaddress[1] ), 8 )
OR BYTE_TO_DWORD( strIPaddress[2] ), 8 )
OR BYTE_TO_DWORD( strIPaddress[3] );
sa_SendRecv.sin_family := SOCKET_AF_INET;
sa_SendRecv.sin_port := SysSockHtons(wPort);
END_IF
END_IF
Последний раз редактировалось vooodooo22; 28.01.2016 в 13:32.
Делая что-то не правильно, вы никогда не потеряете полученный опыт
BE vs LE это как битва тупо и остроконечников.
Порядок байт, на Интел BE (Big Endian), на ARM LE (little endian).
Соответственно
sa_SendRecv.sin_addr := SysSockHtonl(IP_addr);
И ведь 1/2 Вы сделали, поставив sa_SendRecv.sin_port := SysSockHtons(wPort); ?!?
Тролль-наседка, добрый, нежный и ласковый