Пожалуйста, включите JavaScript для просмотра этого сайта.

Отчеты Simple-Scada

История: Примеры отчетов

Отчет по циклам

Пред. Вверх След. Еще

Рассмотрим процесс производства некоторого изделия. Сначала оператор задает уставки уровня и температуры, затем запускает цикл производства изделия. В ходе цикла реальные уровень и температура меняются, стремясь к заданным оператором уставкам. Через какое-то время цикл завершается, изделие готово. Оператор может ввести новые уставки и запустить новый цикл и т.д. В этом примере мы рассмотрим создание отчета, в котором для каждого цикла будет выведено время начала и конца цикла, график изменения уровня и температуры в ходе цикла и их минимальные и максимальные значения.

Создаем новый проект в редакторе, настраиваем подключение к БД, переходим в Редактор переменных через меню "Переменные" -> "Редактировать" и создаём необходимые переменные - их будет девять:

 

Переменная

Тип данных

Описание

vrCycleState

Boolean

Переменная статуса цикла. Эта переменная устанавливается в "True", когда оператор запускает цикл и становится "False", когда цикл завершается.

vrCycleStart

DateTime

Переменная, в которую записывается время старта цикла.

vrCycleEnd

DateTime

Переменная, в которую записывается время конца цикла.

vrSetLevel и vrSetTemperature

Single

Уставки Уровня и Температуры соответственно. Задаются оператором перед запуском цикла.

vrLevel и vrTemperature

Single

Текущие значения Уровня и Температуры в ходе цикла. Приходят в скаду от соответствующих датчиков.

vrFrom и vrTo

DateTime

Переменные, которые определяют интервал времени для отчета.

 

Обратите внимание, у всех переменных кроме "vrCycleState", "vrFrom" и "vrTo" включена архивация "По-изменению". Это важно, так как в отчете мы будем работать с архивными данными! Также необходимо обязательно реализовать своевременное изменение переменных "vrCycleStart" и "vrCycleEnd". В переменную "vrCycleStart" нужно записывать время старта цикла, а в переменную "vrCycleEnd" время конца цикла. Можно производить запись из скады, например выполнять такой код при запуске цикла:

begin
  vrCycleStart.Value := Now;
end.

 

И такой код при завершении цикла:

begin
  vrCycleEnd.Value := Now;
end.

 

Теперь создадим интерфейс проекта:

 

Все поля и уровни связаны с соответствующими переменными. Календари "Начало" и "Конец" связаны с переменными "vrFrom" и "vrTo" соответственно. Интерфейс готов, можно запустить проект и выполнить несколько циклов с разными уставками уровня и температуры, чтобы данные попали в БД (мы запустили три цикла). Так нам будет удобнее разрабатывать отчёт и использовать предпросмотр отчёта.

Приступим к созданию отчёта. Запустим редактор отчётов (Reports.exe), выберем наш проект и создадим новый отчёт с именем "Отчет_по_циклам".  Затем добавим в отчет новый источник данных через меню "Источники" - "Новый источник данных":

 

Назовем этот источник "Циклы" - имена переменных начала и конца автоматически изменятся на "Циклы_Начало", "Циклы_Конец". Слой оставим "основной", а "Тип источника" выберем "по-изменению". Нажмем кнопку "Создать":

 

Источник создан. Теперь можно добавить в него параметры циклов, т.е. переменные "vrCycleStart" (начало цикла), "vrCycleEnd" (конец цикла), "vrSetLevel" (заданный уровень) и "vrSetTemperature" (заданная температура). Для этого делаем клик правой кнопкой мыши по переменной и выбираем пункт "Добавить в источник". Имена переменных оставим без изменений:

   

После добавления всех переменных источник данных должен выглядеть так:

Добавим ещё один источник данных для значений переменных. Назовём источник "Значения", тип выберем "По-изменению".

Добавим в этот источник переменные "vrLevel" и "vrTemperature". Теперь в словаре источники выглядят так:

 

Осталось связать переменные проекта "vrFrom" и "vrTo" с переменными источников. Для этого делаем клик ПКМ по переменной проекта и выбираем пункт "Связать с переменной". Таким образом, связываем переменную  проекта "vrFrom" с переменными отчета "Циклы_Начало" и "Значения_Начало", а "vrTo" связываем с "Циклы_Конец" и "Значения_Конец".  Теперь источники данных будут работать только с данными из диапазона определённого переменными "vrFrom" и "vrTo".

Перетянем источник данных "Циклы" на страницу отчета. В открывшемся окне включим флажки "Заголовок данных" и "Итог данных" для создания соответствующих бэндов. В источнике выберем все колонки, кроме колонки "Время". При помощи кнопок с иконками стрелок зададим правильную последовательность колонок: vrCycleStart, vrCycleEnd, vrSetLevel, vrSetTemperature.

 

Бэнды появились на странице отчета. Переименуем колонку "vrCycleStart" в "Начало цикла", "vrCycleEnd" в "Конец цикла", "vrSetLevel" в "Заданный уровень", "vrSetTemperature" в "Заданная темп.". Используя панель форматирования выровняем надписи в ячейках по центру и включим заливку ячеек в заголовке.

 

Теперь можно проверить отчёт. У нас в БД уже есть данные трёх циклов, т.к. мы запускали эти циклы перед созданием отчёта. Запустим сервер скады и подключимся к нему клиентом. В календарях "Начало" и "Конец" установим интервал времени, в котором мы запускали циклы. Вернёмся в Редактор отчётов и нажмём зеленую кнопку обновления данных:

 

Сервер передаст в Редактор отчётов данные циклов за заданный интервал времени. Перейдём к просмотру отчета:

 

Мы запускали всего три цикла с разными уставками уровня и температуры, но в бэнде данных строк намного больше и многие строки похожи друг на друга. Дело в том, что при создании источника "Циклы" мы выбрали тип источника "По-изменению" - это значит, что новая строка добавляется в бэнд при изменении любой из переменных источника. Нам же нужно, чтобы новая строка выводилась в бэнд только при завершении очередного цикла, т.е. по-изменению переменной "vrCycleEnd". Откроем список источников через пункт меню "Источники". Выделяем строку с источником "Циклы" и нажимаем кнопку "Изменить" (либо можно дважды кликнуть строку с источником). В окне "Редактировать источник данных" нажимаем кнопку "выбрать активные":

 

В окне выбора столбцов нужно оставить включенной только переменную vrCycleEnd, а остальные переменные выключить. Двойной клик левой кнопкой мыши по строке с переменной включает/выключает её.

Закрываем окна редактирования источника и нажимаем кнопку обновления данных:

 

Снова переходим к просмотру отчета. Теперь данные циклов отображаются правильно и строка добавляется в бэнд только по завершении цикла:

 

Нужно учитывать, что в архив могут попасть значения на момент инициализации переменных начала цикла (vrCycleStart) и конца цикла (vrCycleEnd). Необходимо исключить эти значения из отчета. Для этого в редакторе переменных у переменной vrCycleEnd необходимо установить опцию "Начальное значение" = 0:

 

Затем можно вернуться в редактор отчетов, сделать клик правой кнопкой мыши по верхней части бэнда "DataЦиклы" и нажать на иконку редактирования бэнда:

 

В открывшемся окне переходим на вкладку "Фильтры" и добавляем новый фильтр по колонке vrCycleEnd, как показано ниже:

 

Теперь в отчет не попадут циклы со значениями полученными при инициализации и останутся только реальные циклы.

Выведем в отчёт график изменения уровня и температуры для каждого цикла. Растянем бэнд данных по высоте и разместим в нём диаграмму "Линия":

 

После этого откроется окно "Редактор диаграмм" (если окно не открылось, то дважды кликните по созданной диаграмме ЛКМ). В нижней левой части редактора диаграмм расположена кнопка "Запустить мастер диаграмм". Нажмём её. В окне мастера выберем "Тип диаграммы" -> "Линия":

 

На вкладке "Стиль" выбираем любой понравившийся стиль. На вкладке "Ряды" создаём два новых ряда "Линия":  

 

Первый ряд именуем "Уровень", выбираем колонку аргумента "Значения.Время", а колонку величин "Значения.vrLevel". Аналогично второй ряд называем "Температура", выбираем колонку аргумента "Значения.Время", а колонку величин "Значения.vrTemperature".

 

В остальных шагах мастера диаграмм ничего не меняем. После завершения мастера диаграмм снова дважды кликаем по диаграмме, переходим на вкладку "Область" -> "Ось X" и устанавливаем свойство формат "HH:mm:ss".

 

Далее, необходимо задать фильтрацию данных для графиков. Для этого переходим на вкладку "Ряды" -> "Основные" и выделяем ряд "Уровень Линия":

 

Теперь переходим на вкладку "Фильтры" и добавляем новый фильтр. Значение фильтра должно быть таким:

(Значения.Время >= Циклы.vrCycleStart) && (Значения.Время <= Циклы.vrCycleEnd)

 

 

При помощи фильтра мы оставляем на графике только те точки, которые входят в диапазон конкретного цикла. Обратите внимание, фильтр нужно задавать для каждого графика. Поэтому, те же действия проделываем для ряда "Температура Линия". Теперь при просмотре отчета мы видим параметры цикла, а также графики уровня и температуры:

 

Для каждого цикла помимо графиков, нужно вывести также минимальное и максимальное значения. Для этого перетянем на страницу источник данных "Значения". Отметим все колонки и флажок "Итог данных":

 

На странице отчета появились соответствующие бэнды. Для решения поставленной задачи нужно сделать бэнд "DataЗначения" подчинённым бэнда "DataЦиклы". Делаем клик ПКМ по верхней части бэнда "DataЗначения" и нажимаем на иконку редактирования бэнда.

 

На вкладке "Мастер компонент" выбираем бэнд "DataЦиклы" и нажимаем "ОК":

 

Теперь бэнд "DataЗначения" будет выводиться после каждого цикла. Но нам не требуется выводить его в отчет - он необходим только для вычисления итогов. Поэтому нужно исключить этот бэнд и не выводить его.  Для этого удаляем из бэнда все "ячейки":

 

После этого уменьшаем высоту бэнда "DataЗначения" до нуля. Так должен выглядеть шаблон отчёта в итоге:

 

Осталось организовать вычисление минимума и максимума для каждого цикла. Для этого подойдёт бэнд итогов "FooterЗначения". Разместим в нем восемь компонентов "Текст". Четыре для подписей и четыре пустых для значений:

 

В пустых полях нужно реализовать вычисление значений. Для вычисления минимального уровня кликаем ПКМ соответствующее поле и нажимаем иконку редактирования:

 

В открывшемся окне переходим на вкладку "Итог", выбираем функцию "Min", включаем флажок "Условие" и вписываем код условия, который уже использовали ранее:

(Значения.Время >= Циклы.vrCycleStart) && (Значения.Время <= Циклы.vrCycleEnd)

 

Те же действия проделываем для трёх оставшихся полей (для вычисления максимума используем функцию Max). Далее, для каждого из этих полей нужно настроить формат. Для этого можно кликнуть ПКМ по полю и нажать иконку форматирования в контекстном меню. В открывшемся окне выбираем "Числовой" формат, включаем флажок "Знаков дробной части" и задаем значение = 2:

 

Отчёт готов. Так выглядит отчёт на предварительном просмотре:

 

Сохраним отчёт через "Меню -> Сохранить" и вернёмся к Редактору проекта. Напишем скрипт на событие "OnClick" для кнопки "Построить отчёт":

var
  aReport: TM_Report;
begin
  aReport := ReportBuild('Отчет_по_циклам'); // строим отчет с именем "Отчет_по_циклам"
  aReport.View(GetClientName);               // открываем отчет на просмотр
end.

Теперь при нажатии на кнопку будет сформирован отчёт за период заданный в календарях. При необходимости, можно формировать отчёт и сохранять его на клиентский или серверный ПК в нужном формате - подробнее см. по ссылке.