Счетчик нарастающим итогом по изменению

Стартовая страница Форумы Понять, как работает ПО Использование формул Счетчик нарастающим итогом по изменению

Просмотр 15 сообщений - с 16 по 30 (из 40 всего)
  • Автор
    Сообщения
  • #22498
    Romiros
    Участник

    Используйте версию 6, там есть предыдущее значение 🙂

    #22499
    manjey73
    Участник

    Входной не катит по простой причине, в нем количество импульсов нарастающим итогом.

    Мне нужна разница между прошлым и текущим и прибавление после вычислений к другому числу. И происходить это должно строго после изменения входного канала.

    Не работает формула со словарем почему-то

    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;
    }

    Канал горит серым… Как Движок словари обрабатывает не пойму ?

    #22500
    a80808
    Участник

    Думаете уже можно в продуктив? 🙂

    #22501
    manjey73
    Участник

    Пока не могу использовать версию 6, не разбирался там еще с драйверами, драйвер написал пока только для 5-й 🙂

    #22502
    a80808
    Участник

    Это к @romiros 🙂

    #22503
    manjey73
    Участник

    Не могу понять, как в формуле инициализировать Dictionary и записать в него значение первый раз, чтобы потом оно не записывалось каждый раз по новой.

    #22504
    manjey73
    Участник

    Да я начну на днях, мне просто показать это надо заказчику…

    з.ы. в очередной раз убеждаюсь, что регистраторы импульсов, которые самостоятельно рассчитывают значения лучше, чем погремушки…

    #22506
    Romiros
    Участник

    Думаете уже можно в продуктив? 🙂

    На минималках только. Просто я уже ничего под пятую не делаю. Многое чего в ней не хватало уже есть в шестой из коробки.

    #22510
    Mikhail
    Модератор

    Не могу понять, как в формуле инициализировать Dictionary и записать в него значение первый раз, чтобы потом оно не записывалось каждый раз по новой.

    Используйте метод TryGetValue. В 1-й раз он вернёт false, т.к. элемента нет в словаре.

    #22532
    a80808
    Участник

    Я тут прочитал описание этого хитрого прибора…
    Насколько я понимаю задачу, надо раз в 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 каналов (канал с коэффициентом пересчета может быть один на все одинаковые приборы).
    А если еще заморочиться возможной заменой прибора….

    #22533
    manjey73
    Участник
    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 имп./кВт/ч

    НО, как всегда есть НО. сделаю скрины чуть позже…

    #22534
    manjey73
    Участник

    1

    Вот эти скачки непонятные с чем связаны? ядро что-то не успевает?

    • Этот ответ был изменен 2 года, 1 месяц назад от manjey73.
    • Этот ответ был изменен 2 года, 1 месяц назад от manjey73.
    • Этот ответ был изменен 2 года, 1 месяц назад от manjey73.
    • Этот ответ был изменен 2 года, 1 месяц назад от manjey73.
    • Этот ответ был изменен 2 года, 1 месяц назад от manjey73.
    #22540
    manjey73
    Участник

    Канал 2015 здесь расчетный, 1030 это реальный канал из счетчика, считанное значение потребленной энергии по интерфейсу.

    #22541
    manjey73
    Участник

    q

    Каждые полчаса что-то происходит в системе и БД попадает мусор. Не понимаю, откуда он может браться, если в формуле чтение определенного канала и запись в него же….

    #22542
    a80808
    Участник

    Было что то подобное, так и не разобрался что это. Потом счетчик умер (ливневые стоки качали через крыльчатку, «специалисты») и проблема самоликвидировалась…

Просмотр 15 сообщений - с 16 по 30 (из 40 всего)
  • Вы должны авторизироваться для ответа в этой теме.