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