Стартовая страница › Форумы › Понять, как работает ПО › Модуль автоуправления и хитрый сигнал кп
- В этой теме 10 ответов, 4 участника, последнее обновление 3 года, 9 месяцев назад сделано
Mikhail.
-
АвторЗаписи
-
14.11.2022 в 21:34 #26006
scmember
УчастникДобрый день!
Допустим, есть кп с одним дискретным каналом, при этом канал используется для передачи событий на манер азбуки морзе, например такие:
1) приходит 1, держится 1 секунду, сбрасывается в ноль на более чем 5 секунд — таким образом устройство сообщает о некоем событии А
2) приходит 1, держится 5 секунд, сбрасывается в ноль на более чем 5 секунд — таким образом устройство сообщает о некоем событии В
3) 1 и 0 перманентно меняются с периодом 1 секунда — таким образом устройство сообщает о некоем событии СВозможно ли каким то образом на стороне скады распознавать по заранее описанным шаблонам такого рода сигналы кп и допустим активировать разные команды в зависимости от события?
14.11.2022 в 22:09 #26007
a80808УчастникВроде была формула Tick(), можно попробовать использовать ее
15.11.2022 в 11:26 #26012
manjey73УчастникДа уж, тут FBD не хватает, описывать ловлю сигнала на C# в этих комбинациях то еще удовольствие, но в принципе можно, если сделать одной формулой в таблице Формул с выдачей цифрового сигнала…
Придется задействовать внутри формулы Tick() и запоминать его состояние, так как за секунду несколько раз может цикл пройти…
Ловить надо начиная с 3-его параметра, если не он, проверять первые два.
15.11.2022 в 17:30 #26014
MikhailМодераторДобрый день!
Да, можно реализовать с помощью формул. В качестве основы алгоритма подойдет state machine. Формулы должны реагировать не только на время, но и на изменение значения канала.
Можете сами разработать или заказать.
15.11.2022 в 19:12 #26020scmember
УчастникСпасибо, наверняка справлюсь сам. Не совсем понятна одна вешь — как хранить состояние между вызовами формул..
15.11.2022 в 21:51 #26025
manjey73УчастникМожно в словаре, можно в массиве. В формулах TON, TOF я хранил в массивах, привязываясь к номерам каналов.
Не пробовал, например создать класс с нужными переменными и сделать Dictionary<int, класс> где ключ словаря это номер канала, а класс нужные переменные для работы. Например время плюс ваши 3 типа переменных
-
Ответ изменён 3 года, 9 месяцев назад пользователем
manjey73.
16.11.2022 в 15:38 #26044
MikhailМодераторВ формулах можно даже свой класс описать. И тем более инициализировать переменные.
Если формулы сложные, то их удобнее сначала написать и отладить в VS, а затем скопировать.16.11.2022 в 20:11 #26057scmember
Участникммм… я думал, что весь контекст формулы живет от ее запуска до ее завершения.. правильно я понял, что можно допустим, объявить в формуле переменную, и она будет жить и после окончания ее работы, будет доступна в последующие вызовы этой формулы (а может и не только этой формулы, а вообще любой?)
16.11.2022 в 22:39 #26058
manjey73УчастникПока не перезапустите сервер да, можно хранить промежуточные данные и привязывать их к каналам. Примеры уже приводил, мои старые формулы таймеров с хранением в массивах.
Сейчас наверное делал бы на словарях.16.11.2022 в 22:40 #26059
manjey73УчастникПри необходимости можно сохранять данные и в файл при перезапусках сервера и вычитывать после старта.
17.11.2022 в 17:29 #26069
MikhailМодераторя думал, что весь контекст формулы живет от ее запуска до ее завершения
Область видимости и время жизни зависит от того, где объявлена переменная. Если внутри функции, то время жизни только во время выполнения функции. Если выше, то время выполнения программы.
-
Ответ изменён 3 года, 9 месяцев назад пользователем
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.