Стартовая страница › Форумы › Понять, как работает ПО › Использование формул › Суточные и месячные данные — формулы
- В этой теме 44 ответа, 5 участников, последнее обновление 6 месяцев назад сделано
Mikhail.
-
АвторСообщения
-
25.05.2025 в 18:21 #38521
manjey73УчастникНе получается сделать формулу, которая показывала бы суточные и месячные данные. Разницу. Нужно в каналах, без всяких гибких отчетов.
В идеале, после запуска сервера, пока не закончились сутки или месяц, были показания Разницы в текущих данных с нарастающим итогом.
То есть сейчас 12 дня, в текущих должно показываться потребленная энергия с 0 часов текущего дня до текущих 12 часов.
25.05.2025 в 22:53 #38522
a80808УчастникДелал такое в пятерке, но на срез дня, месяца, года…
double CalcRate(int cnl_today, int cnl_yesterday, int cnl_month, int cnl_prevmonth, int cnl_begyear, int cnl_src)
{
double cnl_sum;
DateTime nowDT = DateTime.Now;
if (DayBeg() == true)
{
if (MonthBeg() == true)
{
SetVal(cnl_prevmonth, Val(cnl_month));
if (nowDT.Month == 1 && nowDT.Day == 1)
{
SetVal(cnl_begyear, 0);
}
SetVal(cnl_month,0);
}
SetVal(cnl_yesterday, Val(cnl_today));
SetVal(cnl_month, (Val(cnl_month) + Val(cnl_today)));
SetVal(cnl_begyear, (Val(cnl_begyear) + Val(cnl_today)));
SetVal(cnl_today, 0);
}
cnl_sum = (Val(cnl_today) + Val(cnl_src)/60);
return cnl_sum;
}
25.05.2025 в 23:20 #38523
manjey73УчастникНе совсем понимаю, а где здесь разница ?
26.05.2025 в 07:14 #38524
manjey73УчастникБлин, тут складывают, правда не въеду что именно. А я отнимаю. 🙂
Есть счетчик — Энергия от сброса нарастающим итогом.
На 0 часов 82000 кВт*ч, на 0 часов следующего дня будет скажем 83000 кВт*чРазница 1000 кВт*ч. Так вот как с начала дня показывать от 0 до 1000 и потом сохранить 1000, а не 83000 ????
Расчетный канал Х — EveryHour(() => Data(327))
Расчетный канал Х+1 EveryHour(() => Val(Х) — PrevVal(Х))327 здесь канал счетчика E нарастающим итогом без сброса.
Но оно не показывает + от 0 часов до окончания часа.
Ну и нет формул EveryDay, EveryMonth а я так понимаю они в ядре прописаны….26.05.2025 в 07:23 #38525
a80808УчастникФормула расход считала. в каналах накапливается расход. Т.е. каждое начало дня записывается в прошлый день + добавляется в месячный п=расход и годовой и счетчик дня обнуляется. И так же для месяца и года. Праввда косячила она с годом, так как формулы YearBeg() не было….
26.05.2025 в 08:32 #38526
manjey73Участникcnl_src у меня это энергия от сброса, за все время работы счётчика.
Я не могу это прибавлять к часовому расходу.26.05.2025 в 09:47 #38527
manjey73УчастникСамодельные формулы для часа или дня (пока жду наступления следующего дня)
Требуется 3 канала.
X — HourStarted() или DayStarted() (ловим начало часа или дня, ну наверное и MonthStarted() будет тут же)
X+1 — IfStart(X, 327) канал 327 это Энергия от сброса в счетчике, сохранение в канале на начало часа, дня, месяца. Если статус текущего канала меньше 1, то выставляется статус =4 — Channel value is defined but unreliable (Значение канала определено, но ненадежно) типа не полные данные, после запуска сервера.public CnlData IfStart(int started, int curVal) { if (Stat() < 1) return NewData(Val(curVal), 4); if (Val(started) > 0) return NewData(Val(curVal), Stat(curVal)); return Data(); }X+2 — DivIfStart(X, X+1) — собственно расчет разницы и запись в канал
public CnlData DivIfStart(int started, int lastVal) { if (Val(started) > 0) { double div = Val(lastVal) - PrevVal(lastVal); return NewData(div, PrevStat(lastVal)); } return Data(); }И тут вопрос — как сделать так, чтобы показывалась разница с 0 по х для часа, дня, месяца в текущих данных. При этом не влияла на график, то есть линии должны быть как на скрине выше прямыми в точках минут между часами.
А в часовые метки записывалась именно разница. Из скриптов так понимаю нет доступа с прошлым минутам. А если использовать текущие данные, то тут же ломается PrevVal или PrevData к чертям…
з.ы. добавлять еще каналов не предлагать 🙂 я бы вообще хотел чтобы это был всего ОДИН канал на все.
Для понимания — счетчиков 400 (ЧЕТЫРЕСТА !!! штук) а может быть и больше…
По 3 канала — 1200 каналов…я понимаю, что скриптами навертеть можно все, что угодно. Но для таких вещей было бы неплохо иметь формулы непосредственно в ядре, типа Difference(Номер канала, параметр) и она бы отрабатывала как описано выше, а параметр мог бы менять поведение что писать в минуты между периодами, в часовые метки между периодами, в суточные и т.д….
Из-за того, что счетчиков 400, использовать Гибкий отчет тоже не предлагать…
-
Ответ изменён 7 месяцев, 3 недели назад пользователем
manjey73.
26.05.2025 в 09:51 #38529
manjey73УчастникЕсли правильно понимаю, то в текущие данные писать вообще нельзя из-за PrevVal или PrevData… что печально…
То есть еще один канал чтобы просто показать потребление с начала часа, дня, месяца…26.05.2025 в 09:58 #38530
manjey73УчастникНу и собственно, как теперь при этом нарисовать таблицу, где вместо часов будут дни месяца? Учитывая, что количество дней в месяце разное? 🙂
плагин делать? 🙂
26.05.2025 в 10:04 #38531saprin8
УчастникПолучается так, надо сохранять куда-то значение предыдущее. вот так считал для подсчета расхода с вкт приборов.
public double Diff_mass(int Value, int OldValue) { double difference; if (Val(Value) == Val(OldValue)) { difference = 0; } else if (Val(Value) != Val(OldValue)) { difference = Val(Value) - Val(OldValue); SetFata(OldValue, Val(Value), 1); } else { difference = 0; } return difference; }Можно использовать Month/DayStarted.
-
Ответ изменён 7 месяцев, 3 недели назад пользователем
saprin8.
26.05.2025 в 10:26 #38533
manjey73УчастникТак вопрос не в том, куда писать предыдущее значение, а в том, чтобы в этом же канале отображать текущую разницу внутри периода, но чтобы оно не влияло на минутные данные.
з.ы. ну хочется так… не нужна мне пила на графиках.
Типа на мнемосхему показываем сколько текущее потребление, а в графике видим только lastHourValue например, как на первом графике выше.26.05.2025 в 10:28 #38534
manjey73Участникelse if (Val(Value) != Val(OldValue)) { difference = Val(Value) - Val(OldValue); SetData(OldValue, Val(Value), 1);здесь вы постоянно пишите в OldValue новое значение каждый цикл если правильно понимаю. Или надо всю формулу обернуть в DayStarted типа
26.05.2025 в 10:29 #38535
manjey73УчастникDayStarted на выходе имеет bool. Как обернуть прямо в нее по принципу EveryHour(() => Data(327)) ???
26.05.2025 в 14:32 #38543
MikhailМодераторИспользуйте модуль ModDiffCalculator.
Он вычисляет разность каналов за период времени. Но нарастающую разницу он не показывает.26.05.2025 в 17:11 #38557
manjey73УчастникПри использовании DiffCalculator как теперь соединить точки на Графике Про при разнице 1 час ?
Устанавливал 3600, 3700, 5400 в параметре <GapBetweenPoints>5400</GapBetweenPoints>
Толку нет, точки не соединяются. -
Ответ изменён 7 месяцев, 3 недели назад пользователем
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.
