Стартовая страница › Форумы › Вопросы без категории › формула для перерастчета
- В этой теме 37 ответов, 4 участника, последнее обновление 8 лет, 1 месяц назад сделано
Romiros.
-
АвторСообщения
-
13.04.2018 в 12:30 #8895
skoda_rapid2017
УчастникДобрый день! Кто-нибудь может подсказать, какую формулу применить для следующего примера:
есть переменная, которая все время меняется
мне нужно сделать следующее, когда значение при следующем опросе не меняется, то выдавать ошибку на Вебстанцию
Может кто помочь в написании формулы?13.04.2018 в 12:41 #8896
manjey73Участникможет просто таймер поставить на изменение канала и его отлавливать для вывода ошибки ?
Я так SysUpTime с ПК контролировал…13.04.2018 в 12:58 #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 и для работы так же нужна формула Ticks13.04.2018 в 12:59 #8898
manjey73УчастникНу можно все упростить конечно, просто делал универсальные формулы для применения в разных каналах, поэтому тут столько наворотов. Пинговаться может куча ПК, так что как-то так.
Скорее всего надо переделывать, если значение канала может быть и больше и меньше. Там знак > надо будет поменять на неравно наверное..
-
Ответ изменён 8 лет, 2 месяца назад пользователем
manjey73.
13.04.2018 в 13:04 #8900skoda_rapid2017
УчастникА каким образом использовать таймер в скаде?
13.04.2018 в 13:06 #8901skoda_rapid2017
УчастникКогда я перезагружаю коммутатор счетчик обнуляется
13.04.2018 в 13:11 #8902skoda_rapid2017
УчастникСпасибо. Попробую как вариант
13.04.2018 в 13:28 #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 приводятся к булевой.
И эта переменная взводит таймер, если результат вычисления равен нулю. Или как в случае следующей пришедшей переменной меньше по значению, чем была тоже взведется таймер… если на входе значения будут уменьшаться постоянно, то таймер сработает ложно.13.04.2018 в 13:36 #8906
manjey73УчастникДа, по идее просто замените > 0 на != 0
eq = (UpTime - valUpTime[res]) != 0 ;13.04.2018 в 13:41 #8907skoda_rapid2017
УчастникИспользовал формулу, но при перезапуске сервера в статистике возникла ошибка.
Ругается на функцию Ton13.04.2018 в 13:44 #8908
manjey73УчастникТак я написал, что нужна еще Ton и Ticks для работы.
Tickspublic 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.
13.04.2018 в 14:42 #8910skoda_rapid2017
УчастникИспользуя вашу формулу, получилось следующее. На Вебстанцию все время выводится значение «1»
13.04.2018 в 15:00 #8915
manjey73Участникхм, PT сколько ввели ? там значение в миллисекундах
NotEquals(Val(10), 15000) — в канале должна появиться 1 только через 15 секунд. Большое время можно ставить чтобы увидеть после перезапуска сервера 0 в канале.на != поменяли в формуле ?
И какой канал вы используете для тестирования ? в нем значения меняются за данный промежуток времени ? Какой у вас период опроса ? таймер должен превышать период опроса.
13.04.2018 в 16:27 #8918skoda_rapid2017
УчастникРТ=15000, также как у Вас поставил. После перезапуска все равно значение равно 1.
на != поменял в формуле. Использую канал входной, телеизмерение.Значение переменной у меня меняется каждые примерно 5сек. когда линию от коммутатора откидываю счетчик останавливается, подключаю обратно и продолжает дальше считать. Когда перезапускаю коммутатор отключив полностью питание, и после включения счетчик начинает считать с нуля.13.04.2018 в 16:51 #8919
manjey73Участникхм, странно. если получится попробую у себя на чем нибудь проверить.
-
Ответ изменён 8 лет, 2 месяца назад пользователем
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.