Усреднение обрабатываемых данных

Стартовая страница Форумы Понять, как работает ПО Усреднение обрабатываемых данных

  • В этой теме 5 ответов, 3 участника, последнее обновление 5 лет назад сделано Mikhail.
Просмотр 6 сообщений - с 1 по 6 (из 6 всего)
  • Автор
    Сообщения
  • #8056
    Danila_Razlivanov
    Участник

    Доброго времени суток. Возник такой вопрос, есть ли возможность посчитать среднее значение получаемого параметра, скажем, за сутки? То есть, в зависимости от изменения, к примеру, расхода, изменяется количество твердого в перекачиваемой жидкости. Т.к. в разные моменты времени, опять же в зависимости от расхода, значение расчитываемой величины (количества твердого) будем меняться, есть необходимость обсчитать это значение, к примеру, за сутки. Подскажите, есть ли такая возможность, и какие варианты её реализации? Заранее благодарен.

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

    Добрый день!
    За час и за минуту рассчитать среднее можно, поставить галочку усреднения для входного канала.

    Если нужно рассчитать среднее за сутки или за любой заданный интервал времени, то потребуется завести дополнительные входные каналы для суммирования данных и для подсчёта количества измерений. И ещё один канал, который будет вычислять среднее путём деления значений первых двух каналов.
    Кроме того, в определённые моменты времени необходимо сбрасывать счётчики.

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

    Примеры формул для аналогичной задачи:

    // Среднее значение за период
    double PerAvg(int sumCnlNum, int cntCnlNum)
    {
      if (Stat() == 2) // архивный
      {
        return Val();
      }
      else
      {
        double sum = Val(sumCnlNum);
        double cnt = Val(cntCnlNum);
        return cnt < 1 ? 0 : sum / cnt;
      }
    }
    
    // Статус среднего значения за период
    double PerAvgStat(int cntCnlNum)
    {
      return Stat() == 2 ? 2 : 
        (Val(cntCnlNum) < 1 ? 0 : 1);
    }
    
    // Обработать полученное от контроллера значение
    double ProcVal(double coef, params int[] sumCnlNums)
    {
      double cur = Cnl >= 0 ? Cnl * coef : 0;
      foreach (int sumCnlNum in sumCnlNums)
      {
        int cntCnlNum = sumCnlNum + 1;
        double newSum = Val(sumCnlNum) + cur;
        double newCnt = Val(cntCnlNum) + 1;
        SetVal(sumCnlNum, newSum);
        SetVal(cntCnlNum, newCnt);
      }
      return cur;
    }
    
    // Обнулить значение в начале суток
    double ResetOnDayBeg()
    {
      return DayBeg() ? 0 : Val();
    }
    
    #11454
    baur
    Участник

    Всем привет,
    1)
    как можно эту формулу переделать в счетчик который не сбрасывается

    2)

    За час и за минуту рассчитать среднее можно, поставить галочку усреднения для входного канала.

    то есть создаем 2 канала (минутный ТС, часовой ТС), формула = Val(нужный номер канала) + галочка усреднение?

    #11455
    baur
    Участник

    у нас уже есть сигнал текущая переработка (т/час), мы не можем его трогать.
    Надо усреднить отдельно через дорасчетный канал (минутный, часовой) а еще лучше создать отдельный счетчик (сумматор)

    • Этот ответ был изменен 5 лет назад от baur.
    #11459
    Mikhail
    Модератор

    Для работы со средними значениями были разработаны и протестированы специальные формулы. Их можно скопировать отсюда. Как их использовать написано в комментариях в начале файла.

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