Стартовая страница › Форумы › Понять, как работает ПО › Использование формул › Счетчик нарастающим итогом по изменению
- В этой теме 39 ответов, 4 участника, последнее обновление 2 года, 1 месяц назад сделано manjey73.
-
АвторСообщения
-
18.03.2022 в 16:53 #22498RomirosУчастник
Используйте версию 6, там есть предыдущее значение 🙂
18.03.2022 в 16:56 #22499manjey73УчастникВходной не катит по простой причине, в нем количество импульсов нарастающим итогом.
Мне нужна разница между прошлым и текущим и прибавление после вычислений к другому числу. И происходить это должно строго после изменения входного канала.
Не работает формула со словарем почему-то
Dictionary<int, double> countRk = new Dictionary<int, double>(); public double CounterRK (int channel, int iweight) { double count = 0; if (countRk[channel] != Val(channel)) { count = 1; } else { count = 2; } return count; }
Канал горит серым… Как Движок словари обрабатывает не пойму ?
18.03.2022 в 16:56 #22500a80808УчастникДумаете уже можно в продуктив? 🙂
18.03.2022 в 16:57 #22501manjey73УчастникПока не могу использовать версию 6, не разбирался там еще с драйверами, драйвер написал пока только для 5-й 🙂
18.03.2022 в 16:57 #2250218.03.2022 в 17:01 #22503manjey73УчастникНе могу понять, как в формуле инициализировать Dictionary и записать в него значение первый раз, чтобы потом оно не записывалось каждый раз по новой.
18.03.2022 в 17:02 #22504manjey73УчастникДа я начну на днях, мне просто показать это надо заказчику…
з.ы. в очередной раз убеждаюсь, что регистраторы импульсов, которые самостоятельно рассчитывают значения лучше, чем погремушки…
18.03.2022 в 17:07 #22506RomirosУчастникДумаете уже можно в продуктив? 🙂
На минималках только. Просто я уже ничего под пятую не делаю. Многое чего в ней не хватало уже есть в шестой из коробки.
18.03.2022 в 17:16 #22510MikhailМодераторНе могу понять, как в формуле инициализировать Dictionary и записать в него значение первый раз, чтобы потом оно не записывалось каждый раз по новой.
Используйте метод TryGetValue. В 1-й раз он вернёт false, т.к. элемента нет в словаре.
19.03.2022 в 20:36 #22532a80808УчастникЯ тут прочитал описание этого хитрого прибора…
Насколько я понимаю задачу, надо раз в 10 минут принять от него состояние счетчика накопления импульсов во внутренней памяти и потом отобразить (и/или записать) с умножением на коэффициент пересчета в реальное значение.
Подобное я делал следующим образом.
допустим:
100 (ТИ) — прием данных от счетчика
101 — (ДТИ) — счетчик нарастающего значения
102 — (ТИ или ДТИ) канал хранения старого значения
104 — (ДТИ) канал с расчетом (формулой)
105 — (ДТИ) реальное значение = канал 101 * К пересчета (формула в канале)
Как считаем:
1. сравниваем 100 и 102. Если равно выход из формулы.
2. если не равно:
2а если в 100 больше 102
плюсуем разницу между 100 и 102 к 101 и переписываем значение из 100 в 102. выход.
2б если 100 меньше 102 (переход через максимальное значение), то:
а). плюсуем к 101 разницу между максимальным возможным значением и значением 102
б). плюсуем к 101 содержимое 100.
в). переписываем значение 100 в 102. выходКак то так…
Ну еще как вариант в одном из каналов хранить коэффициент пересчета…В результате получается, что на один двухканальный прибор надо будет 10 каналов (канал с коэффициентом пересчета может быть один на все одинаковые приборы).
А если еще заморочиться возможной заменой прибора….19.03.2022 в 22:24 #22533manjey73УчастникDictionary<int, double> countRk = new Dictionary<int, double>(); public double CounterRK (int channel, int iweight) { double count = 0; double tmp = 0; double last = 0; double dstTmp = Val(); bool t = countRk.TryGetValue(channel, out tmp); if (!t) { countRk[channel] = Val(channel); } else { if (countRk[channel] != Val(channel)) { last = countRk[channel]; tmp = (Val(channel) - last); if (tmp <= 0) { tmp = (Convert.ToDouble(0xFFFFFFFF) - last) + Abs(tmp); } count = tmp/iweight; dstTmp = Val()+count; countRk[channel] = Val(channel); } } return dstTmp; }
Вот такая формула получилась.
Есть канал 100 (не важно) куда приходят данные с регистратора импульсов. Просто тупой счетчик импульсов без самостоятельного вычисления веса импульса и пересчета во что-то, кВт/ч, м3 и так далее.
Создаем ДТИ (101) и канал управления для него с формулой SetVal(101) для задания текущего показания на счетчике.
В канале 101 указываем формулу CounterRK(100, 500) где 100 это канал ТИ из счетчика выше, 500 вес импульса. На Меркурий 236, к которому я подключил указано постоянная составляющая А = 500 имп./кВт/чНО, как всегда есть НО. сделаю скрины чуть позже…
19.03.2022 в 22:32 #22534manjey73УчастникВот эти скачки непонятные с чем связаны? ядро что-то не успевает?
19.03.2022 в 22:36 #22540manjey73УчастникКанал 2015 здесь расчетный, 1030 это реальный канал из счетчика, считанное значение потребленной энергии по интерфейсу.
20.03.2022 в 09:55 #22541manjey73УчастникКаждые полчаса что-то происходит в системе и БД попадает мусор. Не понимаю, откуда он может браться, если в формуле чтение определенного канала и запись в него же….
20.03.2022 в 11:50 #22542a80808УчастникБыло что то подобное, так и не разобрался что это. Потом счетчик умер (ливневые стоки качали через крыльчатку, «специалисты») и проблема самоликвидировалась…
-
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.