"Сдвиг" значений по регистрам

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

    Добрый день, коллеги!

    Не могу реализовать формулой простую (на первый взгляд) вещь.
    Организовано три канала — один текущий «ТИ» и два (n и m) «Дорасчетный ТИ».
    Задача — организовать циклический сдвиг значений из n в m и из текущего ТИ в n при условии, что значение текущего канала не равно значению канала n.
    Если значение текущего канала по отношению к значению канала n не меняется, все нужно оставить как есть.

    Формула выглядит так:

    public double Trigger(double sut, int stat, int n, int m)
    {
    if (sut != Val(m))
    {
    SetData(m, Val(n), Stat(n));
    SetData(n, sut, stat);
    }
    return double.NaN;
    }

    Формулу вызываю из еще одного Дорасчетного ТИ:

    Trigger(Val(1001), Stat(1001), 1007, 1008)

    1001 — текущий, 1007 и 1008 — n и m соответственно.

    Сдвиг не получается.
    Значение канала 1001 одновременно попадает и в 1007 и в 1008

    #8322
    manjey73
    Участник

    if (sut != Val(m))
    {
    SetData(m, Val(n), Stat(n));
    SetData(n, sut, stat);
    }

    ну а где же else ? а то у вас одна проверка всего и сразу везде все пишите.

    Еще один момент, возможно вы наступили на грабли.
    Номера входных каналов выполняются строго последовательно как шаги в LAD языке.
    Возможно ваша формула и рабочая, но она должна стоять выше какого-то дорасчетного канала, чтобы работала правильно.

    • Этот ответ был изменен 6 лет, 2 месяца назад от manjey73.
    #8324
    kustar
    Участник

    Да, конечно, можно и с else:

    public double Trigger(double sut, int stat, int n, int m, int l, int k)
    {
    if (sut != Val(n))
    {
    SetData(k, Val(l), Stat(l));
    SetData(l, Val(m), Stat(m));
    SetData(m, Val(n), Stat(n));
    SetData(n, sut, stat);
    }
    else
    {
    SetData(k, Val(k), Stat(k));
    SetData(l, Val(l), Stat(l));
    SetData(m, Val(m), Stat(m));
    SetData(n, Val(n), Stat(n));
    }
    return sut;
    }

    Для понимания происходящего сделал для сдвига 4 канала.
    Номер канала, в котором вызывается формула, не влияет на результат.
    То есть, не имеет значения, работает ли сначала формула, а потом считывается «текущий» канал, являющийся источником данных для сдвига, или наоборот — сначала вычисляется «текущий» канал, а потом канал с формулой.
    С четырьмя каналами ситуация стала еще более запутанной.
    На сервере сейчас порядка 600 рабочих входных каналов.
    Коммуникатор (SNMP) поставляет данные с периодичностью ок 2 сек. — стандартный MIB’овский SysUpTime.
    Отображаю значения всех каналов на схеме. Наблюдаю периодичность обновления схемы ок. 15 секунд.
    На схеме значения текущего канала и канала n совпадают. В каналах m, l и k — некие промежуточные значения SysUpTime, которые не появляются на схеме в 15-ти секундном режиме обновления.
    Выходит, значения каналов записываются (или вычисляются) быстрее, чем обновляется схема?
    И формула работает, только с другой «тактовой» частотой, намного быстрее, чем обновляется схема?

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

    Выходит, значения каналов записываются (или вычисляются) быстрее, чем обновляется схема? И формула работает, только с другой «тактовой» частотой, намного быстрее, чем обновляется схема?

    Да. От обновления схемы вообще не зависит. Формула для канала типа ТИ вызывается, когда значение приходит из Коммуникатора. Вы можете настроить скорость опроса в Коммуникаторе. Значения дорасчётных каналов пересчитываются при любом изменении каналов типа ТС/ТИ, а также ещё дополнительно в цикле.

    #8331
    kustar
    Участник

    Добрый день, Михаил!
    Коммуникатором регулировать не очень удобно. КП будет много (сетевое оборудование корпоративной сети), частота опроса будет падать по мере добавления новых КП. А как сделать цикл для дорасчетных каналов? Можно ли его синхронизировать чем-нибудь?

    #8334
    manjey73
    Участник

    kustar — ваш синхронизатор это собственно ТИ и есть. дорасчетные каналы видя, что там значения не изменились оставят все как есть, если изменились то пересчитают.
    Просто нужна правильная последовательность выполнения и не придется подгонять ни опрос ничего остального.

    Подгонять временем опроса в общем-то бесполезно…. рано или поздно, звезды сойдутся иначе, чем вам хотелось бы.

    • Этот ответ был изменен 6 лет, 2 месяца назад от manjey73.
    #8346
    Mikhail
    Модератор

    А в целом, какая задача стоит, для чего эти сдвиги?

    #8348
    kustar
    Участник

    Задача простая.
    Я по SNMP от сетевого устройства (коммутатора, маршрутизатора etc) получаю SysUpTime в тиках и значения накопительных счетчиков по интерфейсам этих устройств — ifInOctets, ifOutOctets, etc. Задача — посчитать и показать на схеме мгновенную скорость по интерфейсам. Для этого и нужны текущее и предыдущее значение.
    Проблема, собственно, в том, что некоторые сетевые устройства выдают SysUpTime периодом в 1 тик (0,01 сек), а некоторые неторопливые — с периодом аж 1500 тиков (15 сек.)
    Четыре входных канала делал только для понимания процесса, достаточно двух.

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

    Да, надо сохранять предыдущее значение и время этого значения.
    Хотя ещё можно использовать Val() — предыдущее, Cnl — текущее значение. Но время всё равно придётся сохранять в переменную или входной канал.
    Задача выглядит вполне решаемой, но требуется отладка, что не входит в бесплатную поддержку. Если смогу помочь советом, буду рад.

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