Бесконечный счётчик

  • В этой теме 12 ответов, 4 участника, последнее обновление 9 лет назад сделано Mikhail.
Просмотр 13 сообщений - с 1 по 13 (из 13 всего)
  • Автор
    Записи
  • #3965
    BETAL
    Участник

    Добрый день, помогите решить простую задачу. Счётчик физического устройства рассчитан на максимальное значение 65535 (после этого вход обнуляется и считается заново), что идёт в ущерб системы автоматизации. С таким пределом счётчика будет необходимо 1 раз в неделю подбивать значения каналов определённым коэффициентом. Поэтому хочу сделать формулу с переменной, которая инкрементируется при изменении физического значения входа счётчика относительно его предыдущего значения на 1 единицу и, тем самым, получить бесконечный счётчик. Частота изменения состояния входа счётчика примерно 30 секунд. В качестве физического устройства дискретного ввода использую МВ110-16Д. Из всей этой задачи мне не понятно лишь как извлекать предыдущее значение счётчика и сравнивать его с текущим значением. Нужно ли для этого создавать массив или есть способ проще? Спасибо.

    #3966
    manjey73
    Участник

    Не обязательно массив, может быть достаточно и переменной, Но весь фокус в том, что при перезапусках Сервера все переменный проходят инициализацию по новой.
    А в вашем случае эта переменная должна быть сохраняемой.
    В рамках Rapid SCADA это надо формулу писать с учетом работы с файлом и писать переменную в файл.

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

    Думаю, можно как-то его перехитрить. Идея такая: если новое значение канала меньше текущего, то мы их складываем.
    Пример формулы:
    Cnl >= Val() ? Cnl : ((int)(Val() / 65536))*65536 + Cnl

    Cnl — новое значение канала
    Val() — текущее значение канала

    Формулы на форуме я не проверяю. Если хотите могу за некоторую плату сделать готовую работающую формулу.

    Если эта идея не сработает, то вместо файлов можно использовать дополнительный входной канал. Они сохраняются при перезапуске.

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

    Возможно, надо исправить (Val() + 1) / 65536

    #3969
    BETAL
    Участник

    Большое спасибо, как проверю — обязательно отпишусь.

    #3970
    manjey73
    Участник

    Неправильно как-то.

    Когда счетчик намотает достаточно много, больше чем помещается в 32 бита, то (int)Val() его просто обрежет до 32-х битного значения.

    Или я неправ ?

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

    Да, вместо (int)(Val() лучше написать (long)(Val() или Math.Trunc(Val()

    • Ответ изменён 9 лет, 6 месяцев назад пользователем Mikhail.
    #6040
    BETAL
    Участник

    Доброго времени суток. Пришлось взять долгий перерыв в решении проблемы данной темы. Попробовал все предложенные варианты, после переключения счётчика в ноль суммирование не происходит, и счётчик начинает считаться заново.
    Но я придумал альтернативный вариант. Есть такой тип канала — «Количество переключений» и если привязать его через формулу к Val-значению счётчика, сбросить счётчик в ноль и подавать сигналы на рост значения счётчика, то значение этого самого канала «Количество переключений» увеличится на 2. И так при каждом обнулении. Таким образом я решил, что данный тип канала сильно увеличит диапазон значений счётчика и послужит множителем при сбросе счётчика в ноль. Получилась такая формула:
    (Val(№ канала кол. перекл.)>0?((Cnl+(Val(№ канала кол. перекл.)/2)*65535)/)+const:Cnl+const
    Но тут меня ждала неудача — почему-то значение канала кол-ва переключений не изменилось, соответственно счётчик просто сбросился.
    Есть ли ещё какой-либо альтернативный метод ввести дополнительную переменную, которая систематически меняет своё значение при наличии на входе связанного с ним канала определённого числа?

    #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»!

    #6043
    BETAL
    Участник

    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> Нормальная работа программы невозможна.

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

    С идеей из поста 3967 что-то не получилось?
    По сравнению с декабрём 2016, когда начата эта тема, появились функция записи значения во входной канал SetVal. Можно и её здесь применить.

    Предложение разработать формулу за деньги остаётся в силе. Потребуется макс. несколько дней.

    #6314
    BETAL
    Участник

    Михаил, всё-таки решил свою проблему через канала типа «Количество переключений». Правда, через 3 дорасчётных канала и формулу из моего поста выше пришлось немного доработать. Но всё стабильно считается уже 2 недели.

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

    Вероятно, можно как-то упростить, но главное, что работает.

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