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

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

Автор Тема: Границы переменных  (Прочитано 1376 раз)

ART63

  • Постоялец
  • ***
  • Сообщений: 151
    • Просмотр профиля
Границы переменных
« : 17 Января 2022, 15:32:15 »
Добрый день!

Есть ли возможность формировать сообщение при возвращении значения переменной в допустимые пределы?

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 245
    • Просмотр профиля
    • Simple-Scada
Re: Границы переменных
« Ответ #1 : 17 Января 2022, 19:44:45 »
Здравствуйте.
Есть ли возможность формировать сообщение при возвращении значения переменной в допустимые пределы?
Для решения данной задачи можно использовать функцию GetValueZone, которая возвращает номер нарушенной границы. Нужно создать новый скрипт с событием "Нарушена граница", добавить в список скрипта нужные переменные (как это описано в примере) и написать такой код:

Код: (delphi)
begin
  if Variable.GetValueZone = 0 then
  AddMessage(Now, mkMessage, 'Сообщение', True, False);
end.
« Изменён: 17 Января 2022, 21:42:27 от Simple_Scada »

ART63

  • Постоялец
  • ***
  • Сообщений: 151
    • Просмотр профиля
Re: Границы переменных
« Ответ #2 : 18 Января 2022, 09:25:31 »
Большое спасибо!

Как пожелание к разработчикам: может быть данную функциональность можно добавить в настройки границ?
Добавить combobox "Формировать сообщение при восстановлении данных" и поле с текстом сообщения.
Это проще для использования. Да и полагаю, что дополнительные скрипты могут сказаться на времени обработки других данных. Особенно тех, которые кроме как скриптами обработать нельзя. Также при большом количестве тегов это тоже может оказаться критично.

А данная функция очень полезна для записи альтернативной переменной при построении отчета о выходе параметров за допустимые пределы.
« Изменён: 18 Января 2022, 09:27:42 от ART63 »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1301
    • Просмотр профиля
Re: Границы переменных
« Ответ #3 : 18 Января 2022, 20:03:16 »
Здравствуйте.

Цитировать
может быть данную функциональность можно добавить в настройки границ?
Сейчас мы разрабатываем новую систему архивации, в которой появятся изменения в интерфейсе просмотра сообщений, например будут добавлены новые колонки с временем возникновения и завершения сообщения. Это позволит в строке любого сообщения увидеть время его завершения, т.е. время когда значение переменной вышло из нарушенной границы.

knskey

  • Новичок
  • *
  • Сообщений: 29
    • Просмотр профиля
Re: Границы переменных
« Ответ #4 : 03 Февраля 2022, 00:20:34 »
Здравствуйте.
Цитировать
может быть данную функциональность можно добавить в настройки границ?
.. например будут добавлены новые колонки с временем возникновения и завершения сообщения. Это позволит в строке любого сообщения увидеть время его завершения...

о. это очень хорошие новости и очень важное улучшение.

AndreyA

  • Новичок
  • *
  • Сообщений: 42
    • Просмотр профиля
Re: Границы переменных
« Ответ #5 : 17 Апреля 2025, 15:15:54 »
Добрый день!
Необходимо чтобы по превышению  аварийных уставок становилось видимой форма ( прямоугольник),
небольшой скрипт "Нарушена граница":
Код: (delphi)
begin
  if not IsFirstChange then
    Shape5.Visible := True
  else if temperatura.GetValueZone = 0 then
  begin
    Shape5.Visible := False;
    AddMessage(Now, mkMessage, 'Температура в норме ', True, False);
  end;
end.


Проблема в том что форма остается видимой на экране, даже при том что значение переменной ушло в допустимые пределы.

upd:
Код: (delphi)
begin
  if not IsFirstChange then
  begin
    if temperatura.GetValueZone = 2 then
      Shape5.Visible := True
    else if temperatura.GetValueZone = 0 then
      Shape5.Visible := False;
  end;
end.

Работает так. И немного поменял % зоны нечувствительности
« Изменён: 17 Апреля 2025, 15:51:22 от Simple_Scada »

AndreyA

  • Новичок
  • *
  • Сообщений: 42
    • Просмотр профиля
Re: Границы переменных
« Ответ #6 : 24 Апреля 2025, 09:33:55 »
В продолжение предыдущего поста :
Столкнулся с непонятной ситуацией : в скрипте я описывал ситуацию, при изменении Верхней аварийной границы появляется баннер, но баннер пропадает только если
Предупредительная граница не нарушена.  Прописывал условие для предупредительной границы -1 и +1. Ниже скрипт, но не помогает это условие:
Код: (delphi)
begin
  if not IsFirstChange then
  begin
    if temperatura.GetValueZone = 2 then
      Shape5.Visible := True
    else if temperatura.GetValueZone = 0 or
             temperatura.GetValueZone = 1 or
             temperatura.GetValueZone = -1 then
      Shape5.Visible := False;
  end;
end.
« Изменён: 24 Апреля 2025, 10:03:31 от Simple Scada »

ZWolol

  • Пользователь
  • **
  • Сообщений: 51
    • Просмотр профиля
Re: Границы переменных
« Ответ #7 : 24 Апреля 2025, 10:20:02 »
В первом скрипте ты постоянно присваиваешь ей видимость, потому она и не пропадает.
Во втором скрипте ты ее гасишь когда войдет в норму и пишешь что, работает.

А что тебе в третьем скрипте нужно не понятно.
Там все условия проверки нужно заключать в скобки, типа: (temperatura.GetValueZone = 0) or (...

Возможно тебе нужно это: temperatura.GetValueZone >= 0

AndreyA

  • Новичок
  • *
  • Сообщений: 42
    • Просмотр профиля
Re: Границы переменных
« Ответ #8 : 24 Апреля 2025, 10:33:21 »
Да, наверно запутал))
Вот текущий скрипт:
Суть такая: если значение переменной выходит за пределы Аварийных границ как HH или LL - баннер появляется, при  выходе переменной из аварийных уставок баннер пропадает.
Но! У меня баннер не пропадает пока он находиться между HighHigh и High  уставкой, хотя предупреждение отключено (Нigh) 
Код: (delphi)
begin
  if IsFirstChange then  // Выход, если это первое изменение
    Exit;

  if power1.Value < 100 then   // Выход, если мощность меньше 100
    Exit;

  // Основная логика (выполняется только если IsFirstChange=False и power1 >= 100)
  if (Pressure.GetValueZone = 2) or
   (temperatura.GetValueZone = 2) or
   (Pressure.GetValueZone = -2) or
   (temperatura.GetValueZone = -2) then
    Shape5.Visible := True
  else if (Pressure.GetValueZone >= 0) or (temperatura.GetValueZone >= 0) then
    Shape5.Visible := False;
end.

Пока нет не помогло
« Изменён: 24 Апреля 2025, 10:48:54 от AndreyA »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1301
    • Просмотр профиля
Re: Границы переменных
« Ответ #9 : 24 Апреля 2025, 10:46:01 »
Здравствуйте.

Цитировать
Столкнулся с непонятной ситуацией : в скрипте я описывал ситуацию, при изменении Верхней аварийной границы появляется баннер, но баннер пропадает только если предупредительная граница не нарушена.
См. описание события "Нарушена граница": "событие не срабатывает при переходе значения из аварийной зоны в предупредительную (т.к. условия улучшились, а не ухудшились)."

Если требуется управлять видимостью при переходе из аварийной зоны в предупредительную, то событие "Нарушена граница" не подойдет. Можно использовать скрипт  "Изменились переменные" и сравнивать текущее значение переменной с нужными границами. Но следует учитывать, что в этом случае зона нечувствительности переменной не будет учитываться и при колебаниях значения на границах, видимость будет постоянно меняться.

AndreyA

  • Новичок
  • *
  • Сообщений: 42
    • Просмотр профиля
Re: Границы переменных
« Ответ #10 : 24 Апреля 2025, 10:50:21 »
Понятно. Благодарю

pan2000

  • Постоялец
  • ***
  • Сообщений: 210
    • Просмотр профиля
Re: Границы переменных
« Ответ #11 : 25 Апреля 2025, 00:57:48 »
   Здравствуйте.

Появление баннера при нарушении "Верхней аварийной" границы и пропадание по выходу из зоны нечувствительности:

1.Если для прочих нужд проекта не используется "Верхняя предупредительная" граница, скрипт "Нарушена граница":
Код: (delphi)
begin
  Shape5.Visible := Variable.GetValueZone = 2;
end.
, в вариациях задания зоны нечувствительности:
- "Только аварийные" границы - сама "Зона нечувствительности";
- "Аварийные и предупредительные" границы - либо нижняя граница зоны нечувствительности задается "Верхней предупредительной" границей при "Зоне нечувствительности"=0, либо "Зоной нечувствительности" при "Верхней предупредительной"="Верхней аварийной".

2. Без использования стандартной процедуры контроля границ, скрипт "Изменилась переменная":
- с нулевой зоной:
Код: (delphi)
begin
  Shape5.Visible := Variable.AsFloat >= Variable.HighAlarm;
end.
- с ненулевой зоной:
Код: (delphi)
const hist = 4.00;  // величина зоны в единицах измерения переменной
begin
  if (Variable.AsFloat >= Variable.HighAlarm) then Shape5.Visible := true;
  if Shape5.Visible and (Variable.AsFloat < (Variable.HighAlarm - hist)) then Shape5.Visible := false;
end.
.
Вариант 1 более предпочтительный, т.к. и скрипт проще, и событий меньше. Примеры для некоторых вариантов во вложении.
« Изменён: 25 Апреля 2025, 01:04:45 от pan2000 »

AndreyA

  • Новичок
  • *
  • Сообщений: 42
    • Просмотр профиля
Re: Границы переменных
« Ответ #12 : 25 Апреля 2025, 12:34:50 »
Коллеги, Благодарю!
Я сделал кнопку на сброс, т.е. когда выскакивает баннер по превышению(понижению) уставки на главном окне, то оператор выбирает окно с объектом на котором аварийная ситуация и уже открыв окно он сбрасывает состояние Visible у баннера.