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

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

Автор Тема: Реализация цветовой индикации  (Прочитано 1880 раз)

Buba

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Реализация цветовой индикации
« : 04 Ноября 2023, 12:29:47 »
Реализация цветовой индикации наибольшей и наименьшей
температур среди ТО1,2,3,4. Поле самого горячего теплообменника
должно подсвечиваться красным, и далее по убывающей,
оранжевым, желтым, зелёным
Какой сприпт для этого нужен?

pan2000

  • Постоялец
  • ***
  • Сообщений: 226
    • Просмотр профиля
Re: Реализация цветовой индикации
« Ответ #1 : 04 Ноября 2023, 22:47:29 »
        Здравствуйте.

  Подойдет скрипт "Изменились переменные", в котором переменными являются все четыре температуры теплообменников (ТО).
  Достаточно простой алгоритм на основе последовательных поисков текущего максимума по предварительно заполненному массиву температур. Для ТО соответствующего текущего максимума устанавливается цвет, а значение в массиве устанавливается в -1, что исключает дальнейшее его использование в поиске максимумов.
  Вы не определили "раскраску" ТО при равенстве температур, в данном скрипте более "горячим" будет ТО с наименьшим номером.
  Пример во вложении.

Buba

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Re: Реализация цветовой индикации
« Ответ #2 : 07 Ноября 2023, 16:56:27 »
Мы вроде прописали скрипт, о компилируется, но как только мы его сохраняем он говорит, что есть ошибка, но ее не показывает

pan2000

  • Постоялец
  • ***
  • Сообщений: 226
    • Просмотр профиля
Re: Реализация цветовой индикации
« Ответ #3 : 09 Ноября 2023, 02:08:48 »
    Здравствуйте.

  Возможная ошибка - дисбаланс между операторами begin и end. Получить диагностику можно при предварительной компиляции кода по нажатию Shift + F9.
  Но начинать надо с алгоритма. Судя по строке скрипта:
Код: (delphi)
 if Field1.AsInt > Field2.AsInt and Field3.AsInt and Field4.AsInt then Field1.Color := 4;
в предположении что подразумевалось сравнение переменной поля Field1 на превышение над переменными прочих полей:
Код: (delphi)
 if (Field1.AsInt > Field2.AsInt) and (Field1.AsInt > Field3.AsInt) and (Field1.AsInt > Field4.AsInt) then 
  Field1.Color := clRed;
с последующими сравнениями на превышение двух, одной переменных и меньше всех переменных.
  Скрипт раскрашивает объект и для каждого объекта необходим свой экземпляр. Кроме того цвет не корректируется для остальных объектов.
  Для вызова скрипта раскраски в прочих объектах можно использовать скрипт, вызываемый по аналогичному событию - либо пара событий по изменению основной и совпадающей с ней дополнительной переменной, либо для объекта "Поле" по вводу и изменению основной переменной.
  Универсальный скрипт раскраски реализован как подсчет числа превышений значения основной переменной объекта по ВСЕМУ набору переменных:
Код: (delphi)
Procedure Field_OnDataChange(Sender: TM_Control);
var i,j: integer;
begin
  with Sender as TM_Object do begin
    j := 0;                          // счётчик превышений
    for i := 1 to 4 do
      if AsInt > GetObjectByName('Field' + IntToStr(i)).Variable.AsInt then
        j := j + 1;           // встретилась переменная, имеющая значение большее чем у основной

    case j of                 // перевод числа превышений в цвет объекта
    0: Color := clGreen;
    1: Color := clYellow;
    2: Color := clFuchsia;
    3: Color := clRed;
    end;
// здесь может быть код для ещё каких-либо действий с объектом, например вывод значения в поле Text
  end;
end.
Скрипт вызова скрипта раскраски во всех прочих объектах/ во всех объектах:
Код: (delphi)
Procedure Field_OnDataExChange(Sender: TM_Control);
var i: integer;
begin
  with Sender as TM_Object do
    for i := 1 to 4 do
      GetObjectByName('Field' + IntToStr(i)).OnDataChangeEvent;                     // скрипт раскраски у объекта с изменившейся переменной вызывается дважды
//      if Tag <> i then GetObjectByName('Field' + IntToStr(i)).OnDataChangeEvent;  // скрипт вызывается один раз, но приходится идентифицировать объект свойством Tag
end.
Пример во вложении.

P.S. Вопрос раскраски объектов с одинаковыми значениями переменных остался открытым.