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

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

Автор Тема: Цвет ячейки таблицы от значения переменной  (Прочитано 739 раз)

Aleksanrus

  • Новичок
  • *
  • Сообщений: 11
    • Просмотр профиля
Здравствуйте!

Как сделать так чтобы ячейка таблицы меняла свой цвет в зависимости от значения переменной и задавать диапазон чувствительности к значению например от +3 до -3

Aleksanrus

  • Новичок
  • *
  • Сообщений: 11
    • Просмотр профиля
Допустим в ячейке 1 текущая температура уйдёт за пределы ограничения в три градуса заданной температуры в ячейке два и ячейка один поменяет свой цвет сигнализируя о не штатной ситуации. На каждую ячейку закреплена своя переменная

Timothy Clement

  • Постоялец
  • ***
  • Сообщений: 149
  • ОАО Борисовский завод "Металлист"
    • Просмотр профиля
    • Полымя
Добрый день!
Таблица это массив столбцов и строк. Напишите скрипт, который будет обходить все ячейки таблицы в цикле, и если значение отклонилось на заданную величину менять свойство Color ячейки. Скрипт можно вызывать по событию OnCellDataChange или просто раз в секунду.

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1178
    • Просмотр профиля
Здравствуйте.

Для данной задачи проще всего будет применить штатный функционал управления границами переменных без использования дополнительных переменных в столбце "t задание". Для этого нужно, чтобы у переменных "t подача" были включены "Границы"(если требуется только две границы, то выберите "Только аварийные"), а в столбце "t подача" у ячеек таблицы также должно быть включено свойство "Границы". Тогда при нарушении границ переменной, ячейки таблицы будут автоматически менять цвет. Дополнительно это позволит выдавать автоматические сообщения при нарушении границ переменных, если это требуется. Далее, чтобы изменять границы переменной из клиента, нужно эти же переменные из столбца "t подача" указать в столбце "t задание" и в свойстве ячейки "Работать с" указать нужную границу переменной.

Если переменные в столбце "t задание" это внешние переменные с ПЛК и нужно обязательно использовать их, то можно применить следующий способ: также как описано выше, у переменных "t подача" включить границы, а у ячеек таблицы в столбце "t подача" активировать свойство "Границы". Далее, у ячеек столбца "t задание" указать в свойстве "Доп. переменная" переменные температур из столбца "t подача" и создать новый скрипт по событию таблицы OnCellDataChange, в котором из переменной задания формировать аварийные границы для переменной температуры:
Код: (delphi)
var
  aTemp, aZad: TM_Variable;
begin
  // выполняем скрипт только для столбца с уставками и проверяем, что ячейки связаны с переменными
  if (Cell.Col = 2) and (Cell.Variable <> nil) and (Cell.VariableEx <> nil) then
  begin
    aTemp := Cell.VariableEx;             // переменная температуры
    aZad := Cell.Variable;                // переменная задания

    aTemp.HighAlarm := aZad.AsFloat + 3;  // верхняя авар. граница = задание + 3
    aTemp.LowAlarm := aZad.AsFloat - 3;   // нижняя авар. граница = задание - 3
  end;
end.
Следует учитывать, что нумерация столбцов таблицы начинается с нуля. В примере выше, переменные температур расположены в третьем столбце таблицы. Если у Вас они расположены в другом столбце, то нужно внести изменения в скрипт.

Если не разберетесь, то пришлите на support@simple-scada.com текущую версию проекта из директории "..\Simple-Scada 2\Projects\", можем сделать пример для Вашей таблицы.

teplocom

  • Новичок
  • *
  • Сообщений: 40
  • с чувством уверенности в завтрашнем дне
    • Просмотр профиля
Код: (delphi)
var
  aTemp, aZad: TM_Variable;
begin
  // выполняем скрипт только для столбца с уставками и проверяем, что ячейки связаны с переменными
  if (Cell.Col = 2) and (Cell.Variable <> nil) and (Cell.VariableEx <> nil) then
  begin
    aTemp := Cell.VariableEx;             // переменная температуры
    aZad := Cell.Variable;                // переменная задания

    aTemp.HighAlarm := aZad.AsFloat + 3;  // верхняя авар. граница = задание + 3
    aTemp.LowAlarm := aZad.AsFloat - 3;   // нижняя авар. граница = задание - 3
  end;
end.

Элегантно, у себя попробую такое сделать. Спасибо.

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

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1178
    • Просмотр профиля
Цитировать
Есть ли возможность не выдавать звуковое сообщение пользуясь стандартными средствами для определенных переменных (не всех) при их "выходах" за аварийные границы
Такой возможности нет. Настройки для сообщений о нарушении границ общие и изменить их для отдельных переменных нельзя.

teplocom

  • Новичок
  • *
  • Сообщений: 40
  • с чувством уверенности в завтрашнем дне
    • Просмотр профиля
Хмм.. А если я для переменной А (где не нужен звук) укажу только Верхняя/нижняя граница предупреждения в Настройки для сообщений о нарушении границ А также укажу в поле: Сообщение для нарушения границ: не выдавать сообщения.
В этом случае для переменной А у меня останется только индикация поля (желтым по-моему) при выходе значений за предупредительные границы без выдачи любых сообщений?
« Изменён: 08 Ноября 2023, 09:06:27 от Simple_Scada »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1178
    • Просмотр профиля
Здравствуйте.

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

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