Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: Timothy Clement от 16 Ноября 2021, 08:51:47

Название: Периодический отчёт из своего источника с разбивкой на интервалы
Отправлено: Timothy Clement от 16 Ноября 2021, 08:51:47
Добрый день!
Стоит задача сделать отчёт из архивных данных таблицы trends_data. Туда пишут показания счётчики, необходимо построить отчёт за период, выбрав показания на начало интервала, на конец интервала и разницу за интервал (расход) в рамках периода. С отчётом из стандартного источника всё понятно, задаём переменные начала, конца и интервала и добавляем архивные теги с нужной выборкой, всё красиво. НО, появилась необходимость сделать отчёт гибко настраиваемый пользователем, в котором заранее неизвестно сколько переменных будет использоваться - может 1, а может 25. И их можно постоянно менять из интерфейса программы. Тут уже стандартный источник не подходит, т.к. даже если задать динамическую адресацию, количество переменных фиксированное и просто будет оставаться куча пустых строк. Создавать десятки отчётов на все возможные варианты тоже не решение, поэтому было решено использовать источник MySQL и запрос:
Код: (sql)
SELECT round(MIN(value),2) AS minVal, round(MAX(value),2) AS maxVal, 
   round(MAX(value),2) - round(MIN(value),2) AS aEnergy    
FROM trends_data
WHERE id IN(
   SELECT idvar FROM areas WHERE idarea = @area
)
&& timestamp BETWEEN @tstart AND @tend
&& quality = 1
GROUP BY id
В запросе получаем значение на начало периода, конец периода и разницу значений. ID переменных получаем вложенным запросом из своей таблицы (в ней то и будет пользователь выбирать нужные ему счётчики). Отчёт строится, например за час, но как сделать отчёт за сутки с разбивкой на заданные интервалы (например час)? Понимаю что нужно вычислить для каждого интервала какое-то общее значение времени в рамках часа например и группировать по нему. Но как реализовать пока непонятно, жду ваших предложений.
Название: Re: Периодический отчёт из своего источника с разбивкой на интервалы
Отправлено: Серега от 16 Ноября 2021, 11:53:48
Добрый день!
Может вот это подойдет:
https://simple-scada.com/help/report/timeperiodic.html
Название: Re: Периодический отчёт из своего источника с разбивкой на интервалы
Отправлено: Timothy Clement от 16 Ноября 2021, 15:33:51
Добрый день!
Может вот это подойдет:
https://simple-scada.com/help/report/timeperiodic.html
Нет, в руководстве ответов не нашел. Задача состоит в том, чтобы воспроизвести Периодический отчёт с помощью sql-запроса, разделив период на заданные интервалы
Название: Re: Периодический отчёт из своего источника с разбивкой на интервалы
Отправлено: pan2000 от 17 Ноября 2021, 08:09:50
   Здравствуйте.

Использование минимума и максимума значений кое-как приемлемо для всего периода. Разделение периода на интервалы приведет к тому, что сумма расходов будет меньше расхода за период, т.к. максимум значения показаний счетчика в предыдущем интервале будет меньше минимума показаний в последующем (для возрастающей последовательности).
Как вариант решения - временная таблица, генерируемая скриптом (скриптами), который повторяет "кухню" построения периодического отчета:
- организация цикла по ID пользовательской таблицы;
- получение архивных значений переменной на границах интервалов;
- запись необходимых данных очередного интервала в таблицу.
При фиксированных значениях границ интервала (например, на начало каждого часа) можно использовать постоянную таблицу, данные в которую добавляются каждый час.
Название: Re: Периодический отчёт из своего источника с разбивкой на интервалы
Отправлено: Timothy Clement от 17 Ноября 2021, 08:33:25
При фиксированных значениях границ интервала (например, на начало каждого часа) можно использовать постоянную таблицу, данные в которую добавляются каждый час.
В таблице trends_data у меня содержатся и архивные данные записанные из скады, и данные которые я туда пишу скриптами каждые полчаса с фиксированной меткой времени 00, 30 минут.
Я немного модифицировал запрос, чтобы сгруппировать данные по часам - разделил метки времени переведенные в число на 3600 и оставил целую часть. Получились часы, но туда входят данные до 59:59, а следующее значение записано в 00:00 и в нужный интервал не попадает.
Код: (sql)
SELECT round(MIN(value),2) AS minVal, round(MAX(value),2) AS maxVal, 
round(MAX(value),2) - round(MIN(value),2) AS aEnergy,
timestamp,
floor(time_to_sec(timestamp)/3600) as period    
FROM trends_data
WHERE id IN(
  SELECT idvar FROM areas WHERE idarea = @area
)
&& timestamp BETWEEN @tstart AND @tend
&& quality = 1
GROUP BY id, period

В отчете созданном из стандартного источника всё хорошо, с запросом беда  :'(
Название: Re: Периодический отчёт из своего источника с разбивкой на интервалы
Отправлено: Simple-Scada от 17 Ноября 2021, 09:51:04
Здравствуйте.

Как должен выглядеть отчет для нескольких переменных? Для каждой переменной должны добавляться новые колонки в отчет (т.е. он должен расти горизонтально, чем больше переменных, тем шире)?
Или должен расти вертикально? Т.е. сначала выводим данные для одной переменной, затем итог по ним, затем отступ и то же самое для другой переменной?
Название: Re: Периодический отчёт из своего источника с разбивкой на интервалы
Отправлено: Timothy Clement от 17 Ноября 2021, 10:07:57
Данные будут расти вертикально, с группировкой всех переменных по интервалу:
Время 00:00 - 01:00
Переменная 1 - первое значение, последнее значение, разница
Переменная 2 - первое значение, последнее значение, разница
...
Переменная n - первое значение, последнее значение, разница
Итог сумма разницы всех переменных за период
Время 01:00 - 02:00  и т.д.

Есть готовый отчёт из стандартного источника, хочу реализовать так же с возможностью изменять переменные и их количество из интерфейса пользователем
Название: Re: Периодический отчёт из своего источника с разбивкой на интервалы
Отправлено: Simple-Scada от 18 Ноября 2021, 10:27:37
Можно попробовать выполнять несколько выборок и затем объединять их в одну. Вот пример объединения двух простых выборок:
Код: (sql)
(
  select * from `trends_data`
  where (`id`=1) and (`timestamp` = '2021-11-14 12:50:02.325')
) UNION (
  select * from `trends_data`
  where (`id`=1) and (`timestamp` = '2021-11-14 12:50:06.335')
)
Какого-то простого решения для данной задачи мы не видим. Лучше всего было бы решить её используя стандартные источники, но для этой задачи они не предусмотрены и непонятно как можно было бы их улучшить, чтобы они подходили для решения (и при этом оставались простыми в настройке).
Название: Re: Периодический отчёт из своего источника с разбивкой на интервалы
Отправлено: Timothy Clement от 18 Ноября 2021, 11:02:16
Хорошо, спасибо. Видимо придется оставить возможность формировать такой отчёт только за 1 отрезок - час, день, месяц без выборки периода. Надеюсь пользователей это устроит, на крайний случай сделаю 25-30 вариантов отчётов из стандартного источника с динамическими переменными с фиксированным количеством, и буду формировать нужный :) 
Название: Re: Периодический отчёт из своего источника с разбивкой на интервалы
Отправлено: pan2000 от 22 Ноября 2021, 21:56:29
    Здравствуйте.
 
Отчет с произвольным количеством переменных можно создать с использованием промежуточных таблиц в Simple-Scada уже со статическими данными и последующим использованием их в редакторе отчетов.
Вначале строится таблица отфильтрованная по индексам переменных, качеству и временному периоду отчета. Далее - таблица минимального и максимального значений переменных на интервале. Окончательная фильтрация выполняется при построении отчета.
Во вложении пример такого отчета. Пример позволяет выбрать переменные и период построения отчета. Отчет содержит данные для двух первых часовых интервалов (это пример) и итоговые значения суммарного расхода по переменным. Таблица минимального и максимального значений доступна для просмотра.
И ещё раз об отдельной таблице для хранения значний переменных точно по границам учетных интервалов (например, часов), не положено записывать свои данные в таблицу trends_data:
Записывать какие-либо значения в таблицы скады нельзя - это может привести к нарушению структуры БД, проблемам в отображении трендов, проблемам в работе архивных функций и т.д. Если требуется сохранять какие-либо значения в БД, то для этого нужно создать свою таблицу в БД и работать с ней, например как описано по ссылке (https://simple-scada.com/help/script/dbwrtime.html).
Название: Re: Периодический отчёт из своего источника с разбивкой на интервалы
Отправлено: Timothy Clement от 23 Ноября 2021, 11:21:28

И ещё раз об отдельной таблице для хранения значений переменных точно по границам учетных интервалов (например, часов), не положено записывать свои данные в таблицу trends_data


Добрый день, спасибо за пример. Т.к. максимально до 20 объектов в отчете, я уже сделал 20 разных отчётов с динамическими переменными. Все же выборка первого и последнего значения работает лучше чем MIN и MAX в запросе. И если не нужно будет строить тренды по этим архивным данным или использовать функции работы с архивом, то никаких проблем с записью в таблицу trends_data нет, это тоже озвучивалось администратором на форуме.
Название: Re: Периодический отчёт из своего источника с разбивкой на интервалы
Отправлено: Nikso от 25 Ноября 2021, 10:14:48
Можно покапать в сторону оконных функций