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

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

Автор Тема: Вопрос про отображение интеграторов в отчете  (Прочитано 3764 раз)

Миханик

  • Постоялец
  • ***
  • Сообщений: 182
    • Просмотр профиля
    • www.vpa-dv.ru
Добрый день.
Подскажите несколько моментов по отчетам.
1) Почему-то неправильно берутся "Первые" и "Минимальные" значения из источника данных (видно на скрине) в периодическом отчете.
2) Если у меня в скаде архивируются интегральные значения переменной (например масса М1, М2, М3 по теплосети или тепло Q), то как сделать чтобы в периодическом отчете отображались не интегральные значения, а разница между соседними интегральными значениями? Такое вообще возможно методами отчета?
Например:
как есть     как нужно
59270,5813,55
59284,3313,75
59298,0013,67

Nikso

  • Новичок
  • *
  • Сообщений: 44
    • Просмотр профиля
Можно сделать так:
Код: (c#)
{((double)S._163_Vo_Tp3 == 0) | ((double)Previous(S, "_163_Vo_Tp3") == 0) ? "0": Round((double)S._163_Vo_Tp3 - (double)Previous(S, "_163_Vo_Tp3"), 1)}
где S._163_V0_Tp3 - интегральное значение счётчика на конец интервала.
      Previous(S._163_V0_Tp3) - интегральное значение счётчика на конец предыдущего интервала.

так как возможно, что при делении на интервалы может выпасть нулевое значение (например по каким то причинам записался 0) то делается проверка. Если одно из значений равно 0 то выводится 0 иначе выводится разность:
Код: (c#)
Round((double)S._163_Vo_Tp3 - (double)Previous(S, "_163_Vo_Tp3"), 1)
, где Round - округление до 1 знака после ","

Для итоговой строки можно использовать конструкцию
Код: (c#)
{Round((double)LastIf(S._163_Vo_Tp3) - (double)FirstIf(S._163_Vo_Tp3), 1)}
« Изменён: 15 Февраля 2019, 11:08:25 от Simple-Scada »

Миханик

  • Постоялец
  • ***
  • Сообщений: 182
    • Просмотр профиля
    • www.vpa-dv.ru
Nikso
огромное спасибо, получилось.

Вопрос только как быть с первым значением, которое получается пустым, ведь для первой строки не существует предыдущего значения?

Я пока сделал так:
Код
{PreviousIsNull(Данные,"gp201_TC_M2")
? Данные.gp201_TC_M2 - (double)First(Данные.gp201_TC_M2)
: Данные.gp201_TC_M2 - (double)Previous(Данные,"gp201_TC_M2")}

но все равно первая строка выводится пустая
« Изменён: 15 Февраля 2019, 11:42:54 от Миханик »

Миханик

  • Постоялец
  • ***
  • Сообщений: 182
    • Просмотр профиля
    • www.vpa-dv.ru
Оставшиеся вопросы:
1) Никак не могу победить пустое значение в первой строке (см. скрин).
2) Неправильно ведется подсчет в строке Итого (часов наработки должно быть 4, а не 3)
Выражение стоит такое: {(double)LastIf(Данные.gp201_TC_VHS) - (double)FirstIf(Данные.gp201_TC_VHS)}
3) В бэнде "Итог данных" неправильно берутся "Первые" и "Минимальные" значения из источника данных (из первого сообщения).

P.S. может это поможет указать мне на ошибку - данные архивируются раз в 10 минут
« Изменён: 15 Февраля 2019, 13:02:13 от Миханик »

Nikso

  • Новичок
  • *
  • Сообщений: 44
    • Просмотр профиля
Сам ещё не доделал, но вижу решение проблемы так.

При формировании отчёта необходимо отнимать один интервал.
Например если задаётся в форме интервал с 00.00 01.01.2019 по 00.00 02.01.2019. с разбивкой по 10 минут необходимо в отчёт передавать с 23.50 31.12.2018 по 00.00 02.01.2019.

Если с разбивкой 1 час то с 23.00 31.12.2018 по 00.00 02.01.2019.
и т.д.

Проще всего это сделать в скаде во время формирования условий при вызове отчёта.
Можно ли в отчёте затем убрать первую строку пока не могу ответить.
« Изменён: 15 Февраля 2019, 13:36:48 от Nikso »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3193
    • Просмотр профиля
    • Simple-Scada
Цитировать
2) Неправильно ведется подсчет в строке Итого (часов наработки должно быть 4, а не 3)
Выражение стоит такое: {(double)LastIf(Данные.gp201_TC_VHS) - (double)FirstIf(Данные.gp201_TC_VHS)}
Что представляет собой колонка gp201_TC_VHS? Значение в часах? Она аналогична колонке Время? Если да, то 20:00:00 - 17:00:00 = 3 часа. Просто не учитывается то, что первая строка это результат обработки ещё одного часа и чтобы формула работала корректно нужно просто прибавлять один час.

Цитировать
3) В бэнде "Итог данных" неправильно берутся "Первые" и "Минимальные" значения из источника данных (из первого сообщения).
Верно, ведь Вы вместо итога вынесли колонку периодического источника и видите результат вычисления её последней строки. Рассмотрим например "gp201_TC_M1_onBegin". Источник данных с типом "Периодический" берёт весь указанный пользователем диапазон времени от переменной Начала до переменной Конца. Разбивает его на равные интервалы времени (они задаются через переменную-интервал в секундах). Для каждого интервала берутся все точки которые попадают в этот интервал и для этих точек вычисляется первое значение (ведь Вы выбрали тип обработки "первое значение"). Т.е. будет получено не первое значение за весь период отчета, а весь отчет будет разбит на множество интервалов (в Вашем случае по 1 часу) и для каждого интервала будет вычислено первое значение переменной в этом интервале.
Чтобы правильно организовать вывод итогов не нужно выводить в итог колонку из источника данных, ведь Вы увидите только последнюю стоку из колонки. Вместо этого расположите в бэнде итогов объект Текст и укажите в нём расчет итога, как показано на скрине во вложении. Для первого значения используйте "First", для минимального "MinD".

Цитировать
1) Никак не могу победить пустое значение в первой строке (см. скрин).
Если это периодический источник, то первая строка должна содержать данные за период от 16:00 до 17:00, вместо пустого значения. Можете выслать текущую версию проекта с отчетами?
« Изменён: 15 Февраля 2019, 16:02:57 от Simple-Scada »

Миханик

  • Постоялец
  • ***
  • Сообщений: 182
    • Просмотр профиля
    • www.vpa-dv.ru
Что представляет собой колонка gp201_TC_VHS? Значение в часах? Она аналогична колонке Время? Если да, то 20:00:00 - 17:00:00 = 3 часа. Просто не учитывается то, что первая строка это результат обработки ещё одного часа и чтобы формула работала корректно нужно просто прибавлять один час.
gp201_TC_VHS это время нормальной работы теплосчетчика в часах. Просто прибавлять 1 час нельзя, так как мы не знаем работало ли оборудование в этот час. Тоже самое и с полями Q, M1, M2, M3

Цитировать
Чтобы правильно организовать вывод итогов не нужно выводить в итог колонку из источника данных, ведь Вы увидите только последнюю стоку из колонки. Вместо этого расположите в бэнде итогов объект Текст и укажите в нём расчет итога, как показано на скрине во вложении. Для первого значения используйте "First", для минимального "MinD".
Здесь разобрался, спасибо.

Цитировать
Если это периодический источник, то первая строка должна содержать данные за период от 16:00 до 17:00, вместо пустого значения. Можете выслать текущую версию проекта с отчетами?
Выслал вам на почту. Скорее всего нужно сделать как предложил Nikso - формировать отчет за то время которое выбрал пользователь плюс добавлять один час впереди, если это почасовый отчет.
« Изменён: 16 Февраля 2019, 16:09:23 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3193
    • Просмотр профиля
    • Simple-Scada
Цитировать
Просто прибавлять 1 час нельзя, так как мы не знаем работало ли оборудование в этот час. Тоже самое и с полями Q, M1, M2, M3
Теперь понятно, в этих колонках используется разница с пред. строкой, которую невозможно получить для первой строки. Тогда действительно остается только увеличивать время отчета на один час. На будущее рассмотрим добавление опции с выводом разницы с пред. строкой (с автоматическим захватом пред. часа), вместо текущего значения.

Timothy Clement

  • Постоялец
  • ***
  • Сообщений: 166
  • ОАО Борисовский завод "Металлист"
    • Просмотр профиля
    • Полымя
Миханик, я сейчас как раз в своём проекте реализую отчёт по приборам учёта и тоже столкнулся с появлением нулевых значений при попытке взять первое значение за интервал.
Попробуйте решить следующим образом:

Код: (с#)
{Format("{0:N2}",IIF(Данные.gp201_TC_M2 == 0,Previous(Данные,"gp201_TC_M2"),Данные.gp201_TC_M2))}


Это конечно не исключает того, что в первый интервал выпадет 0 и предыдущее опять же не будет существовать. Но зато не нужно минусовать 1 час, при котором добавится лишняя строка в начале.
« Изменён: 17 Февраля 2019, 09:40:56 от Timofei »

Миханик

  • Постоялец
  • ***
  • Сообщений: 182
    • Просмотр профиля
    • www.vpa-dv.ru
Тогда действительно остается только увеличивать время отчета на один час.
Увеличить то интервал не проблема, но как потом скрыть первую строку в отчете? У меня никак не получается: я пробовал делать и фильтрацию, чтобы показывал данные начиная со второй записи, но тогда он не берет в расчеты эту строку. И пробовал ставить условие на вывод - не отображать данные, если это первая строка, но также тогда данные вылетают из расчета.

Код: (с#)
{Format("{0:N2}",IIF(Данные.gp201_TC_M2 == 0,Previous(Данные,"gp201_TC_M2"),Данные.gp201_TC_M2))}
Это конечно не исключает того, что в первый интервал выпадет 0 и предыдущее опять же не будет существовать. Но зато не нужно минусовать 1 час, при котором добавится лишняя строка в начале.
Немного не понял как это мне поможет? И почему если данные равны нулю, то я должен брать предыдущее значение?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3193
    • Просмотр профиля
    • Simple-Scada
Re: Вопрос про отображение интеграторов в отчете
« Ответ #10 : 18 Февраля 2019, 13:08:20 »
Сделать это можно следующим способом:

1. У самого бэнда данных "DataДанные" и каждого вложенного в него компонента (в Вашем отчете это компоненты "DataДанные_Время", "Text29", "Text27", "DataДанные_gp201_TC_T1" и так далее) установить свойство "Может сжиматься" в значение "Да".

2. Также для каждого вложенного компонента на событие "Взять значение" присвоить следующий код:
Код: (c#)
if (Line == 1) {
  e.Value = "";
} else {
  (sender as StiText).CanShrink = false;
}
Это позволит исключить первую строку при печати отчета, но оставит её в расчетах.

Миханик

  • Постоялец
  • ***
  • Сообщений: 182
    • Просмотр профиля
    • www.vpa-dv.ru
Re: Вопрос про отображение интеграторов в отчете
« Ответ #11 : 19 Февраля 2019, 09:55:57 »
Спасибо за помощь.

2. Также для каждого вложенного компонента на событие "Взять значение" присвоить следующий код:
Не могу найти где в отчете назначить событие на компонент?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3193
    • Просмотр профиля
    • Simple-Scada
Re: Вопрос про отображение интеграторов в отчете
« Ответ #12 : 19 Февраля 2019, 10:01:42 »
См. вложение. Маленькая кнопка с иконкой молнии в верхней части панели свойств.
« Изменён: 19 Февраля 2019, 10:03:09 от Simple-Scada »