Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: Vitalii_Popovych от 03 Марта 2020, 12:04:03

Название: Работа с таблицей
Отправлено: Vitalii_Popovych от 03 Марта 2020, 12:04:03
Здравствуйте.
Есть таблица в которой строки соответствуют времени суток (от 00:00 до 23:59) и есть столбцы срабатывания датчик безопасности (затопление, открытие дверей, датчик димы). Вопрос: можно ли сделать так, чтобы в ячейку записывалось максимальное или минимальное значение переменной за прошедший час (например в 09:00 в предыдущую ячейку записывалось архивное значения с привязкой по времени). Имеется ввиду, что в период с 08:00 по 08:59 максимальное значение было например 1.
Название: Re: Работа с таблицей
Отправлено: pan2000 от 03 Марта 2020, 22:32:00
      Здравствуйте!

Для заполнения ячеек таблицы значениями архивных функций нужно добавить(изменить) следующие скрипты:

1.В скрипте "Прошел час" необходимо добавить переменные интервала времени и вызов архивной функции
Код: (delphi)
var
  ...
  DateStart, DateEnd: TDateTime;
begin
  ...
  DateEnd:= Now;                     // текущие дата и время
  DateStart:= IncHour(DateEnd, -1);  // уменьшить дату и время на 1 час

{ Синхронизация, с завершением работы функции по событию "Изменилась переменная" MyVariableRes, предполагает до вызова
функции присвоить переменной значение вне ожидаемого интервала значений функции. Например, для неотрицательных значений
функции это может быть -1. События с таким значением переменной игнорируются. Для пропуска инициализации начальное значение
переменной должно быть таким же (-1)} 
  MyVariableRes.Value := -1;
 
 { вычислить максимальное значение переменной "MyVariable" за период
   от "DateStart" до "DateEnd" и записать результат в переменную "MyVariableRes" }
  ArchiveMax(MyVariable, MyVariableRes, DateStart, DateEnd);
  ...
end.

2. Скрипт "Изменилась переменная" MyVariableRes
Код: (delphi)
var i, j: integer;
begin
  i := Variable.AsInt;  // пример для целой переменной
  if i < 0 then exit;   // это событие по инициализации (нач.значение MyVariableRes = -1) или перед вызовом архивной функции

  j := (HourOf(Now) + 23) mod 24; // предыдущий час
  Table1.GetCell(4, j + 1).Text := IntToStr(i); // вывод результата функции в столбец с индексом 4 таблицы Table1 с фиксированной 1-ой строкой
end.
Название: Re: Работа с таблицей
Отправлено: Simple-Scada от 04 Марта 2020, 09:48:25
Здравствуйте.

Если мы правильно поняли, структура таблицы статична. Тогда можно обойтись без скрипта "Изменились переменные" и вместо него можно привязать переменные результата к соответствующим ячейкам таблицы и скада автоматически будет отображать значения переменных результата в этих ячейках.
Название: Re: Работа с таблицей
Отправлено: Vitalii_Popovych от 04 Марта 2020, 15:44:14
Спасибо. Все работает. Первый вариант мне подходит.
Еще хотел спросить. Можно ли сделать так, чтобы например вместо нуля или единици  в ячейках писало например "Да" или "Нет". Что-то вроде Срабатывание датчика: 09:00 - 09:59 - "Да".
Название: Re: Работа с таблицей
Отправлено: Simple_Scada от 05 Марта 2020, 10:50:22
Здравствуйте.

Если ячейки не связаны с переменными и заполняются через скрипт с помощью изменения свойства Text, то можно записывать в него любой текст, например:
Код: (delphi)
begin
  Table1.GetCell(2, 2).Text := 'Нет';
end.
Если ячейки связаны с переменными, то в них будет выводиться текущее значение переменной.
Название: Re: Работа с таблицей
Отправлено: Vitalii_Popovych от 05 Марта 2020, 17:34:42
А если связанные? как в скриптах выше?
Название: Re: Работа с таблицей
Отправлено: Simple-Scada от 05 Марта 2020, 19:54:14
Если ячейка привязана к переменной, то в эту ячейку автоматически будет выводиться значение этой переменной. Если нужно вывести произвольный текст, то связь с переменной нужно убрать и использовать код из нашего предыдущего сообщения, для вставки текста.
Название: Re: Работа с таблицей
Отправлено: Vitalii_Popovych от 06 Марта 2020, 15:28:29
Спасибо. Решил вопрос при помощи следуущего кода:
Код: (delphi)
var i, j: integer;
begin
  i := MyVariableRes.AsInt;  // пример для целой переменной
  j := (HourOf(Now) + 23) mod 24; // предыдущий час
  if i < 0 then exit;   // это событие по инициализации (нач.значение MyVariableRes = -1)
  //или перед вызовом архивной функции

  if i = 1 then
    Table50.GetCell(13, j + 1).Text := 'Срабатывание';
  if i = 0 then
    Table50.GetCell(13, j + 1).Text := 'Норма';
  end.