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

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