Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Считаем отсутствие связи  (Прочитано 369 раз)

Zagajski

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Считаем отсутствие связи
« : 11 Февраля 2025, 17:33:05 »
Добрый день.
Возникла необходимость считать время отсутствия связи с переменной.
Имеется переменная ( типа Single), значение которой приходит от термодатчика. Можно ли средствами скады сделать таймер, который бы запускался как только связь с переменной теряется, и останавливался бы, когда она выходила на связь? Как мне видится - задача вроде бы и не сложная, но сам прийти к её решению не смог... Может есть какое-либо готовое решение?

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 238
    • Просмотр профиля
    • Simple-Scada
Re: Считаем отсутствие связи
« Ответ #1 : 12 Февраля 2025, 09:59:37 »
Здравствуйте.

Для решения данной задачи можно выполнять проверку качества нужной переменной, используя свойство "IsGoodQuality", и в зависимости от качества запускать/останавливать таймер, используя таймерные процедуры. Выполнять проверку качества переменной можно в скрипте с типом события "Изменились переменные". Пример работы с таймерами можно найти в демо-проекте -> страница "Скрипты" -> "Простые скрипты (1)" -> пример №3.

Пример скрипта:
Код: (delphi)
begin
  if Variable.IsGoodQuality = False then  // если переменная плохого качества, то
    TimerStart(vrLinkTimer, 0)            // запускаем таймер по переменной "vrLinkTimer"
  else                                    // иначе
    TimerReset(vrLinkTimer);              // сбрасываем таймер по переменной "vrLinkTimer"
end.
Если время отсутствия связи всегда меньше 24 часов, то проще всего для вывода переменной таймера "vrLinkTimer" использовать компонент "Календарь" и настроить его так, чтобы отображалось только время – см. свойства Стиль, Дата, Время.

Если время отсутствия связи может быть больше 23:59:59, то его можно выводить в компонент "Текст". Для этого компонент "Текст" нужно связать с переменной таймера "vrLinkTimer" и на событие "OnDataChange" написать универсальный скрипт:
Код: (delphi)
var
  aSeconds: Int64;
begin
  if Sender is TM_Text then   // проверяем, что Sender это текст
    with Sender as TM_Text do // приводим Sender к типу "TM_Text"
    begin
      aSeconds := SecondsBetween(0, vrLinkTimer.AsDateTime); // получаем кол-во секунд
      Text := SecondsToStr(aSeconds);                        // переводим секунды в строку вида "чч:мм:сс".
    end;
end.
« Изменён: 12 Февраля 2025, 10:17:43 от Simple_Scada »

Zagajski

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Re: Считаем отсутствие связи
« Ответ #2 : 12 Февраля 2025, 17:08:53 »
Всё равно не смог добиться запуска таймера при потере связи с переменной.
Может в скрипте какая-то неточность? хотя компилятор пропустил. Для таймера создал внутреннюю переменную TimeLerm103, внешняя переменная, время отсутствия связи с которой нужно узнать - Lermont_103.
Код: (delphi)
var
  aSeconds: Int64;
begin
  If Lermont_103.IsGoodQuality = False then
    TimerStart (TimeLerm103, 0)
    else
    TimerReset (TimeLerm103);
  if Sender is TM_Text then   // проверяем, что Sender это текст
    with Sender as TM_Text do // приводим Sender к типу "TM_Text"
    begin
      aSeconds := SecondsBetween(0, TimeLerm103.AsDateTime); // получаем кол-во секунд
      Text := SecondsToStr(aSeconds);                        // переводим секунды в строку вида "чч:мм:сс".
    end;
end.
« Изменён: 12 Февраля 2025, 17:45:58 от Simple Scada »

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 238
    • Просмотр профиля
    • Simple-Scada
Re: Считаем отсутствие связи
« Ответ #3 : 12 Февраля 2025, 18:38:44 »
1. Вы зачем-то объединили два скрипта в один. Хотя это два разных скрипта, которые нужно использовать на разные события.
2. Для начала используйте первый скрипт и разберитесь с запуском таймера (для этого просто следуйте описанию из предыдущего сообщения). Далее, если отсутствие связи может быть более 24 часов, то используйте второй скрипт.
3. Если самостоятельно разобраться не получится, то пришлите нам для проверки на support@simple-scada.com текущую версию Вашего проекта из директории "..\Simple-Scada 2\Projects\" и укажите скрипт, который нужно проверить.

Zagajski

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Re: Считаем отсутствие связи
« Ответ #4 : 13 Февраля 2025, 17:39:20 »
Т.е. я беру внешнюю переменную с ОРС-сервера, проверяю её качество функцией IsGoodQuality. Если значение False то должен запуститься таймер функцией TimerStart. Для запуска таймера я должен создать ВНУТРЕННЮЮ переменную vrLinkTimer с типом DateTime и шкалой времени начинающейся с 0? Если значение ВНЕШНЕЙ переменной True, то таймер обнуляется функцией Timer Reset, верно? И так каждый раз, когда качество ВНЕШНЕЙ переменной становится False. Скрипт я должен поставить на событие календаря OnDataChange?

В моём случае таймер почему-то сразу обнуляется, хотя ВНЕШНЯЯ переменная приходит с качеством BAD с контроллера, хотя таймер должен считать. На другом объекте, где качество ВНЕШНЕЙ переменной GOOD, при изменении её на BAD таймер так же не начинает отсчёт. В чём может быть ошибка?
Код: (delphi)
begin
  If Lermont_103.IsGoodQuality = False then
    TimerStart (TimeLerm103, 0)
  else
    TimerReset (TimeLerm103);
end.
Переменная Lermont_103 ВНЕШНЯЯ с постоянным качеством BAD, переменная TimeLerm103 - ВНУТРЕННЯЯ для таймера.

Код: (delphi)
begin
  If Serova_451.IsGoodQuality = False then
    TimerStart (TimeSerova451, 0)
  else
    TimerReset (TimeSerova451);
end.
Здесь переменная Serova_451 ВНЕШНЯЯ, её качество периодически меняется. TimeSerova451 - ВНУТРЕННЯЯ для таймера.

Оба скрипта были созданы с типом события "Изменились переменные"
« Изменён: 13 Февраля 2025, 19:48:15 от Simple Scada »

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 238
    • Просмотр профиля
    • Simple-Scada
Re: Считаем отсутствие связи
« Ответ #5 : 13 Февраля 2025, 19:48:00 »
Описание действий по пунктам:
1. Создаём скрипт с типом события "Изменились переменные" и добавляем переменную "Serova_451" в список скрипта.
2. Вставляем в него следующий код (без изменений):
Код: (delphi)
begin
  if Variable.IsGoodQuality = False then
    TimerStartTimeLerm103, 0)
  else
    TimerReset(TimeLerm103);
end.
3. Добавляем компонент "Календарь" на мнемосхему и в свойство "Переменная" указываем переменную "TimeLerm103". Также, изменяем свойство "Дата" на "скрыть" и свойство "Время" на "чч:мм:сс".
4. Для удобства: переходим в "Редактор переменных" и для переменной "TimeLerm103" в свойство "Начальное значение" указываем значение, равное 0.
5. Сохраняем и запускаем/перезапускаем проект. Также убедитесь, что Вы запускаете проект не в режиме отладки с эмуляцией работы OPC-сервера.

Если разобраться не получится, то присылайте проект на проверку.

Zagajski

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Re: Считаем отсутствие связи
« Ответ #6 : 18 Февраля 2025, 09:12:35 »
Спасибо! Теперь разобрался, заработало