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

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

Автор Тема: Специфичный запрос архивных данных  (Прочитано 47216 раз)

Savir

  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
Здравствуйте уважаемые коллеги, прошу натолкнуть на путь реализации отчёта/вывода:
Есть партия материала которая несколько дней находится поочередно в разных камерах где замеряется ее температура, данной партии присваивается номер, и далее она перемещается под этим номером раз в несколько дней в разные камеры, задача в любой момент времени сформировать отчёт или просто, даже лучше на отдельной вкладке отображать какое количество часов при определенной температуре например 20 грудусов совокупно была эта конкретная партия. Спасибо

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3210
    • Просмотр профиля
    • Simple-Scada
Re: Специфичный запрос архивных данных
« Ответ #1 : 20 Января 2026, 15:55:04 »
Здравствуйте.

Можно сделать так:
1. Для каждой камеры создать отдельную внутреннюю переменную типа Boolean, например: vrRoom1, vrRoom2, vrRoom3 и т.д.. Включить у них архивацию по изменению;
2. Когда партия находится в камере 1, в переменную vrRoom1 записывать 1, в остальные 0. Когда партия в камере 2, в переменную vrRoom2 записывать 1, в остальные 0 и т.п.;
В отчете создать источник типа "Периодический", добавить в него переменные vrRoomXX с типом обработки "время вкл." и в источнике автоматически отобразится время в течение которого партия находилась в каждой отдельной комнате.

Можно отобразить и на мнемосхеме. Чтобы вычислить время, нужно использовать процедуру ArchiveTimeOn.
Например:
Код: (delphi)
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 часа.

Savir

  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
Re: Специфичный запрос архивных данных
« Ответ #2 : 20 Января 2026, 17:04:31 »
Здравствуйте, спасибо за ответ, это ценное решение части вопроса, также я решил сделать тестовую таблицу с тремя колонками, порядковый номер, температура и номер партии, раз в 10 мин. (этого достаточно будет выполнять скрипт дообавлющий в бд строки с текущими данными), потом при необходиомсти запроса (on click) выполнятеся скрипт:
Код: (delphi)
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 мин получаем суммарное время нахождения при заданной температуре ОТ и ДО и номера партии, остальное уже детали.
Следущий этап это создание записи в БД, но мысли реализации есть, позже добавлю пост. Вообщемто все есть в ваших мануалах главное фантазию спроецировать на свои требования.
спасибо
« Изменён: 20 Января 2026, 17:05:47 от Simple-Scada »

Savir

  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
Re: Специфичный запрос архивных данных
« Ответ #3 : 05 Февраля 2026, 09:51:58 »
Может кому пригодится.
скрипт типа таймер интервал 600сек (в моем случае)
komp база данных созданная с тремя столбцами tme, temp, part (время, температура, номер партии),
VALUES (NOW() - время сейчас
QuotedStr(b1sr.AsStr) значение переменной b1sr (температура)
QuotedStr(b1part.AsStr) значение переменной b1part (партия)

Код: (delphi)
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 мин, записывается строка.

скрипт типа нажали кнопку
Код: (delphi)
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, с условиями

скрипт для вывода значение в поле
Код: (delphi)
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.
уверен можно лучше и элегантнее, но как для примера понимания, на мой взгляд норм
« Изменён: 05 Февраля 2026, 11:11:22 от Simple-Scada »

Savir

  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
Re: Специфичный запрос архивных данных
« Ответ #4 : 09 Февраля 2026, 10:09:53 »
Здравствуйте коллеги, вопрос, есть ли возможность реализовать такой вариант хранения/извлечения отчетов,данных:
Имеем процедуру длительностью около недели +-, в течении которой каждые 5 мин. происходит запись значения датчиков температур, и положения вентиляционных заслонок, данные представленны в виде тренда. Т.е. при запуске партии сохраняется файл с датой в имени, ну как пример,а после закрытия партии, он доступен для просмотра в виде тренда как и ряд последующих потом отчетов/файлов.

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1385
    • Просмотр профиля
Re: Специфичный запрос архивных данных
« Ответ #5 : 09 Февраля 2026, 16:42:05 »
Здравствуйте.

Пример автоматического формирования отчёта рассмотрен по ссылке. Аналогично можно формировать отчёт после закрытия партии. Если время запуска/остановки партии известно заранее, то используйте его в качестве времени начала/конца отчета. Если время запуска/остановки партии неизвестно, то при запуске партии записывайте текущее время в переменную начала отчета, при остановке партии записывайте текущее время в переменную конца отчета и затем формируйте требуемый отчет.

Отчёты можно открывать для просмотра, распечатывать, сохранять на клиентских ПК или на сервере, отправлять по E-mail или Telegram - подробнее см. по ссылке. Пример вывода трендов в отчёт см. по ссылке.

Цитировать
в течении которой каждые 5 мин. происходит запись значения датчиков температур, и положения вентиляционных заслонок
Если речь о штатной системе архивации, то рекомендуем ознакомиться с описанием типов архивации по ссылке. В Simple-Scada все доступные типы архивации основаны на изменении значения переменной. Если переменная не меняла свое значение, то новая точка тренда не будет создана/записана в БД независимо от типа архивации (это позволяет экономить место в БД). Точки трендов создаются только при изменении переменной. Например, даже если установить тип архивации "По времени" и задать интервал в 5 мин, то новое значение переменной будет записано в архив только при изменении значения переменной, если прошло больше времени (от последней добавленной в архив точки), чем указано в параметре "Интервал архивации". Если в отчете необходимо формировать строки с интервалом 5 мин., то используйте периодический отчет с интервалом 300 сек.