Стартовая страница › Форумы › Понять, как работает ПО › Использование формул › Простейшие программы на Rapid Scada
Помечено: Логика, программирование
- В этой теме 68 ответов, 4 участника, последнее обновление 7 лет, 10 месяцев назад сделано djbond07.
-
АвторСообщения
-
11.05.2016 в 15:06 #2068MikhailМодератор
Достаточно
int x = 0;И затем
function int GetNextX() { const MaxX = 10; int nextX = ++x; if (nextX > MaxX) nextX = 0; return nextX; }
Если Вы этот счётчик выведете в качестве значения входного канала, то на него можно сделать триггеры в Модуле автоматического управления.
11.05.2016 в 16:08 #2069djbond07УчастникЧто-то я замудрил. Можно для подсчёта количества включений использовать тип канала «Кол-во переключений». Но я не совсем понял, какую формулу в нём задать? То есть у меня ко входному каналу 1 привязан поплавок, который устанавливается или в 0 или в 1. как правильно использовать данный канал для подсчёта его переключений?
11.05.2016 в 17:14 #2070MikhailМодераторЭтот канал должен быть привязан к датчику, т.е. для него должно быть заполнено поле Сигнал. При переходе значения, полученного от Коммуникатора, через 0, например, -1 — 1 или 0 — 1, значение канала будет увеличиваться на 1. Формула не нужна.
Если вдруг не заработает, то пишите.
11.05.2016 в 17:15 #2071MikhailМодераторДля проверки используйте генератор значений Сервера.
12.05.2016 в 11:57 #2072djbond07УчастникЗдравствуйте! Не сработало. Опишу в терминах моих каналов, чтобы не исковеркать информацию.
Датчик типа сухой контакт привязан к 1-му входу модуля ввода-вывода. В скаде ему соответствует входной канал 291 тип телесигнал, номер сигнала: 1. В коммуникаторе и веб интерфейсе скады могу отслеживать переключение его с 0 на 1. Завёл новый входной канал №115 тип Кол-во переключений. Прописал в поле сигнал тоже «1». Но значение в веб интерфейсе не изменяется.
Ещё одна странная особенность. Если через генератор значений Сервера отправлять данные на этот канал, то все значения начиная с 1-цы увеличиваются на 1. то есть я посылаю 1, показывает 2; посылаю 4, показывает 5. Если посылать 0 и отрицательные числа, то отображает их корректно. Может Вам будет полезна эта информация. Не знаю баг это, или так задумано.
12.05.2016 в 12:02 #2073djbond07УчастникДополнение. Если изменить тип канала 291 с телеизмерения на Кол-во переключений, и убрать все размерности, то при переходе датчика из 0 в 1 и обратно просто меняются цифры 0-2-0-2, и т.д.
12.05.2016 в 13:44 #2076manjey73УчастникОбъявление переменных
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 oscatD-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 при этом не используются).12.05.2016 в 13:47 #2077manjey73УчастникОбъявление переменных
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;А это просто переключалка, должно быть проще реализовать на С#
У меня пока времени нет этим заниматься, а так из ПЛК-шных функций готовых библиотек можно много интересного подготовить.
12.05.2016 в 14:52 #2079djbond07Участникmanjey73, спасибо, буду разбираться!
13.05.2016 в 14:07 #2086djbond07УчастникДобрый день! Про тип сигнала «кол-во переключений» наверное уже не актуально, хотя было бы интересно получить ответ (ответы #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, и вывожу его в дорасчётный ТИ через формулу. Но что-то не работает.
13.05.2016 в 16:47 #2087MikhailМодераторЗавёл новый входной канал №115 тип Кол-во переключений. Прописал в поле сигнал тоже «1». Но значение в веб интерфейсе не изменяется.
Пропишите формуле для канала 115: Val(291) и включите формулу галочкой. Сигнал должен быть пустой. Давайте докопаемся до истины )
13.05.2016 в 17:06 #2089djbond07УчастникСделал, как Вы сказали, результата нет. При переключении значение не меняется.
14.05.2016 в 10:51 #2090MikhailМодераторВ общем, я проверил, нужно, чтобы канал 291 переходил через 0, т.е. его значения должны переключаться от -1 до 1.
Следовательно для канала 291 нужна формула: Cnl > 0 ? 1 : -1
Для канала 115 формула: Val(291) — как я писал ранее.17.05.2016 в 12:35 #2094djbond07УчастникДобрый день! Спасибо, всё работает! Опять же нюанс небольшой. отправке значения «0» в канал 115, отображается значение «1». Но если отправлять «0» при активированном входе 291, то отображается «0». Но это на работу не влияет.
Скажите, а если в канале 115, который считает кол-во переключений, достигается максимально возможное значение (кстати, какое оно?) то что происходит? Значение сбрасывается в 0?17.05.2016 в 13:17 #2095MikhailМодераторДобрый день!
Макс. значение 1.7976931348623157E+308
Когда достигнет, наверное, формула перестанет работать, но мы этого уже не застанем 🙂 -
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.