Страница 3 из 3 ПерваяПервая 123
Показано с 21 по 27 из 27

Тема: PING удаленного компьютера через Ethernet средствами ПЛК

  1. #21
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    Что значит "поточные"? SysSockRecvFrom - аналог обычной recvfrom как я понимаю.
    «Поточные» в широком смысле — вместе с теми, которые пишут и читают в/из последовательного порта, например. Насколько я знаю, recvfrom блокирует поток в ожидании данных. Но я слишком давно ничего не писал голыми сокетами в нативных языках на ПК, чтобы утверждать наверняка. Это же касается и полей-идентификаторов. Полагаю, их надо заполнять вручную. Однако факт есть факт — на моей машине оно работает и с такими идентификаторами.

  2. #22

    По умолчанию

    Цитата Сообщение от Yegor Посмотреть сообщение
    «Поточные» в широком смысле — вместе с теми, которые пишут и читают в/из последовательного порта, например. Насколько я знаю, recvfrom блокирует поток в ожидании данных. Но я слишком давно ничего не писал голыми сокетами в нативных языках на ПК, чтобы утверждать наверняка. Это же касается и полей-идентификаторов. Полагаю, их надо заполнять вручную. Однако факт есть факт — на моей машине оно работает и с такими идентификаторами.
    Спасибо еще раз за пример. Разобрался - проблема в самом деле в брандмауэре - он пропускал только ответы на запросы встроенной в Windows утилиты ping. Ответы на ICMP пакеты других программ блокировались.

    Все работает, но мне все таки странно видеть данные из буфера "данных" в качестве идентификатора...
    Ну и непонятно использование структуры SOCKADDRESS - зачем у Владислава в примере задается порт sock_adr1.sin_port:=16#1111 ?
    Последний раз редактировалось sgmj; 09.04.2015 в 14:21.

  3. #23
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    Ну и непонятно использование структуры SOCKADDRESS - зачем у Владислава в примере задается порт sock_adr1.sin_port:=16#1111 ?
    Тот, кто это писал, не понимал назначения этой структуры. В неё ничего записывать не надо, т.к. туда пишет координаты отправителя функция RecvFrom.

  4. #24

    По умолчанию

    А кстати, в чем смысл:

    IF stateTimer.ET > T#1s AND state < C_ERROR THEN
    state := C_ERROR + state;
    END_IF
    ?

    И сокет не закрывается потому, что пинг бесконечный?

  5. #25
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    Там выше ещё строка есть stateTimer(IN := state = _state). С таким таймером мы знаем, в течение какого времени находимся на текущем шаге. Соответственно те строки, про которые вы спросили, переводят автомат в состояние ошибки, если мы топчемся на одном шаге дольше секунды. Например, если не дождались ответа (шаг 3), то выставляется код/состояние 203. Если по какой-то причине не смогли даже скормить ответ на отправку, то код будет 202. При отладке очень помогает. Этот же таймер и для выдерживания пауз используется (состояние SUCCESS). Ну и вообще это у меня идиома такая для конечных автоматов на ST.

    Да, сокет не закрывается, потому что этот код кроме бесконечной демонстрации пинга ничего не делает.

  6. #26

    По умолчанию

    Ну и непонятно использование структуры SOCKADDRESS - зачем в примере задается порт sock_adr1.sin_port:=16#1111 ?

    Сделано это для целей отладки - видимо создатель программы по шагам проверял работу всех функций (писал не я, могу только догадываться).
    P.S. Требовать от примера Ping совершенства, отсутствия синтаксического оверхеда, развёрнутых комментариев и тотальной обработки ошибок - это перфекционизм.
    Тролль-наседка, добрый, нежный и ласковый

  7. #27
    Пользователь Аватар для Rednaxel
    Регистрация
    15.05.2015
    Адрес
    Минск
    Сообщений
    19

    По умолчанию проверка PING нескольких устройств

    Здравствуйте!
    Оформил упомянутый в теме ICMP_TEST_PING.pro в виде блока, который после 4-х подряд успешных запросов показывает что устройство в сети:
    ICMP_block.PNG
    Используется ПЛК 110.60 старой серии.
    Блок работает, но только когда он в одном экземпляре, что впрочем вполне ожидаемо.
    По условиям задачи нужно отслеживать появление в сети 10-ти устройств с идущими подряд IP адресами, но при этом нужно знать какое именно устройство появилось в сети и какое отключилось.
    Напрашивается мысль что нужно перебирать в блоке адреса по очереди, но моего опыта в ST маловато для решения подобной задачи, к тому же отлаживать приходится на "боевом" ПЛК и случаются зависания.

    Подскажите пожалуйста, как примерно должен выглядеть код, реализующий такую задачу, или может быть есть другой алгоритм?

Страница 3 из 3 ПерваяПервая 123

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •