1) По поводу работы библиотеки.
Не нужно испытывать иллюзий. Стек TCP/IP в ПЛК очень ограниченный - это не виндовс и не линукс. Шаг влево-шаг вправо расстрел. Прыжок на месте провокация. Соответственно есть очень большие ограничения - один клиент - один сокет, числу открытых сокетов и т.д. Кривизна в библиотеке есть. В основном это связанно с тем что в новой версии поддержаны дополнительные фичи, а в старом заголовочном файле все было не совсем так.
2) OSCAT oscat network на Овеновских плк как после кодесис 2 , так и 3 заработала после допиливания напильником. Ничего особенного - но пришлось поработать. Библиотеку не могу дать - т.к. она часть проекта - я накопировал блоки в проект.
3) SocketAccept - не получится взять удаленный адрес клиент - ее можно вообще не использовать.
Если работать только с нужными IP используйте ...RecvFrom ...SendTo
4) Кусочек кода для клиента
CASE STATE_SEND OF
0: SOCK_OUT := SysSockCreate( SOCKET_AF_INET, SOCKET_STREAM, SOCKET_IPPROTO_TCP );
TCP_ADR_OUT.sin_family := SOCKET_AF_INET;
TCP_ADR_OUT.sin_port := port; TCP_ADR_OUT.sin_addr := server; (* 192.168.200.207 *)
PADDR_OUT := ADR( TCP_ADR_OUT );
OUT_TON( IN := FALSE, PT := T#50MS ); STATE_SEND := 1;
1: RES_OUT := SysSockConnect( SOCK_OUT, PADDR_OUT, SIZEOF( PADDR_OUT) ); OUT_TON( IN := TRUE, PT := T#2S ); (* ?????? ?? 20 ??? *)
IF OUT_TON.Q THEN
STATE_SEND := 2;
END_IF
5) Для сервера
Настойчиво рекомендую посмотреть повнимательнее пример Web сервера.
Последний раз редактировалось Малышев Олег; 29.05.2012 в 13:37.
Часто задаваемые вопросы по кодесис
1) Почему программа не работает - Следует выполнить "Онлайн ->Старт"
2) Где скачать CoDeSys, таргеты, прошивки, библиотеки - http://www.owen.ru/catalog/codesys_v3/opisanie
Может кому понадобицо. Вобщем, ТСР удалось поднять. SysSockListen и SysSockConnect завершившись корректно возвращают ноль. То есть код нужно поправить приблизительно так:
для сервера:
IF BOOL_TO_INT( SysSockListen( m_dnSocket, 1 ) ) = 0 THEN
(* законектились *);
END_IF;
для клиента
IF BOOL_TO_INT( SysSockConnect( m_dnSocket, ADR( m_SAddress ), SIZEOF( m_SAddress ) ) ) = 0 THEN
(* законектились *);
END_IF;
Соответственно, вызывать их нужно по таймеру. пока не будет конекта, а не один раз... ))
Причем сокет должен быть настроен для блокирующего режима. где то так:
m_dwVal := 1;
SysSockSetOption( m_dnSocket, SOCKET_IPPROTO_TCP, SOCKET_TCP_NODELAY, ADR( m_dwVal ), SIZEOF( m_dwVal ) );
Последний раз редактировалось lazy; 07.06.2012 в 18:04.