PDA

Просмотр полной версии : Ping + ПЛКххх



Gans
03.05.2007, 11:47
Здрасте всем!!!

У меня для полного хепиенда систем диспетчеризации не хватает реализации команды “ping” с помощью контроллера ПЛКххх. В двух словах о проблеме:
На объекте стоит контроллер. Контроллер отправляет информацию об объекте на диспетчерский пункт. Но сетевое оборудование иногда виснет и соответственно пропадает связь с объектом. Я хотел бы при помощи контроллера раз в пять минут пинговать компы из дальних уголков сети и если никто не откликнулся выключить и через 10 секунд включить сетевое оборудование (модем, свичь и тд.). К большому сожалению руки еще не выпрямились после сименсов и самому как то не получились пока реализовать эту идею.

P. S. От аварийки до некоторых объектов диспетчеризации иногда минут 20 езды на машине. Так что помогите кто чем может. Не хочется выслушивать от людей обучающий мат:).

Малышев Олег
03.05.2007, 12:16
странно, вроде бы высылали вам пример. прошивка должна быть не хуже 1.31.4.

Gans
03.05.2007, 16:31
ну вообще-то я так и не получал от вас письмеца с этим шедевром. но вот заберу это себе домой и поиграюсь.

и еще раз огромное спасибо!!!

Малышев Олег
04.05.2007, 16:40
просто интересно - заработало? странно, что письмо не прошло.

Gans
07.05.2007, 12:19
Все работает, но есть НО!!!

Я отправлял UDP пакеты как учили. И после создания сокета по хорошему его надо удалять, но сам понимаешь лень, да и толком не знаю как, SysSockClose(sock), похоже не помогает. Так вот сливаешь в контроллер новую программу, а там после пуска программы, кажется, создается еще один сокет с тем же именем и тд. Борюсь с этим так: перед заливкой новой программы в начале стираю все из контроллера Reset(original), выключаю питание контроллера на 20 минут. И после этого включаю питание и получаю по НАСТОЯЩЕМУ чистый контроллер затем сливаю новую программу и все работает, а по другому не умею!!!
Из кодесис это выглядит так: программа проходит строчку с командой отправки UDP, но получатель не получает UDP пакета. Пока не выключить контроллер на 20 минут (хотя уверен и меньшего времени будет достаточно).
Для пингов все выше указанное верно.

P. S. Огромное спасибо сей час у меня круглосуточно работает один контроллер и вот собираю статистику.

Филоненко Владислав
07.05.2007, 12:34
???
А что возвращает функция SysSockClose?
Вы точно передаете ей правильный handle? И какой handle - сообщите его номер. Меняется ли номер после пары SysSockClose - SysSockCreate

Gans
11.05.2007, 13:46
на выходных посмотрю и на следующей недели поподробней напишу.

Gans
15.05.2007, 09:31
На счет всех моих вопросов высланных в предыдущем письме – это не только к вложенному проекту (на самом деле это далеко не первый вариант), а вообще все странности с которыми я столкнулся.

По поводу создания и удаления сокета я предполагал сделать так:
Программа PLC_PRG доходит до шага (step) SendUDP. На входе в шаг (SendUDP) Entry-Action я указываю создание сокета. На выходе из шага (SendUDP) Exit-Action я предполагал удаление сокета. Сама отправка UDP пакетов (SendUDP2Disp) осуществляется по таймеру из конфигуратора задач или по переднему (заднему) фронту дискретных входов (выходов). Для ресета сокета (выключать контроллер на 20 минут на работающей котельной как-то не очень) я собирался предусмотреть возможность выйти из шага (SendUDP) и снова войти в этот шаг. Разрешение на выход из шага (SendUDP) дает разрешение ResetSendUDP это либо дискретный вход или только из CoDeSys с использованием сонтроль+f7. В ходе реализации всего выше указанного у меня переставал работать конфигуратор задач (работал не так как вы говорили).

Все указанное верно и для Ping.

P. S. надеюсь получить рекомендации. Если будут новые глюки молчать не буду:)

Филоненко Владислав
15.05.2007, 09:46
Если вы создадите сокет, пошлете данные и удалите в одном цикле ПЛК, то это, скорее всего, работать не будет. Необходимо время для передачи данных.
Каждый раз открывать/закрывать сокет - излишество. Надо анализировать возвращаемые значения и ход обмена (напр. таймаут по отс. обмена) и по ним принимать решение о закрытии сокета и его новом открытии.
Пример обработки при передаче: (на С)

count = send(pdata->socket, p_ch, anzahl, 0);
if(count == SOCKET_ERROR)
{
errno = WSAGetLastError(pdata->socket);
if (errno != WSAEWOULDBLOCK)
{
closesocket(pdata->socket);
pdata->is_init=0;
ID221_Init(This);
}
ID221_DEBUGOUT("ID221: Socket error\n");
return -1;
}
else if (count != anzahl){
pdata->is_init=0;
closesocket(pdata->socket);
ID221_Init(This);
}
Функция SysSockGetLastError() появилась в последней версии библиотеки SysLibSockets.lib

Gans
15.05.2007, 10:24
На счет программно контролировать правильность отправки пакетов в принципе я тут протупил, исправлюсь. Правда отправка пакетов при помощи функции SysSockSendTo всегда (пока подглядывал из кодесис) возвращает правильное значение (в моем случае 167 байт) и при этом получатель не всегда получает данные целиком. На счет SysSockGetLastError обязательно посмотрю.

P. S. на сях я не силен (было пара не удачных попыток), но ключевые моменты понятны.