Стартовая страница › Форумы › Понять, как работает ПО › Формулы › "Сдвиг" значений по регистрам
- В этой теме 8 ответов, 3 участника, последнее обновление 8 лет, 4 месяца назад сделано
Mikhail.
-
АвторСообщения
-
29.01.2018 в 08:56 #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 и в 100829.01.2018 в 09:23 #8322
manjey73Участникif (sut != Val(m))
{
SetData(m, Val(n), Stat(n));
SetData(n, sut, stat);
}ну а где же else ? а то у вас одна проверка всего и сразу везде все пишите.
Еще один момент, возможно вы наступили на грабли.
Номера входных каналов выполняются строго последовательно как шаги в LAD языке.
Возможно ваша формула и рабочая, но она должна стоять выше какого-то дорасчетного канала, чтобы работала правильно.-
Ответ изменён 8 лет, 4 месяца назад пользователем
manjey73.
29.01.2018 в 12:51 #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-ти секундном режиме обновления.
Выходит, значения каналов записываются (или вычисляются) быстрее, чем обновляется схема?
И формула работает, только с другой «тактовой» частотой, намного быстрее, чем обновляется схема?29.01.2018 в 14:28 #8327
MikhailМодераторВыходит, значения каналов записываются (или вычисляются) быстрее, чем обновляется схема? И формула работает, только с другой «тактовой» частотой, намного быстрее, чем обновляется схема?
Да. От обновления схемы вообще не зависит. Формула для канала типа ТИ вызывается, когда значение приходит из Коммуникатора. Вы можете настроить скорость опроса в Коммуникаторе. Значения дорасчётных каналов пересчитываются при любом изменении каналов типа ТС/ТИ, а также ещё дополнительно в цикле.
29.01.2018 в 14:51 #8331
kustarУчастникДобрый день, Михаил!
Коммуникатором регулировать не очень удобно. КП будет много (сетевое оборудование корпоративной сети), частота опроса будет падать по мере добавления новых КП. А как сделать цикл для дорасчетных каналов? Можно ли его синхронизировать чем-нибудь?29.01.2018 в 21:59 #8334
manjey73Участникkustar — ваш синхронизатор это собственно ТИ и есть. дорасчетные каналы видя, что там значения не изменились оставят все как есть, если изменились то пересчитают.
Просто нужна правильная последовательность выполнения и не придется подгонять ни опрос ничего остального.Подгонять временем опроса в общем-то бесполезно…. рано или поздно, звезды сойдутся иначе, чем вам хотелось бы.
-
Ответ изменён 8 лет, 4 месяца назад пользователем
manjey73.
31.01.2018 в 14:08 #8346
MikhailМодераторА в целом, какая задача стоит, для чего эти сдвиги?
31.01.2018 в 14:47 #8348
kustarУчастникЗадача простая.
Я по SNMP от сетевого устройства (коммутатора, маршрутизатора etc) получаю SysUpTime в тиках и значения накопительных счетчиков по интерфейсам этих устройств — ifInOctets, ifOutOctets, etc. Задача — посчитать и показать на схеме мгновенную скорость по интерфейсам. Для этого и нужны текущее и предыдущее значение.
Проблема, собственно, в том, что некоторые сетевые устройства выдают SysUpTime периодом в 1 тик (0,01 сек), а некоторые неторопливые — с периодом аж 1500 тиков (15 сек.)
Четыре входных канала делал только для понимания процесса, достаточно двух.04.02.2018 в 11:24 #8390
MikhailМодераторДа, надо сохранять предыдущее значение и время этого значения.
Хотя ещё можно использовать Val() — предыдущее, Cnl — текущее значение. Но время всё равно придётся сохранять в переменную или входной канал.
Задача выглядит вполне решаемой, но требуется отладка, что не входит в бесплатную поддержку. Если смогу помочь советом, буду рад. -
Ответ изменён 8 лет, 4 месяца назад пользователем
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.