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

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

  1. #1

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

    Доброго здоровья!
    MasterSCADA 3.11
    Есть необходимость вывести на мнемосхему текущую и скользящие: среднюю, максимальную, минимальную температуры наружного воздуха. Интервал расчета изменяемый (до недели).
    Функциональные блоки "Скользящее среднее", "Скользящий максимум" и "Скользящий минимум" сбрасывают накопленные расчеты при перезапуске или при изменении интервала.
    Функциональные блоки "Дискретное среднее", "Дискретный максимум" и "Дискретный минимум" не подходят, кроме того ведут себя так же.
    Со средним значением выход нашелся применением функции в расчете AbsArchAverageValue(Значение, DateTime( )-Интервал, DateTime( )). А что можно применить для вытаскивания из архива максимального и минимального значений?
    Пробный проект во вложении.
    Вложения Вложения
    • Тип файла: rar 1.rar (138.0 Кб, Просмотров: 10)

  2. #2

    По умолчанию

    В расчетах нет возможности извлечения максимума и минимума из архива. Плюс то как вы сейчас делали - постоянно опрашиваете Расчет, будет сильно грузить систему, так как приходится постоянно обращаться к архиву. Если конечно проект не большой, то это не критично.
    Вам все же лучше использовать ФБ "Скользящее среднее", просто попробовать в настройках ФБ на вкладке Опрос включить Восстановление при рестарте.
    Спасибо.

  3. #3

    По умолчанию

    Проект большой
    Опрос можно сделать и реже, раз в 10-15 мин, некритично.
    А с максимумом и минимумом печалька. Архивация значения ведется в MSSQL. Может там что то можно сделать (процедура, функция)?

  4. #4

    По умолчанию

    Можно скриптом
    https://insat.ru/blog/fb-skript-c-i-...otka-arkhivov/
    Но лучше все же ФБ
    Спасибо.

  5. #5

    По умолчанию

    Доработал скрипт. Вроде работает.
    Не смог воткнуть в него Аverage. Пришлось среднее считать по простому. Может, кто то предложит более правильный вариант?

  6. #6

    По умолчанию

    По правильному - считать интегральное среднее. Считаете интеграл - площадь фигуры, ограниченной интервлом и значениями сверху. Можно считать прямоугольниками - высота прямоугольника значение величины в момент времени, ширина - значение в секундах до следующего значения. Суммируете все, и делите на количество секунд за этот интервал.
    Спасибо.

  7. #7

    По умолчанию

    Всё это правильно. Но, для меня, проблема как реализовать это в коде скрипта. Я электронщик, программиста нет, поэтому приходится самому этим заниматься.
    Как я понимаю, если архив записывается с переменной которая опрашивается периодически, то разницы нет среднее или интегральное среднее?
    А если архив записывается с переменной которая опрашивается по изменению значения, то надо использовать интегральное среднее?
    Сейчас я в цикле 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.

  8. #8

    По умолчанию

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

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

Похожие темы

  1. Вывод значений на экран ПЛК 73
    от sanatolich в разделе ПЛК63/73
    Ответов: 18
    Последнее сообщение: 14.06.2021, 20:29
  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, 16:52

Ваши права

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