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

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

Автор Тема: Работа с таблицей  (Прочитано 3471 раз)

Vitalii_Popovych

  • Новичок
  • *
  • Сообщений: 13
    • Просмотр профиля
Работа с таблицей
« : 03 Марта 2020, 12:04:03 »
Здравствуйте.
Есть таблица в которой строки соответствуют времени суток (от 00:00 до 23:59) и есть столбцы срабатывания датчик безопасности (затопление, открытие дверей, датчик димы). Вопрос: можно ли сделать так, чтобы в ячейку записывалось максимальное или минимальное значение переменной за прошедший час (например в 09:00 в предыдущую ячейку записывалось архивное значения с привязкой по времени). Имеется ввиду, что в период с 08:00 по 08:59 максимальное значение было например 1.

pan2000

  • Постоялец
  • ***
  • Сообщений: 226
    • Просмотр профиля
Re: Работа с таблицей
« Ответ #1 : 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.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Работа с таблицей
« Ответ #2 : 04 Марта 2020, 09:48:25 »
Здравствуйте.

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

Vitalii_Popovych

  • Новичок
  • *
  • Сообщений: 13
    • Просмотр профиля
Re: Работа с таблицей
« Ответ #3 : 04 Марта 2020, 15:44:14 »
Спасибо. Все работает. Первый вариант мне подходит.
Еще хотел спросить. Можно ли сделать так, чтобы например вместо нуля или единици  в ячейках писало например "Да" или "Нет". Что-то вроде Срабатывание датчика: 09:00 - 09:59 - "Да".

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1400
    • Просмотр профиля
Re: Работа с таблицей
« Ответ #4 : 05 Марта 2020, 10:50:22 »
Здравствуйте.

Если ячейки не связаны с переменными и заполняются через скрипт с помощью изменения свойства Text, то можно записывать в него любой текст, например:
Код: (delphi)
begin
  Table1.GetCell(2, 2).Text := 'Нет';
end.
Если ячейки связаны с переменными, то в них будет выводиться текущее значение переменной.

Vitalii_Popovych

  • Новичок
  • *
  • Сообщений: 13
    • Просмотр профиля
Re: Работа с таблицей
« Ответ #5 : 05 Марта 2020, 17:34:42 »
А если связанные? как в скриптах выше?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Работа с таблицей
« Ответ #6 : 05 Марта 2020, 19:54:14 »
Если ячейка привязана к переменной, то в эту ячейку автоматически будет выводиться значение этой переменной. Если нужно вывести произвольный текст, то связь с переменной нужно убрать и использовать код из нашего предыдущего сообщения, для вставки текста.

Vitalii_Popovych

  • Новичок
  • *
  • Сообщений: 13
    • Просмотр профиля
Re: Работа с таблицей
« Ответ #7 : 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.