Допустим, в проекте имеется переменная 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 точно будет содержаться результат вычислений и можно будет работать с ним в скрипте.