Простейшие программы на Rapid Scada

Просмотр 15 сообщений - с 31 по 45 (из 69 всего)
  • Автор
    Сообщения
  • #2068
    Mikhail
    Модератор

    Достаточно
    int x = 0;

    И затем

    function int GetNextX()
    {
      const MaxX = 10;
      int nextX = ++x;
      if (nextX > MaxX)
        nextX = 0;
      return nextX;
    }
    

    Если Вы этот счётчик выведете в качестве значения входного канала, то на него можно сделать триггеры в Модуле автоматического управления.

    #2069
    djbond07
    Участник

    Что-то я замудрил. Можно для подсчёта количества включений использовать тип канала «Кол-во переключений». Но я не совсем понял, какую формулу в нём задать? То есть у меня ко входному каналу 1 привязан поплавок, который устанавливается или в 0 или в 1. как правильно использовать данный канал для подсчёта его переключений?

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

    Этот канал должен быть привязан к датчику, т.е. для него должно быть заполнено поле Сигнал. При переходе значения, полученного от Коммуникатора, через 0, например, -1 — 1 или 0 — 1, значение канала будет увеличиваться на 1. Формула не нужна.

    Если вдруг не заработает, то пишите.

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

    Для проверки используйте генератор значений Сервера.

    #2072
    djbond07
    Участник

    Здравствуйте! Не сработало. Опишу в терминах моих каналов, чтобы не исковеркать информацию.

    Датчик типа сухой контакт привязан к 1-му входу модуля ввода-вывода. В скаде ему соответствует входной канал 291 тип телесигнал, номер сигнала: 1. В коммуникаторе и веб интерфейсе скады могу отслеживать переключение его с 0 на 1. Завёл новый входной канал №115 тип Кол-во переключений. Прописал в поле сигнал тоже «1». Но значение в веб интерфейсе не изменяется.

    Ещё одна странная особенность. Если через генератор значений Сервера отправлять данные на этот канал, то все значения начиная с 1-цы увеличиваются на 1. то есть я посылаю 1, показывает 2; посылаю 4, показывает 5. Если посылать 0 и отрицательные числа, то отображает их корректно. Может Вам будет полезна эта информация. Не знаю баг это, или так задумано.

    #2073
    djbond07
    Участник

    Дополнение. Если изменить тип канала 291 с телеизмерения на Кол-во переключений, и убрать все размерности, то при переходе датчика из 0 в 1 и обратно просто меняются цифры 0-2-0-2, и т.д.

    #2076
    manjey73
    Участник

    Объявление переменных

    FUNCTION_BLOCK FF_DRE
    VAR_INPUT
    SET : BOOL;
    D : BOOL;
    CLK : BOOL;
    RST : BOOL;
    END_VAR
    VAR_OUTPUT
    Q : BOOL;
    END_VAR
    VAR
    edge : BOOL;
    END_VAR

    (*version 1.2 30. oct. 2008
    programmer hugo
    tested by oscat

    D-type flip flop with set, reset and rising clock trigger*)

    Код функции
    IF rst OR set THEN
    Q := NOT rst;
    ELSIF clk AND NOT edge THEN
    Q := D;
    END_IF;
    edge := CLK;

    Это функция D триггера.

    здесь вход SET устанавливает выход в 1
    RESET сбрасывает в 0
    вход CLK работает по переднему фронту (не знаю как это в С# реализовать, надо отлавливать изменение из 0 в 1).
    Чтобы выход менял свое состояние при каждом изменении из 0 в 1 необходимо с выхода через инверсию на вход D завести сигнал
    Управляющий сигнал подавать на вход CLK. (входа SET и RESET при этом не используются).

    #2077
    manjey73
    Участник

    Объявление переменных

    FUNCTION_BLOCK TOGGLE
    VAR_INPUT
    CLK : BOOL;
    rst : BOOL;
    END_VAR
    VAR_OUTPUT
    Q : BOOL;
    END_VAR
    VAR
    edge : BOOL;
    END_VAR

    Код функции
    IF rst THEN
    q := 0;
    ELSIF clk AND NOT edge THEN
    Q := NOT Q;
    END_IF;
    edge := clk;

    А это просто переключалка, должно быть проще реализовать на С#

    У меня пока времени нет этим заниматься, а так из ПЛК-шных функций готовых библиотек можно много интересного подготовить.

    #2079
    djbond07
    Участник

    manjey73, спасибо, буду разбираться!

    #2086
    djbond07
    Участник

    Добрый день! Про тип сигнала «кол-во переключений» наверное уже не актуально, хотя было бы интересно получить ответ (ответы #2072 и #2073).

    Создаю счётчик по триггеру на событие. Мысль такая:
    1. Триггер срабатывает на переход из 0 в 1 входного канала.
    2. По данному триггеру активируется команда управления с формулой

    public double Counter()
    {
    int n=Count1;
    Count1=++Count1;
    return n;
    }
    Соответственно в переменной Count1 хранится значение счётчика.

    3. Добавил дорасчётный ТИ с формулой

    public int CountFin()
    {
    int q=Count1;
    return q;
    }

    Идея-то проста. Командой увеличиваю значение переменной на 1, и вывожу его в дорасчётный ТИ через формулу. Но что-то не работает.

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

    Завёл новый входной канал №115 тип Кол-во переключений. Прописал в поле сигнал тоже «1». Но значение в веб интерфейсе не изменяется.

    Пропишите формуле для канала 115: Val(291) и включите формулу галочкой. Сигнал должен быть пустой. Давайте докопаемся до истины )

    #2089
    djbond07
    Участник

    Сделал, как Вы сказали, результата нет. При переключении значение не меняется.

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

    В общем, я проверил, нужно, чтобы канал 291 переходил через 0, т.е. его значения должны переключаться от -1 до 1.
    Следовательно для канала 291 нужна формула: Cnl > 0 ? 1 : -1
    Для канала 115 формула: Val(291) — как я писал ранее.

    #2094
    djbond07
    Участник

    Добрый день! Спасибо, всё работает! Опять же нюанс небольшой. отправке значения «0» в канал 115, отображается значение «1». Но если отправлять «0» при активированном входе 291, то отображается «0». Но это на работу не влияет.
    Скажите, а если в канале 115, который считает кол-во переключений, достигается максимально возможное значение (кстати, какое оно?) то что происходит? Значение сбрасывается в 0?

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

    Добрый день!
    Макс. значение 1.7976931348623157E+308
    Когда достигнет, наверное, формула перестанет работать, но мы этого уже не застанем 🙂

Просмотр 15 сообщений - с 31 по 45 (из 69 всего)
  • Вы должны авторизироваться для ответа в этой теме.