это plc-100l
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран
Спасибо. Я думаю этого (1472 байта) достаточно для передачи скажем только Z-координат размером 376 слов= 2*376 байт =752 байта.
Поэтому приобрету новый ПЛК 110 (М02) и попробую. Просто одно дело возится с оборудованием когда не уверен что оно способно на это, а так Ваш эксперимент внушил доверие.
Добрый день, коллеги!
Я дождался ПЛК 110 М02 и попробовал познакомиться с сокетами. Задача для начала такая: обменяться какими-либо сообщениями между ПЛК и ПК по Ethernet UDP. На стороне ПК использовать программу для приема-передачи UDP данных - Hercules Terminal.
Что не получается. Во-первых, не отправляется массив данных в Hercules Terminal так и обратно в ПЛК из него. В режиме мониторинг, я замечаю зависание на шаге step1 (SysSockAccept). Может он вовсе не нужен для UDP ?
Во-вторых, пробовал без Accept, хотел увидеть изменение numberofbytes, но всегда -1. Прошу подскажите где ошибаюсь, думаю есть грубые ошибки
В-третьих, Listen всегда Faulse, вне зависимости есть ли посылы с Hercules Terminal или нет.
Код программы
CASE step OF
0:
hSocket := SysSockCreate(SOCKET_AF_INET,SOCKET_DGRAM,SOCKET_I PPROTO_UDP);
resultIoctl:=SysSockIoctl(hSocket,Socket_FIONBIO, ADR(mode));
sa.sin_family:=SOCKET_AF_INET;
sa.sin_addr:=SOCKET_INADDR_ANY;
sa.sin_port:=SysSockHtons(port);
result := SysSockBind(hSocket,ADR(sa), SIZEOF(sa));
result_L:=SysSockListen(hSocket, maxConnections);
step:=1;
1:
tries:=tries+1;
hClientSocket:=SysSockAccept(hSocket,ADR(sa),SIZEO F(sa));
IF hClientSocket<>16#FFFFFFFF
THEN
step:=2;
END_IF
IF tries>10 THEN
step:=5;
tries:=0;
END_IF
2:
tries:=tries+1;
numberOfBytes := SysSockSendTo (hClientSocket,ADR(MessageToPC),SIZEOF(MessageToPC ),0, ADR(sa),SIZEOF(sa));
IF numberOfBytes<>0
THEN step:=3;
END_IF
IF tries>10 THEN
step:=5;
tries:=0;
END_IF
3:
tries:=tries+1;
numberOfBytes := SysSockRecvFrom (hClientSocket,ADR(MEssageFromPC),1600,0,ADR(sa),S IZEOF(sa));
IF numberofbytes<>0 THEN step:=4;
END_IF
IF tries>10 THEN
step:=5;
tries:=0;
END_IF
4:
SysSockClose(hClientSocket);
IF stop THEN
step:=5;
ELSE
step:=1;
END_IF
5:
SysSockClose(hSocket);
step:=0;
tries:=0;
END_CASE
Итак, попробовал все сначала. Создал проект с таргетом на ПЛК 110-24.30.K-M02. Во вкладке сетевая функциональность прописал ручкам UDP. Сразу в менеджере библиотек добавил SysLibSockets, NETVARUDP, SYSLIBCALLBACK. Сбрасываю ПЛК (рычаг на 6 секунд в положение сброс) мало ли сокетов на создавалось не может теперь открыть новый. Пишу программу (ниже). Компилирую, Загружаю, Запускаю. После меняю start на true и тут происхоидт зависание и связь теряется через несколько секунд. Связь с ПЛК установлена через RS-232 Debug - переходник USB (COM6). К слову таймер запускается отрабатывает нормально. Ну и простые алгоритмы OR AND и т.п. к потере связи не приводят.
HandleSocket как был -1 так и остается, хотя это может сязана с потерей связи ПЛК-ПК, последняя инфо от ПЛК полученная. Подскажите пожалуйста в чем могу ошибаться.
IF start THEN
IF HandleSocket<0 THEN
HandleSocket:=SysSockCreate(SOCKET_AF_INET, SOCKET_DGRAM, SOCKET_IPPROTO_UDP);
sa.sin_family:=SOCKET_AF_INET;
sa.sin_addr:=SOCKET_INADDR_ANY;
sa.sin_port:=SysSockHtons(iPort);
SysSockBind(HandleSocket, ADR(sa), SIZEOF(sa));
ELSE
SysSockRecvFrom(HandleSocket, ADR(MessageFromPC), 1600, 0, ADR(sa), SIZEOF(sa));
END_IF
ELSE
IF HandleSocket<>SOCKET_INVALID THEN
SysSockClose(HandleSocket);
HandleSocket:=SOCKET_INVALID;
MessageFromPC:=Zero;
END_IF
END_IF
tik(IN:=tik.IN,PT:=T#20s);
IF tik.Q THEN
tik(IN:=FALSE);
IF HandleSocket <> SOCKET_INVALID THEN
SysSockClose(HandleSocket);
HandleSocket := SOCKET_INVALID;
END_IF;
END_IF;
Убрал строчку
SysSockRecvFrom(HandleSocket, ADR(MessageFromPC), 1600, 0, ADR(sa), SIZEOF(sa));
сокет стал принимать значения отличные от (-1).
Почему получение данных приводит в ступор ПЛК и как результат потеря связи с КДС
После команды SysSockRecvFrom, ПЛК ожидает данных и видимо поэтому время цикла улетает в небо и происходит обрыв связи. Но если после пуска программы (полный код ниже) сразу из HerculesTerminal (например) послать данные, то ПЛК принимает данные и время цикла остается в разумных пределах и работа, и связь с ПЛК продолжается. Чтобы это избежать применил команду SysSockIoctl (неблокирующие сокеты, третий параметр 1 INT). Но это не помогло, если посылку с ПК не послать, то ПЛК блокируется и не реагирует на команды через 10 секунды КДС сообащет о потере связи. Как это обойти? И как отправлять данные командой SysSockSendTo? Пробовал отправлять ею заполненный массив на HerculesTerminal ничего не приходит. Почему NumberOfBytes не меняет свое значение, всегда (-1), хотя Recv прошел успешно
IF start THEN
IF HandleSocket<0 THEN (*нет сокета, тогда создаем*)
HandleSocket:=SysSockCreate(SOCKET_AF_INET, SOCKET_DGRAM, 0); (*создали сокет DGRAM для которого третий параметр 0 означает UDP *)
sa.sin_family:=SOCKET_AF_INET; (* заполняем структуру sa типа SOCKADDRESS*)
sa.sin_addr:=SOCKET_INADDR_ANY;
sa.sin_port:=SysSockHtons(1300);
result_bind:=SysSockBind(HandleSocket, ADR(sa), SIZEOF(sa)) ; (*связываем сокет*)
ELSE
numberOfBytes := SysSockRecvFrom (HandleSocket,ADR(MessageFromPC),1600,0,ADR(sa),SI ZEOF(sa));
IF numberofbytes<>-1 THEN SysSockClose(HandleSocket);
END_IF
END_IF
ELSE
IF HandleSocket<>SOCKET_INVALID THEN (* сокет закрываем, если START переведен в FALSE*)
SysSockClose(HandleSocket);
HandleSocket:=SOCKET_INVALID;
MessageFromPC:=Zero;
END_IF
END_IF
Последний раз редактировалось Maestro777; 29.01.2017 в 19:07.
модераторы перенесите мою тему в более подходящий раздел. так как изначально речь шла об оборудование, подборе. теперь о программирование сокетов.
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран