Здравствуйте.
Можно сделать так:
1. Для каждой камеры создать отдельную внутреннюю переменную типа Boolean, например: vrRoom1, vrRoom2, vrRoom3 и т.д.. Включить у них архивацию по изменению;
2. Когда партия находится в камере 1, в переменную vrRoom1 записывать 1, в остальные 0. Когда партия в камере 2, в переменную vrRoom2 записывать 1, в остальные 0 и т.п.;
В отчете создать источник типа "Периодический", добавить в него переменные vrRoomXX с типом обработки "время вкл." и в источнике автоматически отобразится время в течение которого партия находилась в каждой отдельной комнате.
Можно отобразить и на мнемосхеме. Чтобы вычислить время, нужно использовать процедуру ArchiveTimeOn (https://simple-scada.com/help/script/archivetimeon.html).
Например:
var
DateStart, DateEnd: TDateTime;
begin
DateEnd:= Now; // текущие дата и время
DateStart:= IncDay(DateEnd, -1); // уменьшить дату на 1 день
// вычислить время включенного состояния переменной "vrRoom1" за период
// от "DateStart" до "DateEnd" и записать результат в переменную "MyVariableRes"
ArchiveTimeOn(vrRoom1, MyVariableRes, DateStart, DateEnd);
end.
Этот код вычислит в переменную MyVariableRes время в течение которого партия находилась в камере 1 за последние 24 часа.
Здравствуйте, спасибо за ответ, это ценное решение части вопроса, также я решил сделать тестовую таблицу с тремя колонками, порядковый номер, температура и номер партии, раз в 10 мин. (этого достаточно будет выполнять скрипт дообавлющий в бд строки с текущими данными), потом при необходиомсти запроса (on click) выполнятеся скрипт:
var
aQuery: string;
begin
aQuery := 'SELECT COUNT(*) AS total FROM Staf WHERE temp BETWEEN ' + QuotedStr(TempOt.AsStr) +
' AND ' + QuotedStr(TempDo.AsStr) + ' AND part = '+ QuotedStr(Partia.AsStr) + ' ;';
RunSQL(aQuery, nil, 1);
end.
в данном случае использую тестовую таблицу(из экселя импорт) я делаю выборку и подсчет количесва строк, зная что каждая строка 10 мин получаем суммарное время нахождения при заданной температуре ОТ и ДО и номера партии, остальное уже детали.
Следущий этап это создание записи в БД, но мысли реализации есть, позже добавлю пост. Вообщемто все есть в ваших мануалах главное фантазию спроецировать на свои требования.
спасибо
Может кому пригодится.
скрипт типа таймер интервал 600сек (в моем случае)
komp база данных созданная с тремя столбцами tme, temp, part (время, температура, номер партии),
VALUES (NOW() - время сейчас
QuotedStr(b1sr.AsStr) значение переменной b1sr (температура)
QuotedStr(b1part.AsStr) значение переменной b1part (партия)
var
aQuery: string;
begin
aQuery := 'INSERT IGNORE INTO `komp` (`tme`, temp, part) VALUES (NOW(), ' + QuotedStr(b1sr.AsStr) + ', '+QuotedStr(b1part.AsStr)+');';
RunSQL(aQuery, nil, 0);
end.
в итоге каждые 10 мин, записывается строка.
скрипт типа нажали кнопку
var
KompQuery: string;
begin
KompQuery := 'SELECT COUNT(*) AS total FROM komp WHERE temp BETWEEN ' + QuotedStr(TempKompOt.AsStr) +
' AND ' + QuotedStr(TempKompDo.AsStr) + ' AND part = '+ QuotedStr(TempKompPart.AsStr) + ' ;';
RunSQL(KompQuery, nil, 2);
end.
подсчет суммы значений столбца temp, с условиями
скрипт для вывода значение в поле
var
Chas: Integer;
Minuty: string;
begin
if DataSet.IsEmpty then Exit;
if DataSet.Tag = 2 then
begin
Minuty := DataSet.Fields[0].AsStr;
Chas := StrToInt(Minuty);
field67.Visible := True;
field67.Value := Round(chas/6);
end;
end.
уверен можно лучше и элегантнее, но как для примера понимания, на мой взгляд норм