Написание программы с простой логикой

Стартовая страница Форумы Понять, как работает ПО Использование формул Написание программы с простой логикой

  • В этой теме 54 ответа, 3 участника, последнее обновление 8 лет назад сделано Mikhail.
Просмотр 15 сообщений - с 16 по 30 (из 55 всего)
  • Автор
    Сообщения
  • #1464
    Mikhail
    Модератор

    Можно, чтобы не копировать одно и то же, завести в таблице формул такую формулу:

    public double IncCnl(int dependOnCnl)
    {
        return DayBeg() ? 0 : Val(dependOnCnl) > 1 ? Cnl + 1: Cnl;
    }
    

    А затем вызывать её в формуле входного канала: IncCnl(291)

    #1465
    Evgen
    Участник

    спасибо, это полезно будет!

    #1466
    Evgen
    Участник

    Здравствуйте!
    прошу уточнить для сброса по команде.(я правильно понял или нет)
    я создал для каждого эл. привода учет времени работы за сутки и месяц (для каждого создал отдельные каналы в администраторе). (Огромная благодарность Вам за все подсказки).
    Теперь необходимо сделать отдельно сброс по команде.
    Как я думаю.
    Необходимо создать каналы подсчета времени Val(291)>1?Cnl+1:Cnl , но добавить условие если канал управления изменился с FALSE на TRUE то обнулить канал
    Необходимо добавить каналы управления для каждого электропривода.

    public double CnlKN(int dependOnCnl)
    {
    IF N1 == 0 ? 0 : Val(dependOnCnl) > 1 ? Cnl + 1: Cnl:
    N1=0;
    }

    где N1 это канал управления, так же необходимо учесть следующее, мы N1 присвоили значение TRUE(1) необходимо его сбросить обратно на FALSE(0).
    для этого добавить (как я думаю) N1=0
    Я все верно понял?

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

    Добрый день!
    Сложность в том, что Вы не сможете напрямую записать значение в канал N1 = 0.
    Поэтому в таблице формул нужно завести список или массив флагов:

    public bool[] Flags = new bool[65535];
    

    Список экономит память, но с массивом работать проще. В формуле канала управления Вы будете устанавливать флаг по команде, например, Flags[1]=true, а формуле входного канала его сбрасывать Flags[1]=false

    #1470
    Evgen
    Участник

    Т. Е. необходимо так
    в формулах добавить 2 строки

    public bool[] Flags[1] = new bool[1];
    ……………………………………..
    public bool[] Flags[65535] = new bool[65535];

    и

    public double CnlKN(int dependOnCnl)
    {
    IF Flags[dependOnCnl] = 0 ? 0 : Val(dependOnCnl) > 1 ? Cnl + 1: Cnl:

    }

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

    Не забудьте сбросить флаг в значение false.

    #1472
    Evgen
    Участник

    я добавил в формулы
    public bool[] Flags = new bool[65535]; тут не выдало ошибки
    и
    public double CnlKN(int dependOnCnl)
    {
    Val(dependOnCnl) > 1 ? Cnl + 1: Cnl;
    if (Flags[dependOnCnl] == true)
    {
    Val(dependOnCnl) = 0;
    Flags[dependOnCnl] = false;
    }
    }
    пытался так
    public double CnlKN(int dependOnCnl)
    {
    Val(dependOnCnl) > 1 ? Cnl + 1: Cnl;
    if (Flags[dependOnCnl] == true)
    {
    Val(dependOnCnl) = 0;
    return Flags[dependOnCnl] false;
    }
    }
    тут выдает ошибку.
    и еще кучу вариантов перепробовал! подскажите пожалуйста!

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

    С точки зрения синтаксиса попробуйте

    public double CnlKN(int dependOnCnl)
    {
      if (Flags[dependOnCnl])
      {
        Flags[dependOnCnl] = false;
        return 0;
      }
      else
      {
        return Val(dependOnCnl) > 1 ? Cnl + 1 : Cnl;
      }
    }
    

    А правильность логики нужно тестировать.

    #1479
    Evgen
    Участник

    Здравствуйте!

    class Program
    {
    static void Main(string[] args)

    {

    // Типы ППР
    string Trs = «»; string Tpr = «»; string Tkr = «»;
    int TrsInt = 0; int TprInt = 0; int TkrInt = 0;

    // Какой ППР необходимо провести
    int[] N = new int[2500];
    // массив для сброса данных по времени работы
    bool[] Flags = new bool[2500];

    // массив учета времени работы эл-проводов
    int[] VremayRab = new int[2500];
    string[] VremayStr = new string[2500];
    string[] Nstr = new string[2500];
    Console.Write(«Введите через какое время работы необходимо проводить плановый ремонт: «);
    Trs = Console.ReadLine();
    Console.WriteLine(«»);

    Console.Write(«Введите через какое время работы необходимо провести текущий ремонт: «);
    Tpr = Console.ReadLine();
    Console.WriteLine(«»);

    Console.Write(«Введите через какое время работы необходимо проводить капитальный ремонт: «);
    Tkr = Console.ReadLine();
    Console.WriteLine(«»);

    // переводим текстовые значения что ввели в целые числа
    int.TryParse(Trs, out TrsInt);
    int.TryParse(Tpr, out TprInt);
    int.TryParse(Tkr, out TkrInt);

    // подстет времени работы для эл привода

    Console.Write(«Введите сколько часов отработал 1 эл-привод: «);
    VremayStr[0] = Console.ReadLine();
    int.TryParse(VremayStr[0], out VremayRab[0]);

    Console.Write(«Введите номер ППР от (0 до 4) «);
    Nstr[0] = Console.ReadLine();
    int.TryParse(Nstr[0], out N[0]);
    Console.WriteLine(«»);
    // какой ППР необходим
    if (VremayRab[0] >= TrsInt && N[0] == 0)
    {
    Console.WriteLine(«необходимо провести плановый ремонт эл-привода «, VremayRab[0]);
    }

    if (VremayRab[0] >= TprInt && N[0] == 0 && Flags[0] == true)
    {
    N[0] += 1;
    Flags[0] = false;
    VremayRab[0] = 0;
    }

    if (VremayRab[0] >= TprInt && N[0] == 1)
    {
    Console.WriteLine(«необходимо провести текущий ремонт эл-привода «, VremayRab[0]);
    }

    if (VremayRab[0] >= TprInt && N[0] == 1 && Flags[0] == true)
    {
    N[0] += 1;
    Flags[0] = false;
    VremayRab[0] = 0;
    }

    if (VremayRab[0] >= TrsInt && N[0] == 2)
    {
    Console.WriteLine(«необходимо провести плановый ремонт эл-привода «, VremayRab[0]);
    }

    if (VremayRab[0] >= TprInt && N[0] == 2 && Flags[0] == true)
    {
    N[0] += 1;
    Flags[0] = false;
    VremayRab[0] = 0;
    }

    if (VremayRab[0] >= TprInt && N[0] == 3)
    {
    Console.WriteLine(«необходимо провести текущий ремонт эл-привода «, VremayRab[0]);
    }

    if (VremayRab[0] >= TprInt && N[0] == 3 && Flags[0] == true)
    {
    N[0] += 1;
    Flags[0] = false;
    VremayRab[0] = 0;
    }

    if (VremayRab[0] >= TprInt && N[0] == 4)
    {
    Console.WriteLine(«необходимо провести капитальный ремонт эл-привода «, VremayRab[0]);
    }

    if (VremayRab[0] >= TkrInt && N[0] == 4 && Flags[0] == true)
    {
    N[0] = 0;
    Flags[0] = false;
    VremayRab[0] = 0;
    Console.WriteLine(«Все ремонты в этом году выполнены для «, VremayRab[0]);
    }
    Console.ReadKey();

    }

    }
    }
    Вот код написан на c sharp
    Как его правильно записать в rapid scada
    при условии что в
    bool[] Flags = new bool[2500];
    данные задаются пользователем!
    int[] VremayRab = new int[2500];
    в этот массив данные должны вносится из этой формулы Val(0)>1?Cnl+1:Cnl
    где 0 это ячейка массива соответствующая реальному эл-приводу.

    За ранее благодарю.
    И буду признателен если ответ будет с максимум пояснений!!!
    (из Ваших ответов создаю описание, когда соберу страниц 20 могу Вам выслать)

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

    Добрый день!
    Подобные разработки выполняются на заказ. Они выходят выходят за рамки технической поддержки и даже расширенной поддержки.

    #1481
    Evgen
    Участник

    это не разработка. просто как данную программу написанную на csharp записать в rapid scada.

    #1482
    Evgen
    Участник

    Здравствуйте!
    Я хочу данные с канала заносить в массив данных.
    если я сделаю следующее это будет правильно?
    в редакторе формул создать следующие
    исходный код
    public int[] N = new int[10000]; // создаем массив
    int i = 0;
    for([ i+=1 ] [i = 8])
    {
    N(i) = Val(100 + i);
    }
    c точки зрения синтаксиса все верно?

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

    Добрый день!
    С точки зрения синтаксиса не верно. Наверное, удобнее всего тестировать синтаксис в Microsoft Visual Studio 2015 Community. Она бесплатна. Вы можете создать простейший проект типа Console Application и проверять, компилируется код ил нет.

    В формулах для Rapid SCADA вся логика должна быть внутри методов (функций). Например, цикл for не может быть сам по себе. Используйте те примеры, которые уже есть в базе конфигурации.

    Созданный метод (формулу) Вы прописываете во входной канал или в канал управления. Эта формула будет вызываться только тогда, когда вычисляется значение канала.

    #1484
    Evgen
    Участник

    Спасибо за совет!
    я создал массив и записал
    public double[] VremayRabE()
    {
    double[] VremayRab = new double [30];
    for (int i = 0; i <= 29; i++)
    {
    VremayRab[i] = Val(701 + i);

    }
    return VremayRab;
    }
    ошибок не выдает.

    вопрос как присвоить к каналу связи значение элемента массива?

    #1485
    Evgen
    Участник

    Val(701 + i) = VremayRab[i]; будет верно?

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