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

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

    Всё, что касается C#, рекомендую искать на MSDN и на http://stackoverflow.com
    Ответ на Ваш вопрос

    #2023
    djbond07
    Участник

    Добрый день! про C# понятно. Напишите, пожалуйста ответ на вопрос про модуль автоматического управления. По ссылке «ответ на Ваш вопрос» переходит на
    https://msdn.microsoft.com/ru-ru/library/system.datetime.minvalue(v=vs.110).aspx

    #2024
    djbond07
    Участник

    Ещё такой момент. В ответе #1422 Вы объясняли как можно реализовать таймер с помощью Минутного ТИ
    «Итак, нужно завести входной канал типа Минутный ТИ. Он будет хранить время наработки в минутах. Указать для канала формулу:
    Val(100)>0?Cnl+1:Cnl
    Где 100 — номер канала для измерения тока. Формулу не проверял, если не заработает, напишите здесь.»

    Сейчас пытаюсь реализовать это, но формула не работает. В таблице висит значение «0» и всё. Формула идентична Val(293)>0?Cnl+1:Cnl. На канале 293 у меня датчик насоса.

    Хочу реализовать такую схему в итоге: Когда насос включён, считаем время (минутная погрешность — это нормально). Когда значение счётчика равно 5 допустим, выполнить команду такую-то (ну это отдельно с помощью формулы сделаю). Когда насос отключается, сбросить данный счётчик.

    Это всё относится к вопросу реализации задержки. Пытаюсь пока реализовать путём сравнивания даты и времени включения насоса, но как-то не идёт, рассматриваю альтернативы.

    В общем, как сделать так, чтобы формула работала? И если можно пару комментариев как реализовать сброс, буду благодарен.

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

    Сразу не увидел.

    Поясните, пожалуйста, 4-й пункт файла лицензии «При изменении аппаратной конфигурации или сетевой идентификации сервера, лицензия прекращает своё действие.». Что тут подразумевается под аппаратной конфигурацией и сетевой идентификацией?

    Ключ привязывается к сетевым параметрам ПК. Т.е. если Вы измените имя компьютера, например, или замените сетевую плату, то лицензия перестанет действовать. Я никак не смогу проверить, может быть Вы просто скопировали модуль на другой компьютер.

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

    Про формулы:
    Попробуйте так: 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

    #2028
    djbond07
    Участник

    Добрый день! Про модуль понятно. Просто дело в том, что конечный вариант скады должен работать на линуксе, соответственно параметры идентификации будут другие. Я планирую отладить работу скады с демо-версией модуля автоматического управления, а для линукса уже приобрести лицензию =)

    По поводу задержки. Может получится без канала управления организовать сброс. Что-то вроде:

    int GetFlag()
    {
    int f = Flag1;
    if (Val(293)==1|Val(294)==1)
    {Flag1 = 1;}
    else
    {Flag1 = 0;}
    return f;
    }

    То есть в зависимости от условия просто устанавливать флаг в нужное значение. Но почему-то скада сервер ругается:
    Строка 482, колонка 85: error CS0173: Не удается определить тип условного выражения, так как не существует неявного преобразования между «double» и «группа методов».
    Как можно преобразовать эту конструкцию?

    #2029
    Evgen
    Участник

    Я, если Вы не против, дам Вам следующий совет(я его вычитал на одном форуме)
    любая программа пишется по заданной последовательности
    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» то не экономнее было бы использовать Булево?

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

    Я планирую отладить работу скады с демо-версией модуля автоматического управления, а для линукса уже приобрести лицензию

    Вы можете получить временный ключ на http://trial.rapidscada.net/

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

    Евгений, я в своём примере использовал Flag типа int, потому что на него удобно умножить и обнулить выражение при необходимости. А в общем случае, Вы правы.

    Очень рекомендую установить Visual Studio 2015 Community и, создав простейшее консольное приложение, отлаживать функции.

    Кстати, в базе по умолчанию в таблице формул все методы и поля объявлены как public — на самом деле public можно не писать.

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

    То есть в зависимости от условия просто устанавливать флаг в нужное значение.

    Да, если ручная команда не требуется.

    #2033
    djbond07
    Участник

    Вы можете получить временный ключ на http://trial.rapidscada.net/
    Уже сделал, но он только на день, как я понял. Но это в принципе не проблема.

    Я естественно скачал Visual Studio 2015 Community, и пытаюсь отлаживать на нём) Я даже залез в файл C:\SCADA\ScadaServer\Log\CalcEngine.cs, и посмотрел как там всё устроено, чтобы понять, в какой области объявляются все переменные и методы. Я в принципе логикой построения программ неплохо владею, тем более в вопросах таких простых программ, но из-за того, что я никогда не работал на C#, путаюсь, где, что, как объявить правильно. В теле программы, или в теле метода? В общем такие вопросы, из-за неопытности. Поэтому, извините за порой туповатые вопросы.

    С этим вопросом поступлю как советует Евгений, попробую досканально всё по полочкам разложить. Спасибо большое, что помогаете!

    #2063
    djbond07
    Участник

    Добрый день! Подскажите, существует ли в рапиде возможность попеременного активирования каналов управления по срабатыванию входного канала? То есть первое срабатывание — активируется 1-й КУ, 2-е срабатывание, 2-й КУ, 3-е срабатывание — снова 1-й КУ, и т.д.

    #2064
    manjey73
    Участник

    Можно попробовать сделать функцией реализацию триггера, как это реализовано в ПЛК.
    Есть функции Toggle и D-Trigger например на языке ST в среде CoDeSys.
    Там паскалеподобный язык.
    Если нужны коды этих функций могу выложить, возможно получится их адаптировать.
    Ну или поискать примеры на С# подобных функций.

    #2065
    djbond07
    Участник

    И подскажите, пожалуйста, как задать переменную так, чтобы её можно было использовать в нескольких функциях? Просто Public int x=0; ? А потом её изменять из разных функций. Я хочу таким образом задать счётчик. Или может есть и другой путь?

    #2067
    djbond07
    Участник

    manjey73, Выложите, пожалуйста, если не сложно. Я пока поищу триггеры на C#.

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