Показано с 1 по 8 из 8

Тема: Вывод на мнемосхему скользящих среднего, максимального и минимального значений

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию

    Всё это правильно. Но, для меня, проблема как реализовать это в коде скрипта. Я электронщик, программиста нет, поэтому приходится самому этим заниматься.
    Как я понимаю, если архив записывается с переменной которая опрашивается периодически, то разницы нет среднее или интегральное среднее?
    А если архив записывается с переменной которая опрашивается по изменению значения, то надо использовать интегральное среднее?
    Сейчас я в цикле foreach подсчитываю сумму значений, количество значений и считаю среднее.
    Вопрос в том, как правильно записать вычисление среднего (интегрального среднего) в коде скрипта с точки зрения нормального программиста, а не такого почти дилетанта как я.

    using System;
    using MasterSCADA.Script.FB;
    using MasterSCADA.Hlp;
    using FB;
    using System.Linq;

    public partial class ФБ : ScriptBase
    {
    bool? M=false;
    public override void Execute()
    {
    if (Найти==true && M==false && Начало.HasValue && Конец.HasValue && Конец>Начало)
    {
    var elem = HostFB.InputGroup.GetPin("Вход").TreePinHlp;
    var k=elem.DataArchiveItem;

    DateTime EndTime=Конец.Value.ToUniversalTime();
    DateTime StartTime=Начало.Value.ToUniversalTime();
    var mas=k.Read(StartTime, EndTime, false);
    double? Max=null;
    double? Min=null;
    double? Avg=null;
    double? sum=0;
    double? num=0;
    DateTime? TimeStampMax=null;
    DateTime? TimeStampMin=null;

    foreach (var element in mas)
    {
    if (Max.HasValue==false || Convert.ToDouble(element.Value)>Max.Value)
    {
    Max=Convert.ToDouble(element.Value);
    TimeStampMax=element.Time.ToLocalTime();
    }
    if (Min.HasValue==false || Convert.ToDouble(element.Value)<Min.Value)
    {
    Min=Convert.ToDouble(element.Value);
    TimeStampMin=element.Time.ToLocalTime();
    }

    sum=sum + Convert.ToDouble(element.Value);
    num=num + 1;
    }
    Avg=sum / num;
    Максимум=Max;
    МеткаВремениМаксимум=TimeStampMax;
    Минимум=Min;
    МеткаВремениМинимум=TimeStampMin;
    Среднее=Avg;
    }
    M=Найти;
    }
    }
    Последний раз редактировалось KoryaevAN; 20.04.2020 в 09:28.

  2. #2

    По умолчанию

    Цитата Сообщение от KoryaevAN Посмотреть сообщение
    Как я понимаю, если архив записывается с переменной которая опрашивается периодически, то разницы нет среднее или интегральное среднее?
    А если архив записывается с переменной которая опрашивается по изменению значения, то надо использовать интегральное среднее?
    Да.

    У вас в принципе все сделано.
    Осталось только интеграл найти. С высотой прямоугольника, я думаю все понятно.
    Ширина - разница между точками. Сохраняйте в переменную значение метки времени с прошлого выполнения цикла foreach. И вычитаете из текущего:
    var diff = (dateTime1 - dateTime2).TotalSeconds;
    Умножаете на высоту, суммируете. В конце делите на общее количество секунд между двумя интервалами.
    Спасибо.

Похожие темы

  1. Вывод значений на экран ПЛК 73
    от sanatolich в разделе ПЛК63/73
    Ответов: 20
    Последнее сообщение: 24.01.2026, 11:22
  2. подсчёт среднего значения
    от evgnik в разделе ПЛК1хх
    Ответов: 10
    Последнее сообщение: 09.02.2019, 14:59
  3. Ответов: 4
    Последнее сообщение: 25.06.2018, 13:18
  4. Ответов: 4
    Последнее сообщение: 04.12.2014, 15:22
  5. вывод дискретных значений на СП 270
    от Rudi в разделе Эксплуатация
    Ответов: 4
    Последнее сообщение: 10.06.2014, 15:52

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •