формула для перерастчета

Стартовая страница Форумы Вопросы без категории формула для перерастчета

Просмотр 15 сообщений - с 1 по 15 (из 38 всего)
  • Автор
    Сообщения
  • #8895
    skoda_rapid2017
    Участник

    Добрый день! Кто-нибудь может подсказать, какую формулу применить для следующего примера:
    есть переменная, которая все время меняется
    мне нужно сделать следующее, когда значение при следующем опросе не меняется, то выдавать ошибку на Вебстанцию
    Может кто помочь в написании формулы?

    #8896
    manjey73
    Участник

    может просто таймер поставить на изменение канала и его отлавливать для вывода ошибки ?
    Я так SysUpTime с ПК контролировал…

    #8897
    manjey73
    Участник
    int[] NotEqualsNum = new int[1];
    bool[] valEquals = new bool[1];
    double[] valUpTime = new double[1];
    public double NotEquals(double UpTime, double PT)
    {
    bool eq = false;
    bool q = Val(CnlNum) > 0;
    
    int res = Array.IndexOf(NotEqualsNum, CnlNum);
    if (res == -1)
    {
    res = NotEqualsNum.Length;
    Array.Resize(ref NotEqualsNum,  res+1);
    Array.Resize(ref valEquals,   res+1);
    Array.Resize(ref valUpTime,   res+1);
    NotEqualsNum[res] = CnlNum;
    valUpTime[res] = UpTime;
    valEquals[res] = q;
    }
    eq = (UpTime - valUpTime[res]) > 0 ;
    valUpTime[res] = UpTime;
    double tonIn = Convert.ToDouble(!eq);
    valEquals[res] = Convert.ToBoolean(Ton(tonIn, PT));
    return Convert.ToDouble(valEquals[res]);
    }

    Не знаю, будет ли работать если переменная UpTime будет прыгать в разные стороны, это был контроль работы ПК и UpTime у него всегда увеличивается.
    Из формулы вызывается Ton и для работы так же нужна формула Ticks

    #8898
    manjey73
    Участник

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

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

    • Ответ изменён 8 лет, 2 месяца назад пользователем manjey73.
    #8900
    skoda_rapid2017
    Участник

    А каким образом использовать таймер в скаде?

    #8901
    skoda_rapid2017
    Участник

    Когда я перезагружаю коммутатор счетчик обнуляется

    #8902
    skoda_rapid2017
    Участник

    Спасибо. Попробую как вариант

    #8903
    manjey73
    Участник

    Просто в Дорасчетном канале появится 1 после задержки, которую вы введете в качестве параметра PT

    eq = (UpTime - valUpTime[res]) > 0 ;
    valUpTime[res] = UpTime;
    double tonIn = Convert.ToDouble(!eq);
    valEquals[res] = Convert.ToBoolean(Ton(tonIn, PT));
    return Convert.ToDouble(valEquals[res]);

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

    • Ответ изменён 8 лет, 2 месяца назад пользователем manjey73.
    • Ответ изменён 8 лет, 2 месяца назад пользователем manjey73.
    #8906
    manjey73
    Участник

    Да, по идее просто замените > 0 на != 0
    eq = (UpTime - valUpTime[res]) != 0 ;

    #8907
    skoda_rapid2017
    Участник

    Использовал формулу, но при перезапуске сервера в статистике возникла ошибка.
    Ругается на функцию Ton

    #8908
    manjey73
    Участник

    Так я написал, что нужна еще Ton и Ticks для работы.
    Ticks

    public static long Ticks()
    {
    DateTime now = DateTime.Now;
    long time = now.Ticks/10000;
    return time;
    }

    и Ton

    int[] TonNum = new int[1];
    long[] TonST = new long[1];
    bool[] TonFlag = new bool[1];
    public double Ton(double TonIn, double TonPT)
    {
    long ET = 0L;
    long ton_pt = Convert.ToInt64(TonPT);
    bool q = Val(CnlNum) > 0;
    bool ton_in = TonIn > 0;
    
    int res = Array.IndexOf(TonNum, CnlNum);
    if (res == -1)
    {
    res = TonNum.Length;
    Array.Resize(ref TonNum,  res+1);
    Array.Resize(ref TonST,   res+1);
    Array.Resize(ref TonFlag, res+1);
    TonNum[res] = CnlNum;
    }
    
    if (!ton_in)
    {
    q = false;
    TonFlag[res] = false;
    TonST[res] = 0L;
    }
    else
    {
    if (!TonFlag[res])
    {
    TonFlag[res] = true;
    TonST[res] = Ticks();
    }
     else
     {
       if (!q) ET = Ticks() - TonST[res];
     }
     if (ET >= ton_pt) q = true;
    }
    return Convert.ToDouble(q);
    }

    Выкладываю свои последние, так как они по умолчанию возвращают значение в double, что позволяет их использовать внутри других формул в канале, если это необходимо.

    • Ответ изменён 8 лет, 2 месяца назад пользователем manjey73.
    #8910
    skoda_rapid2017
    Участник

    Используя вашу формулу, получилось следующее. На Вебстанцию все время выводится значение «1»

    #8915
    manjey73
    Участник

    хм, PT сколько ввели ? там значение в миллисекундах
    NotEquals(Val(10), 15000) — в канале должна появиться 1 только через 15 секунд. Большое время можно ставить чтобы увидеть после перезапуска сервера 0 в канале.

    на != поменяли в формуле ?

    И какой канал вы используете для тестирования ? в нем значения меняются за данный промежуток времени ? Какой у вас период опроса ? таймер должен превышать период опроса.

    • Ответ изменён 8 лет, 2 месяца назад пользователем manjey73.
    • Ответ изменён 8 лет, 2 месяца назад пользователем manjey73.
    #8918
    skoda_rapid2017
    Участник

    РТ=15000, также как у Вас поставил. После перезапуска все равно значение равно 1.
    на != поменял в формуле. Использую канал входной, телеизмерение.Значение переменной у меня меняется каждые примерно 5сек. когда линию от коммутатора откидываю счетчик останавливается, подключаю обратно и продолжает дальше считать. Когда перезапускаю коммутатор отключив полностью питание, и после включения счетчик начинает считать с нуля.

    #8919
    manjey73
    Участник

    хм, странно. если получится попробую у себя на чем нибудь проверить.

Просмотр 15 сообщений - с 1 по 15 (из 38 всего)
  • Для ответа в этой теме необходимо авторизоваться.