Использование массивов

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

    Здравствуйте.
    Пытаюсь использовать массивы для написания формул. Значения высчитываются, но некорректно.
    Например, хочу вычислить сумму последних 5 измерений.
    Написал следующую формулу:

    double[] superArray = new double[5];

    public double qqqSum (double val)
    {
    int count = 0;
    double superSum = 0;

    for (int i = 0; i < superArray.Length; i++)
    {
    if(superArray[i] != 0)
    {
    count++;
    }
    }

    if(count == 5)
    {
    for (int i = 0; i < superArray.Length — 1; i++)
    {
    superArray[i] = superArray[i + 1];
    }
    superArray[4] = val;
    }
    else
    {
    superArray[count] = val;
    }

    for (int i = 0; i < superArray.Length; i++)
    {
    superSum = superSum + superArray[i];
    }

    return superSum;
    }

    Создал «Дорасчётный ТИ» канал, в который записываю выражение — qqqSum(Val(101));
    где 101 — номер входного канала «Телеизмерение», который получает данные непосредственно с устройства по Modbus (забирает корректно, проверено).

    Дело в том, что значение суммы примерно похожее, но не правильное (например сумма должна быть 3.117, а она 3.329 и т.д.). Но и ошибки в своём алгоритме не вижу.

    Очевидно, что я делаю что то неверно, но не понимаю что.

    Для канала «Минутный ТИ» эта же формула с массивом отрабатывает корректно.

    #16106
    Аватарmanjey73
    Участник

    Может ошибка в том, что не зависимо от пришло значение от устройства или не пришло, у вас каждый цикл Базы срабатывает формула ?

    База Scada сама по себе это цикл от 1-ого канала до последнего и так по кругу, независимо, пришло новое значение от Коммуникатора или нет

    • Этот ответ был изменен 1 год назад от Аватарmanjey73.
    #16116
    Аватарvg
    Участник

    В первом сообщении забыл указать важный момент: устройство выдаёт 2 измерения в секунду. А я забыл, что минимальный период обновления данных в веб-приложении — 1 секунда. В результате сумма элементов массива не имела шансов оказаться корректной по некорректному наблюдению. Можно ли настроить цикл отработки Базы SCADA, чтобы синхронизировать его с устройством?

    Вы спросили про срабатывание формулы вне зависимости от поступления данных с устройства. Есть возможность такой настройки? У меня просто выставлена галка «Использовать формулу» и других настроек не нашёл.

    #16117
    Аватарmanjey73
    Участник

    Нет, такой настройки нет. За сколько ПК успеет обработать все каналы, столько и будет длиться цикл.
    Надо у Михаила как-то спросить, как можно сделать синхронизацию и возможно ли это вообще.

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

    Мне пока только такое на ум приходит… Это если надо всегда именно новые значения заполнять в массив.

    Вообще, Scada с каналами работает примерно как ПЛК с LAD языком, строчка за строчкой.

    • Этот ответ был изменен 1 год назад от Аватарmanjey73.
    #16119
    MikhailMikhail
    Модератор

    Добрый день!

    Посмотрите эти формулы, возможно они делают необходимые Вам расчёты.

    Формула канала типа ТС/ТИ срабатывает при поступлении данных от Коммуникатора (от устройства). Формулы каналов дорасчётного типа пересчитываются постоянно. Для получения суммы 5 измерений как раз подходит расчёт при поступлении данных.

    #16122
    Аватарvg
    Участник

    Благодарю за ответы.

    #16123
    Аватарvg
    Участник

    Позвольте ещё один вопрос на эту тему для закрепления понимания:
    «Формулы каналов дорасчётного типа пересчитываются постоянно». Имеется ввиду, что после отработки канала, сразу, не дожидаясь поступлений новых данных от устройства или завершения всего цикла, начинается новая отработка дорасчётного канала?

    • Этот ответ был изменен 1 год назад от Аватарvg.
    • Этот ответ был изменен 1 год назад от Аватарvg.
    #16144
    Аватарmanjey73
    Участник

    Скорее так. Имеем каналы,
    ТС, ТИ, ТС, ТИ, Дор, Дор, Дор и та далее — Это и есть цикл от первого до последнего.
    Если я правильно понял, формулы в ТС и ТИ срабатывают только когда в них поступили новые данные. А вот формулы Дорасчетных будут выполняться всегда каждый цикл.

    #16147
    Аватарvg
    Участник

    Ясно. Спасибо за разъяснение.

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