Просмотр полной версии : Отчет нарастающий итог
В MasterSCADA имеются шикарные возможности по созданию отчетов - все реализовано достаточно удобно и интуитивно.
Кроме разве что подсчета прироста какого-либо показателя за время охватываемое отчетом (указывается оператором). В функциях составления отчета ("итог данных") можно вывести и минимум и максимум (и даже интегрировать), а вот вычесть из последнего первый (чтобы получить прирост за время охватываемое отчетом) уже не так просто. Т.е. требуется простейший отчет такого вида:
Дата-время Количество
01/01/01 00:00 10
01/01/01 00:10 11
01/01/01 00:20 12
01/01/01 00:30 13
01/01/01 00:40 14
Итого: 4 <--- (14-10)
В примерах решение такой задачи в чистом виде не освещается, предлагается реализовывать подсчет итога путём разделения всего отчета на временные интервалы в которых с помощью "расчет"-ов подсчитывается промежуточные итоги, а в итоговом отчете они уже просто все суммируются... Но зачем так усложнять?
Дата-время Количество
01/01/01 00:00 - 00:10 10
01/01/01 00:10 - 00:20 10
01/01/01 00:20 - 00:30 10
01/01/01 00:30 - 00:40 10
01/01/01 00:40 - 00:50 10
Итого: 50 <--- (Сумма колонки количество)
На форуме нашел хороший ответ по теме: http://www.owen.ru/forum/showthread.php?t=10933
Тут даже приложен проект, но если честно, не смог разобраться - что именно и куда перетаскивать, зачем создавать именно новый источник данных, в каких свойствах устанвливать "обработку - минимум", потом ещё что-то обратно перетаскивать, вытаскивать источник и как-то скрывать бенд..
Может можно надеяться на более подробное описание осуществления такого вроде несложного, но очень много кому нужного функционала?
P.S. Описанная задача это собственно всё что осталось доделать. Всего за пару дней с MasterSCADA я смог сделать по примерам все что требовалось... почти всё...
Приложенный проект - так же сделан на основе одного из выложенного здесь примера.
SCADAMaster
20.11.2013, 12:15
Кроме разве что подсчета прироста какого-либо показателя за время охватываемое отчетом (указывается оператором). В функциях составления отчета ("итог данных") можно вывести и минимум и максимум (и даже интегрировать), а вот вычесть из последнего первый (чтобы получить прирост за время охватываемое отчетом) уже не так просто.
То есть вам нужно получить разницу между первым и последним значением на интервале?
Для этого в версии 3.6 мы добавили новый способ обработки параметра - "Разница" используйте его (работает при периодическом и итоговом способе построения).
SCADAMaster
20.11.2013, 12:18
Кроме разве что подсчета прироста какого-либо показателя за время охватываемое отчетом (указывается оператором). В функциях составления отчета ("итог данных") можно вывести и минимум и максимум (и даже интегрировать), а вот вычесть из последнего первый (чтобы получить прирост за время охватываемое отчетом) уже не так просто.
То есть вам нужно получить разницу между первым и последним значением на интервале?
Для этого в версии 3.6 мы добавили новый способ обработки параметра - "Разница" используйте его (работает при периодическом и итоговом способе построения)).
Вот это классно!! Как раз вчера скачал 3.6.
А как эту разницу использовать? Пытаюсь прикрутить и так и эдак - при периодическом она у меня в качестве своего значения ноль выдаёт всегда, а при итоговом - работает... только вот при итоговом в отчете только одно значение выдаётся, а хотелось бы видеть и остальные - промежуточные.
Если завести в проекте два источника данных из архива MasterSCADA - один периодический, а другой итоговый, то отчет вообще не выведется.
SCADAMaster
20.11.2013, 16:31
А какой период у вас установлен?
Пришлите ваш проект целиком - вместе с данными, и укажите путь к вашему отчету.
Вроде все получилось. Пришел к тому что нужно создавать два источника данных - один периодический для создания записей в отчете через заданный в проекте временной промежуток (в нём "разница" в чистом виде почему-то не работала, всегда ноль была, наверно я просто чего-то не учел), и второй - итоговый, исключительно для подсчета разницы между первым и последним значениями.
Может я что-то сделал не так, и как-то по другому можно было бы обойтись одним источником.. но думаю, что для такого наипростейшего функционала это не страшно - работает).
P.S. До этого с MasterSCADA дела вообще не имел и сделал необходимую программу за несколько дней - по примерам в основном. Считаю что это хорошо может характеризовать данный программный пакет. Спасибо за помощь.
SCADAMaster
21.11.2013, 10:51
На самом деле все строится корректно.
В вашем проекте в некоторых случаях вместо числа выводятся нули потому что последнее значения является недостоверным (получено с ошибкой или же был останов скады). Вам нужно правильно настроить обработку плохих признаков качества.
Вот в этом сообщении есть документация по этому вопросу:
http://www.owen.ru/forum/showthread.php?t=15990&p=121667&viewfull=1#post121667
Она уже внесена в справку.
А можно ли как-то отвязаться от конкретного значения со счетчика и перенести функционал журналирования на регистрацию положительного фронта от датчиков/счетчиков?
Т.е. у нас в работе счетчики ОВЕН СИ-8 RS-485, данные с них поступают на компьютер с этим проектом, а сами счетчики стоят в цехе и хорошо бы иметь возможность производственникам сбрасывать их значения, для того чтобы более явно и по месту видеть, сколько произведено за смену например, без потери информативности долгосрочных отчетов.
Ведь для отчета берётся последнее значение и вычитаться из него первое, и соответственно если такой "сброс значения" окажется внутри отчетного интервала то в нём будет полная ерунда.
SCADAMaster
24.03.2014, 08:58
Обрабатывать по фронту не совсем правильно - можно пропустить какое то из значений.
Правильнее в вашем случае обрабатывать сброс счетчика, и прибавлять к накопленному значение последнее полученное из счетчика. Эту задачу можно решить при помощи скрипта.
А где про них посмотреть/почитать можно? В видеоуроках не нашел, в справке и в "Вычисления в MasterSCADA" маловато.
Может есть какие-то демонстрационные примеры?
SCADAMaster
24.03.2014, 16:11
Прочитать про что конкретно?
Про скрипты... Ну про них вроде разобрался более-менее.
Сейчас есть необходимость обращения к предыдущему значению параметра именно из архива. Т.к. если сохранять его в виде какой-то переменной в проекте, то с выключением программы или компьютера - оно потеряется.
Не подскажите синтаксис обращения из скрипта к последнему/предпоследнему архивированному значению параметра?
SCADAMaster
31.03.2014, 10:22
В вашем случае нет необходимости обращаться к архивному значению - можно просто сохранять значение на выходе скрипта (используя восстановление при рестарте).
В приложении проект со двумя вариантами скриптов - подсчет по импульсу и по нарастающему итогу. Оба варианта сохраняют значения между рестартами.
Спасибо! Очень пригодилось. В первую очередь по тому, что не знал о функции восстановления при рестарте.
На ОВЕНовском OPC-сервере для приборов c интерфейсом RS-485 и протоколом ОВЕН нет передачи сигнала сброса для счетчиков СИ-8, передаётся только само значение с него. Поэтому скрипт получился такой:
using System;
using MasterSCADA.Script.FB;
using FB;
public partial class ФБ : ScriptBase
{
public override void Execute()
{
if (DCNT > DCNT_OLD)
{Counter=Counter+(DCNT-DCNT_OLD);
DCNT_OLD=DCNT;}
if ((DCNT == 0) && (DCNT != DCNT_OLD))
{DCNT_OLD=0;}
if (DCNT1 < DCNT_OLD1)
{DCNT_OLD1 = DCNT1;}
}
}
DCNT - входная переменная, значение со счетчика
DCNT_OLD - выходная переменная, сохраняется при рестарте
Counter - выходная переменная, значение рассчитываемое скриптом, сохраняется при рестарте.
Второй IF нужен для ситуации когда значение на счетчике сбросилось в ноль но ещё не прибавилось, чтобы программа дальше могла нормально работать.
Третий - когда кто-то всё-таки сбросил счетчик пока компьютер был выключен.
Как Вы и говорили - проект разрастается. Купили 4 MSTR100, всё работает, приложил самый маленький проект - на один счетчик (sa пароль - 123).
Теперь от меня хотят чтобы в конце отчета, рядом с общим числом произведённой продукции за время между началом отчета и концом отчета, выводилась ещё и средняя производительность за этот указанный период в единицу времени (выбранного интервала). Т.е. если посмотреть на сам отчет, это будет - среднее арифметическое по всем строчкам отчета (разумеется кроме последней-итоговой).
Вроде всё просто, надо поставить в итог данных дополнительный бенд для которого в качестве обработки данных будет выбрано "среднее", но тогда он будет выдавать среднее от общего накопительного итога счетчика, с которым мы собственно и имеем дело - большого числа. А надо чтоб выдавал среднее от разностей этого большого числа, которые выводятся в отчете но как это сделать стандартными средствами MasterSCADA не могу понять-найти. Есть похожий пример с расходом газа, но там такого нет. Как вывести среднее от результатов вычисления?
То есть сейчас в отчёте всё примерно так (при выборе интервала в 1 минуту):
00:00 - 1
00:01 - 2
00:02 - 2
00:03 - 1
Итого: 6
А хочется так:
00:00 - 1
00:01 - 2
00:02 - 2
00:03 - 1
Итого: 6
Средняя производительность: 1,5 в 1 мин
Как-то поиграться с обработкой значений - "Количество значений" не получилось, это количество значений не в отчете как я думал, в архиве MasterSCADA (примерно соответствует накопительному итогу, т.к. архивируется оно у меня по изменению, а изменяется (обычно) на 1). Может быть можно в каком-то виде получить количество генерируемых строк в отчете?
SCADAMaster
29.07.2014, 12:37
Если у вас значения идут нарастающим итогом, то нужно написать в поле выражение примерно такой код:
{((int)Last(DataИсточникДанных1,ИсточникДанных1.Чи слоИмпульсов)-(int)First(DataИсточникДанных1,ИсточникДанных1.Чис лоИмпульсов))
/(double)Count(DataИсточникДанных1)}
Где DataИсточникДанных1 - имя бэнда, ИсточникДанных1.ЧислоИмпульсов - ваша переменная.
Last - получить последнее значение переменной, First - получить первое значение переменной, Count - получить количество строк.
(double) - приведение к вещественному типу данных (если колонка имеет целый тип данных, то нужно записать (int))
Больше спасибо за ответ!!
Пробую по разному, пока слабо получается. У меня два источника данных - один периодический, для основных строк отчета, а второй - итоговый, для "Итого"/ Я правильно понял, что в вашем ответе подразумевается второй источник данных?
Нужно ли для "Count" указывать переменную как это делается для "First/Last"? Просто "First/Last" работают хоть как-то по отдельности (даже не в составе приведённой формулы), а вот "Count" что-то никак не хочет.
Зачем приводить к вещественному типу данных количество строк?
Не совсем ясно что такое "имя бэнда". Смотрел в PDF-ки, судя по ним это то что написано в графе свойств "наименование" когда нажимаешь на него. У меня это либо "Данные_Архив_MasterSCADA", либо "ИтогДанных_Архив_MasterSCADA". Или может это всё-таки имя источника данных ("Архив_MasterSCADA" и "Итоговый" соответственно)?
Влияет ли вариант обработки данных на код который необходимо будет написать в поле выражение ?
SCADAMaster
29.07.2014, 16:51
Пробую по разному, пока слабо получается. У меня два источника данных - один периодический, для основных строк отчета, а второй - итоговый, для "Итого"/ Я правильно понял, что в вашем ответе подразумевается второй источник данных?
Ответ был дан в общем виде. Нужно использовать тот источник данных, который нужен для этой задачи.
Нужно ли для "Count" указывать переменную как это делается для "First/Last"? Просто "First/Last" работают хоть как-то по отдельности (даже не в составе приведённой формулы), а вот "Count" что-то никак не хочет.
Нет, не нужно.
Вы можете поле итога поочередно настроить на определение First, Last и Count - на вкладке "Выражение" будет код. Затем можно составить из трех выражений результирующее. Оно будет выглядеть примерно так, как мы написали.
Зачем приводить к вещественному типу данных количество строк?
Чтобы получить на выходе ячейки вещественный тип данных.
Не совсем ясно что такое "имя бэнда". Смотрел в PDF-ки, судя по ним это то что написано в графе свойств "наименование" когда нажимаешь на него. У меня это либо "Данные_Архив_MasterSCADA", либо "ИтогДанных_Архив_MasterSCADA".
имя бэнда - это его имя, которые выводится в его заголовке. В вашем случае это "Данные_Архив_MasterSCADA"
Влияет ли вариант обработки данных на код который необходимо будет написать в поле выражение ?
Нет.
Заработало!
Получилось через "{Итоговый.Counter1 / Count(Данные_Архив_MasterSCADA)}" прописанный в выражении.
Counter1 обрабатывается как "разница" и находится в итоговом отчете, поэтому выдаёт разницу между началом и концом отчета вообще, и делится на количество строчек в отчёте. Таким образом получаем среднее.
Ещё раз спасибо за то что рассказали про "Count" и имя бэнда!
А как можно считать разницу , не задавая период. Т.е надо вывести первую и последнию величину и разницу, но не выводить промежуточные значениия. Отрезок может быть равен как и дню так и году. И игнорировались нулевые значения.
SCADAMaster
29.08.2014, 20:58
Можно использовать отчет "Итоговый".
Добавляете одну и ту же переменную несколько раз, и настраиваете разные способы обработки.
Спасибо за быстрый ответ, а где можно прочитать про этот тип отчета
SCADAMaster
30.08.2014, 09:10
По сути это разновидность отчета со способ построения "Периодический", просто у него за все время формируется только одна строка.
Способы обработки - такие же как у периодического.
А можно как то по подробней об этом прочитать, может ссылка на учебник есть?
SCADAMaster
30.08.2014, 15:12
Есть методическая документация на сайте:
http://www.masterscada.ru/?additional_section_id=141
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot