Модуль автоуправления и хитрый сигнал кп

Стартовая страница Форумы Понять, как работает ПО Модуль автоуправления и хитрый сигнал кп

Просмотр 11 сообщений - с 1 по 11 (из 11 всего)
  • Автор
    Записи
  • #26006
    scmember
    Участник

    Добрый день!

    Допустим, есть кп с одним дискретным каналом, при этом канал используется для передачи событий на манер азбуки морзе, например такие:
    1) приходит 1, держится 1 секунду, сбрасывается в ноль на более чем 5 секунд — таким образом устройство сообщает о некоем событии А
    2) приходит 1, держится 5 секунд, сбрасывается в ноль на более чем 5 секунд — таким образом устройство сообщает о некоем событии В
    3) 1 и 0 перманентно меняются с периодом 1 секунда — таким образом устройство сообщает о некоем событии С

    Возможно ли каким то образом на стороне скады распознавать по заранее описанным шаблонам такого рода сигналы кп и допустим активировать разные команды в зависимости от события?

    #26007
    a80808
    Участник

    Вроде была формула Tick(), можно попробовать использовать ее

    #26012
    manjey73
    Участник

    Да уж, тут FBD не хватает, описывать ловлю сигнала на C# в этих комбинациях то еще удовольствие, но в принципе можно, если сделать одной формулой в таблице Формул с выдачей цифрового сигнала…

    Придется задействовать внутри формулы Tick() и запоминать его состояние, так как за секунду несколько раз может цикл пройти…

    Ловить надо начиная с 3-его параметра, если не он, проверять первые два.

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

    Добрый день!

    Да, можно реализовать с помощью формул. В качестве основы алгоритма подойдет state machine. Формулы должны реагировать не только на время, но и на изменение значения канала.

    Можете сами разработать или заказать.

    #26020
    scmember
    Участник

    Спасибо, наверняка справлюсь сам. Не совсем понятна одна вешь — как хранить состояние между вызовами формул..

    #26025
    manjey73
    Участник

    Можно в словаре, можно в массиве. В формулах TON, TOF я хранил в массивах, привязываясь к номерам каналов.

    Не пробовал, например создать класс с нужными переменными и сделать Dictionary<int, класс> где ключ словаря это номер канала, а класс нужные переменные для работы. Например время плюс ваши 3 типа переменных

    • Ответ изменён 3 года, 9 месяцев назад пользователем manjey73.
    #26044
    Mikhail
    Модератор

    В формулах можно даже свой класс описать. И тем более инициализировать переменные.
    Если формулы сложные, то их удобнее сначала написать и отладить в VS, а затем скопировать.

    #26057
    scmember
    Участник

    ммм… я думал, что весь контекст формулы живет от ее запуска до ее завершения.. правильно я понял, что можно допустим, объявить в формуле переменную, и она будет жить и после окончания ее работы, будет доступна в последующие вызовы этой формулы (а может и не только этой формулы, а вообще любой?)

    #26058
    manjey73
    Участник

    Пока не перезапустите сервер да, можно хранить промежуточные данные и привязывать их к каналам. Примеры уже приводил, мои старые формулы таймеров с хранением в массивах.
    Сейчас наверное делал бы на словарях.

    #26059
    manjey73
    Участник

    При необходимости можно сохранять данные и в файл при перезапусках сервера и вычитывать после старта.

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

    я думал, что весь контекст формулы живет от ее запуска до ее завершения

    Область видимости и время жизни зависит от того, где объявлена переменная. Если внутри функции, то время жизни только во время выполнения функции. Если выше, то время выполнения программы.

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