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

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

Автор Тема: Вопрос по отчётам  (Прочитано 4978 раз)

EvgeniySM

  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Вопрос по отчётам
« : 26 Сентября 2019, 06:50:42 »
Всем привет.

Подскажите кто уже реализовал, подобное. Есть некий агрегат, который вырабатывает электроэнергию, переменная этой выработанной электроэнергии пишется в базу и по ней строится тренд, единица измерения - МВт/ч. Нужно сделать отчёт, в котором формировалась бы накопленная электроэнергия за заданный промежуток времени - начиная от нескольких минут, заканчивая несколькими сутками. Промежуток времени задаётся пользователем.

И ещё вопрос - можно ли подробнее рассказать и привести пример про вид обработки переменной "Интеграл"? В справке написано, что считается интеграл по всем значениям в заданном интервале, но что делать тем, кто учил математику очень давно и не совсем понимает, что это значит?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: Вопрос по отчётам
« Ответ #1 : 26 Сентября 2019, 09:27:57 »
Здравствуйте.

Вам нужно создать периодический источник данных, добавить в этот источник переменную выработанной электроэнергии с типом обработки "Интеграл". После этого в источнике будет выводиться накопленная электроэнергия. Если переменную-интервал задать равной 3600 (столько секунд содержит 1 час), то источник разобьёт весь интервал за который строится отчёт (например сутки) на часы и выведет для каждого часа накопленную электроэнергию. Если переменную-интервал задать равной 0, то источник выведет всю накопленную электроэнергию за весь период отчёта (без разбивки на отдельные интервалы). Пример создания такого отчёта подробно описан здесь (разница только в типе обработки).

Цитировать
И ещё вопрос - можно ли подробнее рассказать и привести пример про вид обработки переменной "Интеграл"? В справке написано, что считается интеграл по всем значениям в заданном интервале, но что делать тем, кто учил математику очень давно и не совсем понимает, что это значит?
См. определение интеграла (изображение во вложении). Интеграл равен площади части графика функции в пределах от a до b. В Вашем случае a и b это будет время начала и время конца которое пользователь задаст перед построением отчёта. Соответственно интеграл для графика электроэнергии будет равен накопленной электроэнергии за указанный период.
« Изменён: 26 Сентября 2019, 09:31:58 от Simple-Scada »

EvgeniySM

  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: Вопрос по отчётам
« Ответ #2 : 26 Сентября 2019, 09:45:14 »
Спасибо за ответ, в целом, пока ждал его уже сам разобрался. Но есть один ньюанс - как вывести выработанную электроэнергию не за целое количесво часов, а, например за 1 час 28 минут? Ну, или просто за время, менее одного часа. Я пробовал ставить маленький интервал - всё равно выводятся данные за час.

EvgeniySM

  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: Вопрос по отчётам
« Ответ #3 : 27 Сентября 2019, 11:43:19 »
Есть ещё одни вопрос по отчётам.

Делаю периодический отчёт в точности, как показано в примере. Интервал делаю со значением 86400, т. е. целое количество секунд в сутках, так как хочу сделать вывод накопленной величины за сутки. При выборе в проекте переменной Начало одну дату, в отчёте первой строкой ставится дата ровно на день позже и данные в ней за предыдущий день. Соответственно, переменную Окончание выбираю текущий день, а данные выводятся в ней вчерашние. Как привести в соответствие всё?
« Изменён: 27 Сентября 2019, 11:47:07 от EvgeniySM »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: Вопрос по отчётам
« Ответ #4 : 28 Сентября 2019, 10:27:34 »
Я пробовал ставить маленький интервал - всё равно выводятся данные за час.
Значение переменной-интервала (в секундах) определяет на какие интервалы будет разбита вся выборка (от переменной начала до переменной конца). Результат обработки каждого интервала будет выведен отдельной строкой. Например, если переменная интервал равна 60, то будут выведены интервалы величиной в 1 минуту. Если у Вас это не работает, то вышлите нам проект на support@simple-scada.com с указанием отчёта, мы проверим что не так.

При выборе в проекте переменной Начало одну дату, в отчёте первой строкой ставится дата ровно на день позже и данные в ней за предыдущий день. Соответственно, переменную Окончание выбираю текущий день, а данные выводятся в ней вчерашние. Как привести в соответствие всё?
Это правильно, т.к. по-умолчанию в каждой строке периодического источника данных, в колонке "Время" выводиться время на конец интервала. При желании Вы можете сместить отображаемое время в колонке "Время". Для этого дважды кликните компонент который отвечает за вывод времени и в открывшемся окне впишите такое выражение:
{Источник_1.Время.AddSeconds(-Интервал_1)}
, где Источник_1 - имя источника данных, Время - имя колонки с временем, Интервал_1 - переменная отвечающая за интервал периодического источника данных.
После этого в колонке "Время" будет выводиться время начала интервала.
« Изменён: 28 Сентября 2019, 10:28:58 от Simple-Scada »

EvgeniySM

  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: Вопрос по отчётам
« Ответ #5 : 30 Сентября 2019, 08:17:55 »
Спасибо за советы, всё получается. По поводу вывода данных менее, чем за час пока неактуально, как будет нужда, будем разбираться. Теперь есть такой вопрос. Зачастую, при работе скады и опросе приборов случаются разные проишествия, при которых связь с прибором прерывается и в базу пишутся не совсем нужные данные. При восстановлении связи всё приходит в норму. При просмотре трендов видны подобные ньюансы, как в прикреплённой картинке. Здесь приведён график потребления электроэнергии за сутки. Видно, что трижды были проблемы с опросом прибора и данные записаны некорректные. И ещё конец интервала сдвинут, обнуление данных произошло не в 23:59:59 а чуть ранее. При построении отчёта отчёта получается дилемма - с каким типом обработки взять эту переменную? Если взять Максимум, то получается заоблачные величины, если взять Последнее значение, то получается очень мало, так как значения обнулились раньше чем надо и на начало интервала выходят данные за следующий интервал. Как указать то, что нужно взять максимум за интервал, исключая выпадения в значения, превышающие предел шкалы?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: Вопрос по отчётам
« Ответ #6 : 01 Октября 2019, 10:20:13 »
Цитировать
При просмотре трендов видны подобные ньюансы, как в прикреплённой картинке. Здесь приведён график потребления электроэнергии за сутки. Видно, что трижды были проблемы с опросом прибора и данные записаны некорректные.
Судя по графику, по каким-то причинам значение при разрыве связи с прибором значительно увеличивается. Почему так происходит - трудно сказать, обычно при проблемах с устройством значение падает на 0. Каким-то примитивным способом исключить эти значения из периодического источника не получится. Такой источник берёт все архивные данные за период и использует их в расчётах. Для фильтрации данных есть только фильтрация по другой переменной и в данной ситуации она не подходит.
Поэтому можно рассмотреть создание отдельной переменной с отфильтрованными данными в скаде. Допустим, что наша архивируемая переменная, которую нужно "исправить" имеет имя vrTrend. Тогда нужно проделать следующие шаги:
1. Выключить архивацию у переменной vrTrend;
2. Создать новую внутреннюю переменную с именем vrTrendFilter с тем же типом данных и шкалой что и vrTrend. Включить архивацию у переменной vrTrendFilter;
3. Создать новый скрипт с типом события "Изменились переменные" и добавить в него переменную vrTrend. Теперь этот скрипт будет выполняться по изменению переменной vrTrend. Реализовать в коде скрипта копирование всех значений vrTrend в переменную vrTrendFilter исключая "некорректные" значения. Например:
Код: (delphi)
begin
  if (vrTrend.AsInt > 10000) then
    vrTrendFilter.Value := 0
  else
    vrTrendFilter.Value := vrTrend.Value;
end.
Здесь вместо значений > 10000 в переменную vrTrendFilter запишется 0. Все остальные значения будут скопированы из vrTrend.
Далее остаётся использовать архивные данные переменной vrTrendFilter для вывода трендов и в отчётах.

EvgeniySM

  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: Вопрос по отчётам
« Ответ #7 : 02 Октября 2019, 06:41:09 »
По сути, у меня сейчас так и сделано, переменная, полученная со счётчика умножается на константу и пишется в базу. Скорее всего, в определённые моменты времени со счётчика приходит значение, больше чем обычно, и дополнительное умножение даёт столь высокие значения. Почему так происходит, непонятно, буду разбираться. Фильтровать значения, ограничивая максимум конечно можно, но нулевые значения тоже не совсем хорошо. В реальности значения есть, и наиболее вероятно, что они не сильно отличаются от измерений, сделанных пару секунд назад. Отсюда напрашивается вывод - для обработки таких некорректных измерений нужно присваивать прошлое корректное измерение. Надо подумать над таким скриптом...
А вообще, было бы неплохо в редактор отчётов добавить возможность пользовательского типа обработки массива данных за выбранный интервал, тогда можно было писать некие скрипты, исключающие выпадение данных из общей картины из-за потерь связи и некорректных измерений.