Здравствуйте.
Для решения данной задачи можно выполнять проверку качества нужной переменной, используя свойство "IsGoodQuality (https://simple-scada.com/help/script/varisgoodquality.html)", и в зависимости от качества запускать/останавливать таймер, используя таймерные процедуры (https://simple-scada.com/help/script/timers.html). Выполнять проверку качества переменной можно в скрипте с типом события "Изменились переменные (https://simple-scada.com/help/script/changed-the-variables.html)". Пример работы с таймерами можно найти в демо-проекте -> страница "Скрипты" -> "Простые скрипты (1)" -> пример №3.
Пример скрипта:
begin
if Variable.IsGoodQuality = False then // если переменная плохого качества, то
TimerStart(vrLinkTimer, 0) // запускаем таймер по переменной "vrLinkTimer"
else // иначе
TimerReset(vrLinkTimer); // сбрасываем таймер по переменной "vrLinkTimer"
end.
Если время отсутствия связи всегда меньше 24 часов, то проще всего для вывода переменной таймера "vrLinkTimer" использовать компонент "Календарь (https://simple-scada.com/help/manual/calendar.html)" и настроить его так, чтобы отображалось только время – см. свойства Стиль, Дата, Время.
Если время отсутствия связи может быть больше 23:59:59, то его можно выводить в компонент "Текст (https://simple-scada.com/help/manual/text.html)". Для этого компонент "Текст" нужно связать с переменной таймера "vrLinkTimer" и на событие "OnDataChange" (https://simple-scada.com/help/script/by-obj-event.html) написать универсальный скрипт:
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.
Всё равно не смог добиться запуска таймера при потере связи с переменной.
Может в скрипте какая-то неточность? хотя компилятор пропустил. Для таймера создал внутреннюю переменную TimeLerm103, внешняя переменная, время отсутствия связи с которой нужно узнать - Lermont_103.
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.
Т.е. я беру внешнюю переменную с ОРС-сервера, проверяю её качество функцией IsGoodQuality. Если значение False то должен запуститься таймер функцией TimerStart. Для запуска таймера я должен создать ВНУТРЕННЮЮ переменную vrLinkTimer с типом DateTime и шкалой времени начинающейся с 0? Если значение ВНЕШНЕЙ переменной True, то таймер обнуляется функцией Timer Reset, верно? И так каждый раз, когда качество ВНЕШНЕЙ переменной становится False. Скрипт я должен поставить на событие календаря OnDataChange?
В моём случае таймер почему-то сразу обнуляется, хотя ВНЕШНЯЯ переменная приходит с качеством BAD с контроллера, хотя таймер должен считать. На другом объекте, где качество ВНЕШНЕЙ переменной GOOD, при изменении её на BAD таймер так же не начинает отсчёт. В чём может быть ошибка?
begin
If Lermont_103.IsGoodQuality = False then
TimerStart (TimeLerm103, 0)
else
TimerReset (TimeLerm103);
end.
Переменная Lermont_103 ВНЕШНЯЯ с постоянным качеством BAD, переменная TimeLerm103 - ВНУТРЕННЯЯ для таймера.
begin
If Serova_451.IsGoodQuality = False then
TimerStart (TimeSerova451, 0)
else
TimerReset (TimeSerova451);
end.
Здесь переменная Serova_451 ВНЕШНЯЯ, её качество периодически меняется. TimeSerova451 - ВНУТРЕННЯЯ для таймера.
Оба скрипта были созданы с типом события "Изменились переменные"
Описание действий по пунктам:
1. Создаём скрипт с типом события "Изменились переменные (https://simple-scada.com/help/script/changed-the-variables.html)" и добавляем переменную "Serova_451" в список скрипта (https://clck.ru/3GN6TE).
2. Вставляем в него следующий код (без изменений):
begin
if Variable.IsGoodQuality = False then
TimerStartTimeLerm103, 0)
else
TimerReset(TimeLerm103);
end.
3. Добавляем компонент "Календарь (https://simple-scada.com/help/manual/calendar.html)" на мнемосхему и в свойство "Переменная" указываем переменную "TimeLerm103". Также, изменяем свойство "Дата" на "скрыть" и свойство "Время" на "чч:мм:сс".
4. Для удобства: переходим в "Редактор переменных (https://simple-scada.com/help/manual/variable-editor.html)" и для переменной "TimeLerm103" в свойство "Начальное значение (https://clck.ru/3GN7Aa)" указываем значение, равное 0.
5. Сохраняем и запускаем/перезапускаем проект. Также убедитесь, что Вы запускаете проект не в режиме отладки (https://simple-scada.com/help/manual/rundebugmode.html) с эмуляцией работы OPC-сервера (https://clck.ru/3GN7Mj).
Если разобраться не получится, то присылайте проект на проверку.