Стартовая страница › Форумы › Понять, как работает ПО › Бесконечный счётчик
Помечено: инкремент счётчик МВ110
- В этой теме 12 ответов, 4 участника, последнее обновление 9 лет назад сделано
Mikhail.
-
АвторЗаписи
-
29.12.2016 в 14:09 #3965
BETAL
УчастникДобрый день, помогите решить простую задачу. Счётчик физического устройства рассчитан на максимальное значение 65535 (после этого вход обнуляется и считается заново), что идёт в ущерб системы автоматизации. С таким пределом счётчика будет необходимо 1 раз в неделю подбивать значения каналов определённым коэффициентом. Поэтому хочу сделать формулу с переменной, которая инкрементируется при изменении физического значения входа счётчика относительно его предыдущего значения на 1 единицу и, тем самым, получить бесконечный счётчик. Частота изменения состояния входа счётчика примерно 30 секунд. В качестве физического устройства дискретного ввода использую МВ110-16Д. Из всей этой задачи мне не понятно лишь как извлекать предыдущее значение счётчика и сравнивать его с текущим значением. Нужно ли для этого создавать массив или есть способ проще? Спасибо.
29.12.2016 в 15:58 #3966
manjey73УчастникНе обязательно массив, может быть достаточно и переменной, Но весь фокус в том, что при перезапусках Сервера все переменный проходят инициализацию по новой.
А в вашем случае эта переменная должна быть сохраняемой.
В рамках Rapid SCADA это надо формулу писать с учетом работы с файлом и писать переменную в файл.29.12.2016 в 17:08 #3967
MikhailМодераторДумаю, можно как-то его перехитрить. Идея такая: если новое значение канала меньше текущего, то мы их складываем.
Пример формулы:
Cnl >= Val() ? Cnl : ((int)(Val() / 65536))*65536 + CnlCnl — новое значение канала
Val() — текущее значение каналаФормулы на форуме я не проверяю. Если хотите могу за некоторую плату сделать готовую работающую формулу.
Если эта идея не сработает, то вместо файлов можно использовать дополнительный входной канал. Они сохраняются при перезапуске.
29.12.2016 в 17:11 #3968
MikhailМодераторВозможно, надо исправить (Val() + 1) / 65536
30.12.2016 в 09:30 #3969BETAL
УчастникБольшое спасибо, как проверю — обязательно отпишусь.
30.12.2016 в 09:53 #3970
manjey73УчастникНеправильно как-то.
Когда счетчик намотает достаточно много, больше чем помещается в 32 бита, то (int)Val() его просто обрежет до 32-х битного значения.
Или я неправ ?
30.12.2016 в 16:49 #3973
MikhailМодераторДа, вместо (int)(Val() лучше написать (long)(Val() или Math.Trunc(Val()
-
Ответ изменён 9 лет, 6 месяцев назад пользователем
Mikhail.
07.06.2017 в 14:58 #6040BETAL
УчастникДоброго времени суток. Пришлось взять долгий перерыв в решении проблемы данной темы. Попробовал все предложенные варианты, после переключения счётчика в ноль суммирование не происходит, и счётчик начинает считаться заново.
Но я придумал альтернативный вариант. Есть такой тип канала — «Количество переключений» и если привязать его через формулу к Val-значению счётчика, сбросить счётчик в ноль и подавать сигналы на рост значения счётчика, то значение этого самого канала «Количество переключений» увеличится на 2. И так при каждом обнулении. Таким образом я решил, что данный тип канала сильно увеличит диапазон значений счётчика и послужит множителем при сбросе счётчика в ноль. Получилась такая формула:
(Val(№ канала кол. перекл.)>0?((Cnl+(Val(№ канала кол. перекл.)/2)*65535)/)+const:Cnl+const
Но тут меня ждала неудача — почему-то значение канала кол-ва переключений не изменилось, соответственно счётчик просто сбросился.
Есть ли ещё какой-либо альтернативный метод ввести дополнительную переменную, которая систематически меняет своё значение при наличии на входе связанного с ним канала определённого числа?07.06.2017 в 15:33 #6041
EvgenУчастникЗдравствуйте!
BETAL если я правильно Вас понял вам необходимо считать в бесконечность?
Если так я предложу следующее:
Создаем дорасчетный ТИ
и простую формулу
public double qwq(int dependOnCnl)
{
double z = 0;
double x = Val(Cnl);
if (z != Val(dependOnCnl))
{
z = Val(dependOnCnl);
x = x+1;
}
}
return x;
}формулу нужно будет проверить!!!
таким образом при изменении канала «dependOnCnl» текущий канал изменится на 1
Но нужно учесть что при перезапуске сервера у Вас z станет равное «0»!08.06.2017 в 09:24 #6043BETAL
УчастникEvgen, у нас сервер это обычная рабочая станция, на которой как минимум раз в неделю происходит обновление ПО с дальнейшей перезагрузкой и, соответственно, сервер перезапускается. Проверил вашу формулу в Rapid SCADA — с такой формулой сервер не хочет стартовать, ниже лог.
2017-06-08 09:17:09 <VOR16-WS0200><система><ERR> Ошибка при компилировании исходного кода формул:
Строка 468, колонка 1: error CS1519: Недопустимый токен «return» в объявлении класса, структуры или интерфейса
Строка 468, колонка 9: error CS1519: Недопустимый токен «;» в объявлении класса, структуры или интерфейса
Строка 470, колонка 8: error CS1518: Ожидался класс, делегат, перечисление, интерфейс или структура
Строка 471, колонка 8: error CS1518: Ожидался класс, делегат, перечисление, интерфейс или структура
Строка 472, колонка 8: error CS1518: Ожидался класс, делегат, перечисление, интерфейс или структура
Строка 472, колонка 114: error CS1518: Ожидался класс, делегат, перечисление, интерфейс или структура
Строка 472, колонка 171: error CS0116: Пространство имен не может напрямую включать в себя такие члены, как поля или методы
Строка 472, колонка 200: error CS1022: Ожидалось определение типа или пространства имен, либо признак конца файла
Для ознакомления с исходным кодом см. файл C:\SCADA\ScadaServer\Log\CalcEngine.cs
2017-06-08 09:17:09 <VOR16-WS0200><система><ERR> Нормальная работа программы невозможна.08.06.2017 в 09:51 #6044
MikhailМодераторС идеей из поста 3967 что-то не получилось?
По сравнению с декабрём 2016, когда начата эта тема, появились функция записи значения во входной канал SetVal. Можно и её здесь применить.Предложение разработать формулу за деньги остаётся в силе. Потребуется макс. несколько дней.
27.06.2017 в 13:19 #6314BETAL
УчастникМихаил, всё-таки решил свою проблему через канала типа «Количество переключений». Правда, через 3 дорасчётных канала и формулу из моего поста выше пришлось немного доработать. Но всё стабильно считается уже 2 недели.
27.06.2017 в 14:54 #6316
MikhailМодераторВероятно, можно как-то упростить, но главное, что работает.
-
Ответ изменён 9 лет, 6 месяцев назад пользователем
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.