Стартовая страница › Форумы › Понять, как работает ПО › Использование формул › Простейшие программы на Rapid Scada
Помечено: Логика, программирование
- В этой теме 68 ответов, 4 участника, последнее обновление 7 лет, 10 месяцев назад сделано djbond07.
-
АвторСообщения
-
21.04.2016 в 21:06 #2022MikhailМодератор
Всё, что касается C#, рекомендую искать на MSDN и на http://stackoverflow.com
Ответ на Ваш вопрос22.04.2016 в 10:56 #2023djbond07УчастникДобрый день! про C# понятно. Напишите, пожалуйста ответ на вопрос про модуль автоматического управления. По ссылке «ответ на Ваш вопрос» переходит на
https://msdn.microsoft.com/ru-ru/library/system.datetime.minvalue(v=vs.110).aspx22.04.2016 в 16:29 #2024djbond07УчастникЕщё такой момент. В ответе #1422 Вы объясняли как можно реализовать таймер с помощью Минутного ТИ
«Итак, нужно завести входной канал типа Минутный ТИ. Он будет хранить время наработки в минутах. Указать для канала формулу:
Val(100)>0?Cnl+1:Cnl
Где 100 — номер канала для измерения тока. Формулу не проверял, если не заработает, напишите здесь.»Сейчас пытаюсь реализовать это, но формула не работает. В таблице висит значение «0» и всё. Формула идентична Val(293)>0?Cnl+1:Cnl. На канале 293 у меня датчик насоса.
Хочу реализовать такую схему в итоге: Когда насос включён, считаем время (минутная погрешность — это нормально). Когда значение счётчика равно 5 допустим, выполнить команду такую-то (ну это отдельно с помощью формулы сделаю). Когда насос отключается, сбросить данный счётчик.
Это всё относится к вопросу реализации задержки. Пытаюсь пока реализовать путём сравнивания даты и времени включения насоса, но как-то не идёт, рассматриваю альтернативы.
В общем, как сделать так, чтобы формула работала? И если можно пару комментариев как реализовать сброс, буду благодарен.
22.04.2016 в 18:26 #2025MikhailМодераторСразу не увидел.
Поясните, пожалуйста, 4-й пункт файла лицензии «При изменении аппаратной конфигурации или сетевой идентификации сервера, лицензия прекращает своё действие.». Что тут подразумевается под аппаратной конфигурацией и сетевой идентификацией?
Ключ привязывается к сетевым параметрам ПК. Т.е. если Вы измените имя компьютера, например, или замените сетевую плату, то лицензия перестанет действовать. Я никак не смогу проверить, может быть Вы просто скопировали модуль на другой компьютер.
22.04.2016 в 18:33 #2026MikhailМодераторПро формулы:
Попробуйте так: Val(100)>0?Val()+1:Val()
Cnl — это значение, полученное Сервером от устройства.Идея сброса:
Нужна переменная и функция
int Flag = 1;
int GetFlag()
{
int f = Flag;
Flag = 1;
return f;
}Формулу для минутного канала умножаете: (формула) * GetFlag()
Нужно сделать канал управления для сброса с формулой в которой Вы будете устанавливать Flag = 0 и возвращать return double.NaN
25.04.2016 в 14:33 #2028djbond07УчастникДобрый день! Про модуль понятно. Просто дело в том, что конечный вариант скады должен работать на линуксе, соответственно параметры идентификации будут другие. Я планирую отладить работу скады с демо-версией модуля автоматического управления, а для линукса уже приобрести лицензию =)
По поводу задержки. Может получится без канала управления организовать сброс. Что-то вроде:
int GetFlag()
{
int f = Flag1;
if (Val(293)==1|Val(294)==1)
{Flag1 = 1;}
else
{Flag1 = 0;}
return f;
}То есть в зависимости от условия просто устанавливать флаг в нужное значение. Но почему-то скада сервер ругается:
Строка 482, колонка 85: error CS0173: Не удается определить тип условного выражения, так как не существует неявного преобразования между «double» и «группа методов».
Как можно преобразовать эту конструкцию?25.04.2016 в 14:47 #2029EvgenУчастникЯ, если Вы не против, дам Вам следующий совет(я его вычитал на одном форуме)
любая программа пишется по заданной последовательности
1 поставить корректно задачу
2 разобраться что есть и что хотим получить
3 создать алгоритм решения задачи
4 создать алгоритм написания программы
5 если есть необходимость наглядная блок схема
6 написание тела программы
Мне этот план действий подходит и помогает!int GetFlag()
{
int f = Flag1;
if (Val(293)==1|Val(294)==1)
{Flag1 = 1;}
else
{Flag1 = 0;}
return f;
}эта форма записи не верна!
то что мне бросилось сразу в глаза
Вы не объявили функцию.
| что Вы тут имели в виду? Я так понимаю «или» тогда если я не ошибаюсь «||» записывается так.
и если используете только «0» и «1» то не экономнее было бы использовать Булево?25.04.2016 в 15:26 #2030MikhailМодераторЯ планирую отладить работу скады с демо-версией модуля автоматического управления, а для линукса уже приобрести лицензию
Вы можете получить временный ключ на http://trial.rapidscada.net/
25.04.2016 в 15:32 #2031MikhailМодераторЕвгений, я в своём примере использовал Flag типа int, потому что на него удобно умножить и обнулить выражение при необходимости. А в общем случае, Вы правы.
Очень рекомендую установить Visual Studio 2015 Community и, создав простейшее консольное приложение, отлаживать функции.
Кстати, в базе по умолчанию в таблице формул все методы и поля объявлены как public — на самом деле public можно не писать.
25.04.2016 в 15:33 #2032MikhailМодераторТо есть в зависимости от условия просто устанавливать флаг в нужное значение.
Да, если ручная команда не требуется.
25.04.2016 в 15:54 #2033djbond07УчастникВы можете получить временный ключ на http://trial.rapidscada.net/
Уже сделал, но он только на день, как я понял. Но это в принципе не проблема.Я естественно скачал Visual Studio 2015 Community, и пытаюсь отлаживать на нём) Я даже залез в файл C:\SCADA\ScadaServer\Log\CalcEngine.cs, и посмотрел как там всё устроено, чтобы понять, в какой области объявляются все переменные и методы. Я в принципе логикой построения программ неплохо владею, тем более в вопросах таких простых программ, но из-за того, что я никогда не работал на C#, путаюсь, где, что, как объявить правильно. В теле программы, или в теле метода? В общем такие вопросы, из-за неопытности. Поэтому, извините за порой туповатые вопросы.
С этим вопросом поступлю как советует Евгений, попробую досканально всё по полочкам разложить. Спасибо большое, что помогаете!
11.05.2016 в 12:57 #2063djbond07УчастникДобрый день! Подскажите, существует ли в рапиде возможность попеременного активирования каналов управления по срабатыванию входного канала? То есть первое срабатывание — активируется 1-й КУ, 2-е срабатывание, 2-й КУ, 3-е срабатывание — снова 1-й КУ, и т.д.
11.05.2016 в 13:49 #2064manjey73УчастникМожно попробовать сделать функцией реализацию триггера, как это реализовано в ПЛК.
Есть функции Toggle и D-Trigger например на языке ST в среде CoDeSys.
Там паскалеподобный язык.
Если нужны коды этих функций могу выложить, возможно получится их адаптировать.
Ну или поискать примеры на С# подобных функций.11.05.2016 в 13:51 #2065djbond07УчастникИ подскажите, пожалуйста, как задать переменную так, чтобы её можно было использовать в нескольких функциях? Просто Public int x=0; ? А потом её изменять из разных функций. Я хочу таким образом задать счётчик. Или может есть и другой путь?
11.05.2016 в 14:47 #2067djbond07Участникmanjey73, Выложите, пожалуйста, если не сложно. Я пока поищу триггеры на C#.
-
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.