Потеря соединения с устройством.

Стартовая страница Форумы Взаимодействие с устройствами Потеря соединения с устройством.

Просмотр 13 сообщений - с 1 по 13 (из 13 всего)
  • Автор
    Сообщения
  • #25291
    fyfd
    Участник

    Всех приветствую! Начнем с постановки задачи) Устройство и скада взаимодействуют через MQTT. Проверка соединения на самом устройстве реализована через ping/pong (т.е. скада отправляет в топике ping сообщение, а устройство тут же возвращает это сообщение в топике pong. Если сообщение в топике ping нет на протяжении n-ого времени, устройство перезагружается).
    Проблема с неактуальностью данных возникает, когда на устройстве пропадает питание и данные просто не успевают отправиться.
    Как можно отследить потерю соединения с устройством на стороне скады, желательно использую топик pong?

    #25292
    Mikhail
    Модератор

    Добрый день!
    То есть Вам нужно рассчитать, сколько времени прошло с момента последнего изменения значения pong и установить некий флаг? Устройство разные значения посылает в pong?

    #25293
    fyfd
    Участник

    Скада отправляет каждые 2.5 минуты ping со значением 1, Pong возвращает это значение сразу после получения. Да, хотелось бы опираться на время, и в неблагоприятном случае выводить сообщение о том, что данные не достоверны.

    #25302
    Mikhail
    Модератор

    Коммуникатор периодически повторно отправляет данные на Сервер, поэтому значение должно изменяться, чтобы можно было однозначно определить наличие пинга.

    Заведите отдельный дорасчётный канал, в который с помощью формулы записывайте время получения новых данных. Формула будет примерно такая:

    public double SaveTime(int targetCnlNum)
    {
      if (CnlStat > 0 && Cnl != Val())
        SetVal(targetCnlNum, EncodeDate(DateTime.UtcNow));
      return Cnl;
    }

    Формула должна применяться для канала pong. Когда заработает, перейдём к следующем шагу — вычислим разность между текущим временем и записанным временем.

    • Этот ответ был изменен 1 год, 6 месяцев назад от Mikhail.
    #25395
    fyfd
    Участник

    Предложенная вами формула не работает(

    #25397
    fyfd
    Участник

    есть в scada какие-нибудь готовые реализации ping/pong?

    #25413
    Mikhail
    Модератор

    Предложенная вами формула не работает(
    есть в scada какие-нибудь готовые реализации ping/pong?

    Формулы на форуме не тестируются. Для этого есть Расширенная поддержка. Если выдаются конкретные ошибки, напишите здесь.
    Может быть сообщество подскажет, есть ли у кого-то готовые реализации?

    #25417
    a80808
    Участник

    Да вряд ли, тем более через MQTT. Там задержки не регламентируются.
    Как вариант сравнивать время прихода пакетов и текущее время, если они периодичны. Пропуск нескольких пакетов — тревога. Я это планировал но не реализовал. В моем случае надо было бы перезапускать программный шлюз.

    #25428
    Mikhail
    Модератор

    Как вариант сравнивать время прихода пакетов и текущее время

    Важно, чтобы значение в пакете изменялось, тогда можно определённо считать, что получены новые данные.

    #25431
    a80808
    Участник

    Важно, чтобы значение в пакете изменялось,
    Не всегда, если пакет на одно значение. Например температура может быть достаточно относительно стабильна. Или обороты в секунду…

    #25433
    manjey73
    Участник

    @a80808 имеется ввиду для контроля связи одна из переменных всегда меняющаяся, по которой и определяют, что связь есть

    #25440
    a80808
    Участник

    Ну да, и я про то. Просто у меня было много реализаций где время формирования пакета передавалось в самом пакете. Один из регистров МодБас. Удобно для контроля.

    #25446
    Mikhail
    Модератор

    Передавать время в пакете тоже хороший вариант. Например, целое число Unit time в секундах.

Просмотр 13 сообщений - с 1 по 13 (из 13 всего)
  • Вы должны авторизироваться для ответа в этой теме.