Стартовая страница › Форумы › Взаимодействие с устройствами › Потеря соединения с устройством.
- В этой теме 12 ответов, 4 участника, последнее обновление 1 год, 6 месяцев назад сделано Mikhail.
-
АвторСообщения
-
06.10.2022 в 11:00 #25291fyfdУчастник
Всех приветствую! Начнем с постановки задачи) Устройство и скада взаимодействуют через MQTT. Проверка соединения на самом устройстве реализована через ping/pong (т.е. скада отправляет в топике ping сообщение, а устройство тут же возвращает это сообщение в топике pong. Если сообщение в топике ping нет на протяжении n-ого времени, устройство перезагружается).
Проблема с неактуальностью данных возникает, когда на устройстве пропадает питание и данные просто не успевают отправиться.
Как можно отследить потерю соединения с устройством на стороне скады, желательно использую топик pong?06.10.2022 в 13:19 #25292MikhailМодераторДобрый день!
То есть Вам нужно рассчитать, сколько времени прошло с момента последнего изменения значения pong и установить некий флаг? Устройство разные значения посылает в pong?06.10.2022 в 13:23 #25293fyfdУчастникСкада отправляет каждые 2.5 минуты ping со значением 1, Pong возвращает это значение сразу после получения. Да, хотелось бы опираться на время, и в неблагоприятном случае выводить сообщение о том, что данные не достоверны.
07.10.2022 в 14:29 #25302MikhailМодераторКоммуникатор периодически повторно отправляет данные на Сервер, поэтому значение должно изменяться, чтобы можно было однозначно определить наличие пинга.
Заведите отдельный дорасчётный канал, в который с помощью формулы записывайте время получения новых данных. Формула будет примерно такая:
public double SaveTime(int targetCnlNum) { if (CnlStat > 0 && Cnl != Val()) SetVal(targetCnlNum, EncodeDate(DateTime.UtcNow)); return Cnl; }
Формула должна применяться для канала pong. Когда заработает, перейдём к следующем шагу — вычислим разность между текущим временем и записанным временем.
- Этот ответ был изменен 1 год, 6 месяцев назад от Mikhail.
11.10.2022 в 13:49 #25395fyfdУчастникПредложенная вами формула не работает(
11.10.2022 в 13:53 #25397fyfdУчастникесть в scada какие-нибудь готовые реализации ping/pong?
11.10.2022 в 16:24 #25413MikhailМодераторПредложенная вами формула не работает(
есть в scada какие-нибудь готовые реализации ping/pong?Формулы на форуме не тестируются. Для этого есть Расширенная поддержка. Если выдаются конкретные ошибки, напишите здесь.
Может быть сообщество подскажет, есть ли у кого-то готовые реализации?11.10.2022 в 20:54 #25417a80808УчастникДа вряд ли, тем более через MQTT. Там задержки не регламентируются.
Как вариант сравнивать время прихода пакетов и текущее время, если они периодичны. Пропуск нескольких пакетов — тревога. Я это планировал но не реализовал. В моем случае надо было бы перезапускать программный шлюз.12.10.2022 в 15:08 #25428MikhailМодераторКак вариант сравнивать время прихода пакетов и текущее время
Важно, чтобы значение в пакете изменялось, тогда можно определённо считать, что получены новые данные.
12.10.2022 в 16:51 #25431a80808УчастникВажно, чтобы значение в пакете изменялось,
Не всегда, если пакет на одно значение. Например температура может быть достаточно относительно стабильна. Или обороты в секунду…12.10.2022 в 16:59 #25433manjey73Участник@a80808 имеется ввиду для контроля связи одна из переменных всегда меняющаяся, по которой и определяют, что связь есть
12.10.2022 в 20:15 #25440a80808УчастникНу да, и я про то. Просто у меня было много реализаций где время формирования пакета передавалось в самом пакете. Один из регистров МодБас. Удобно для контроля.
13.10.2022 в 12:46 #25446MikhailМодераторПередавать время в пакете тоже хороший вариант. Например, целое число Unit time в секундах.
-
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.