Стартовая страница › Форумы › Понять, как работает ПО › Использование формул › Написание программы с простой логикой
- В этой теме 54 ответа, 3 участника, последнее обновление 8 лет назад сделано Mikhail.
-
АвторСообщения
-
27.01.2016 в 11:27 #1464MikhailМодератор
Можно, чтобы не копировать одно и то же, завести в таблице формул такую формулу:
public double IncCnl(int dependOnCnl) { return DayBeg() ? 0 : Val(dependOnCnl) > 1 ? Cnl + 1: Cnl; }
А затем вызывать её в формуле входного канала: IncCnl(291)
27.01.2016 в 14:27 #1465EvgenУчастникспасибо, это полезно будет!
28.01.2016 в 09:44 #1466EvgenУчастникЗдравствуйте!
прошу уточнить для сброса по команде.(я правильно понял или нет)
я создал для каждого эл. привода учет времени работы за сутки и месяц (для каждого создал отдельные каналы в администраторе). (Огромная благодарность Вам за все подсказки).
Теперь необходимо сделать отдельно сброс по команде.
Как я думаю.
Необходимо создать каналы подсчета времени 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
Я все верно понял?28.01.2016 в 09:55 #1467MikhailМодераторДобрый день!
Сложность в том, что Вы не сможете напрямую записать значение в канал N1 = 0.
Поэтому в таблице формул нужно завести список или массив флагов:public bool[] Flags = new bool[65535];
Список экономит память, но с массивом работать проще. В формуле канала управления Вы будете устанавливать флаг по команде, например, Flags[1]=true, а формуле входного канала его сбрасывать Flags[1]=false
28.01.2016 в 10:42 #1470EvgenУчастникТ. Е. необходимо так
в формулах добавить 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:}
28.01.2016 в 18:43 #1471MikhailМодераторНе забудьте сбросить флаг в значение false.
29.01.2016 в 07:35 #1472EvgenУчастникя добавил в формулы
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;
}
}
тут выдает ошибку.
и еще кучу вариантов перепробовал! подскажите пожалуйста!29.01.2016 в 12:06 #1473MikhailМодераторС точки зрения синтаксиса попробуйте
public double CnlKN(int dependOnCnl) { if (Flags[dependOnCnl]) { Flags[dependOnCnl] = false; return 0; } else { return Val(dependOnCnl) > 1 ? Cnl + 1 : Cnl; } }
А правильность логики нужно тестировать.
02.02.2016 в 16:43 #1479EvgenУчастникЗдравствуйте!
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 могу Вам выслать)03.02.2016 в 10:53 #1480MikhailМодераторДобрый день!
Подобные разработки выполняются на заказ. Они выходят выходят за рамки технической поддержки и даже расширенной поддержки.03.02.2016 в 11:14 #1481EvgenУчастникэто не разработка. просто как данную программу написанную на csharp записать в rapid scada.
03.02.2016 в 14:23 #1482EvgenУчастникЗдравствуйте!
Я хочу данные с канала заносить в массив данных.
если я сделаю следующее это будет правильно?
в редакторе формул создать следующие
исходный код
public int[] N = new int[10000]; // создаем массив
int i = 0;
for([ i+=1 ] [i = 8])
{
N(i) = Val(100 + i);
}
c точки зрения синтаксиса все верно?04.02.2016 в 13:12 #1483MikhailМодераторДобрый день!
С точки зрения синтаксиса не верно. Наверное, удобнее всего тестировать синтаксис в Microsoft Visual Studio 2015 Community. Она бесплатна. Вы можете создать простейший проект типа Console Application и проверять, компилируется код ил нет.В формулах для Rapid SCADA вся логика должна быть внутри методов (функций). Например, цикл for не может быть сам по себе. Используйте те примеры, которые уже есть в базе конфигурации.
Созданный метод (формулу) Вы прописываете во входной канал или в канал управления. Эта формула будет вызываться только тогда, когда вычисляется значение канала.
04.02.2016 в 15:23 #1484EvgenУчастникСпасибо за совет!
я создал массив и записал
public double[] VremayRabE()
{
double[] VremayRab = new double [30];
for (int i = 0; i <= 29; i++)
{
VremayRab[i] = Val(701 + i);}
return VremayRab;
}
ошибок не выдает.вопрос как присвоить к каналу связи значение элемента массива?
04.02.2016 в 15:37 #1485EvgenУчастникVal(701 + i) = VremayRab[i]; будет верно?
-
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.