Пожалуйста, включите JavaScript для просмотра этого сайта.

Скрипты Simple-Scada

История: Примеры скриптов > Работа с архивом

Работа с архивными процедурами

Пред. Вверх След. Еще

Допустим, в проекте имеется переменная vrArcValue с включенной архивацией. Нужно по нажатию на кнопку вычислить минимум / максимум за последние 30 минут и записать результат во внутренние переменные vrArcMin, vrArcMax.

Для решения задачи, на событие OnClick кнопки необходимо назначить следующий скрипт:

var
  aFrom, aTo: TDateTime;
begin
  aFrom := IncMinute(Now, -30);
  aTo := Now;
 
  // запускаем вычисление мин. и макс. по переменной vrArcValue
  ArchiveMin(vrArcValue, vrArcMin, aFrom, aTo);     // минимум запишется в переменную vrArcMin
  ArchiveMax(vrArcValue, vrArcMax, aFrom, aTo);     // максимум запишется в переменную vrArcMax
 
  // здесь результат вычисления может быть неизвестен! 
  // поэтому работать с переменными vrArcMin, vrArcMax здесь нельзя.
end.

Теперь, после нажатия на кнопку, сервер Simple-Scada сделает запрос к СУБД, выполнит вычисления и автоматически запишет результат в переменные vrArcMin, vrArcMax.

Обратите внимание на последний комментарий в примере кода выше. Архивные процедуры не выполняются мгновенно. Скорость их выполнения зависит от производительности ПК, загруженности СУБД, качества связи между сервером Simple-Scada и СУБД. Поэтому, после вызова архивных процедур, скрипт продолжит выполняться, но результат вычислений в переменные vrArcMin, vrArcMax может записаться позже (!), например через секунду после полного выполнения скрипта.

Но что делать, если требуется обработать результат выполнения архивных процедур в скриптах? Для этого нужно использовать группировку через ArchiveGroupBegin/ArchiveGroupEnd и событие "Выполнены архивные процедуры". Изменим код следующим образом:

var
  aFrom, aTo: TDateTime;
begin
  aFrom := IncMinute(Now, -30);
  aTo := Now;
 
  // запускаем вычисление мин. и макс. по переменной vrArcValue
  ArchiveGroupBegin(1);                             // добавляем все последующие вызовы архивных процедур в группу с тегом = 1 
  ArchiveMin(vrArcValue, vrArcMin, aFrom, aTo);     // минимум запишется в переменную vrArcMin
  ArchiveMax(vrArcValue, vrArcMax, aFrom, aTo);     // максимум запишется в переменную vrArcMax
  ArchiveGroupEnd;                                  // заканчиваем группировку архивных процедур
end.

Все вызовы архивных процедур между ArchiveGroupBegin и ArchiveGroupEnd будут объединены в группу с заданым тегом (в данном случае = 1).

Теперь создадим новый скрипт с типом события "Выполнены архивные процедуры" и следующим кодом:

begin
  // если группа архивных процедур с тегом = 1 выполнилась
  if ArcGroupTag = 1 then
    // выводим результаты в компонент "Text1"
    Text1.Text := 
      'Мин.: ' + vrArcMin.AsStr + #13#10 +
      'Макс.: ' + vrArcMax.AsStr;
end.

Событие "Выполнены архивные процедуры" выполнится только когда вся группа архивных процедур будет полностью вычислена. Поэтому в скрипте по данному событию, в переменных результата vrArcMin, vrArcMax точно будет содержаться результат вычислений и можно будет работать с ним в скрипте.