Здравствуйте.
Чтобы получить данные переменной за прошлое время, нужно включить архивацию с типом "по-изменению" у переменной и затем брать прошлое значение из архива при помощи
процедуры ArchiveValueByTime. Также в Вашем случае нужно использовать скрипт-таймер для пересчёта каждую минуту. Далее решение задачи по шагам:
1. Включить архивацию "по-изменению" у основной переменной, допустим её имя vrMain;
2. Создать отдельную внутреннюю переменную с тем же типом данных (в неё будем получать значение из архива). Назовём её vrArchive;
3. Создать отдельную внутреннюю переменную с типом данных Integer (будем использовать для отсчёта минут). Назовём её vrMinute;
4. Создать скрипт с типом события "прошла секунда" и получать в нём архивное значение 24 часа назад. Для этого используем такой код:
var
aDate: TDateTime;
begin
vrMinute.Value := vrMinute.Value + 1; // накапливаем секунды в vrMinute
if vrMinute.Value >= 60 then // если накоплено 60 сек.
begin
aDate := IncHour(Now, -24); // текущие дата и время минус 24 часа
{ извлечь из архива значение переменной "vrMain" в отметке времени "aDate" и записать результат в переменную "vrArchive" }
ArchiveValueByTime(vrMain, vrArchive, aDate);
vrMinute.Value := 0; // сбрасываем счётчик секунд
end;
end.
5. Создать скрипт
с типом события "Изменились переменные", добавить в него переменную vrArchive и реализовать в нём нужный пересчёт:
var
aCalc: Double;
begin
{ в этом скрипте нужно реализовать пересчёт.
vrMain.Value - значение основной переменной;
vrArchive.Value - значение основной переменной 24 часа назад; }
// вычисляем разницу между текущим значением переменной и её значением 24 часа назад
aCalc := vrMain.Value - vrArchive.Value;
end.
Учитывайте, что во время перезапусков сервера (или когда проект приостановлен) архивация не ведётся и следовательно архивных данных за этот момент времени не будет, а значит вся эта система будет работать только если проект будет работать стабильно без перерывов более 24 часов. Если не нужна зависимость от скады, то нужно делать такую систему в программе контроллера.
Также учитывайте, что функция ArchiveValueByTime является асинхронной, т.е. она создаёт запрос к БД и ждёт пока он выполнится. Не гарантируется что он всегда будет выполняться моментально. Например, если СУБД нагружена какими-то другими запросами, то ей может понадобиться какое-то время на их выполнение и результат ArchiveValueByTime будет выдан с какой-то задержкой.