PDA

Просмотр полной версии : Макрос индексации входных переменных



maratin
29.10.2022, 01:07
подскажите как реализовать следующий алгоритм на Owenlogic (для ПР200):
(индексация входных переменных)
на вход макроса подается несколько переменных типа "целое" (udint) - моточасы насоса -
A, B, C, D, E, F и соответствующие им выходные переменные Pa, Pb, Pc, Pd, Pe, Pf - очередность запуска насоса
значение каждой входной переменной: 0 (не готов к работе) или любое положительное число (наработка)
задача - присвоить каждой выходной переменной значения: ноль или возрастающее число от 1 до количества ненулевых входов:
0, если входная переменная равна 0
1, если входная переменная минимальная из всех положительных входных значений
2, если входная переменная минимальная из оставшихся переменных (без учета минимальной переменной, которой уже присвоили номер 1)
и т.д.
т.е. если на входе все >0, то на выходе должны быть значения от 1 до 6, без повторов (нулевых входов и выходов может быть несколько)
если на входе есть одинаковые значения, то меньший индекс получит вход, который ближе к началу алфавита
пример: вход -> выход
356 -> 4
16 -> 1
0 -> 0
88 -> 3
0 -> 0
16 -> 2

Сергей0308
29.10.2022, 07:04
подскажите как реализовать следующий алгоритм на Owenlogic (для ПР200):
(индексация входных переменных)
на вход макроса подается несколько переменных типа "целое" (udint) - моточасы насоса -
A, B, C, D, E, F и соответствующие им выходные переменные Pa, Pb, Pc, Pd, Pe, Pf - очередность запуска насоса
значение каждой входной переменной: 0 (не готов к работе) или любое положительное число (наработка)
задача - присвоить каждой выходной переменной значения: ноль или возрастающее число от 1 до количества ненулевых входов:
0, если входная переменная равна 0
1, если входная переменная минимальная из всех положительных входных значений
2, если входная переменная минимальная из оставшихся переменных (без учета минимальной переменной, которой уже присвоили номер 1)
и т.д.
т.е. если на входе все >0, то на выходе должны быть значения от 1 до 6, без повторов (нулевых входов и выходов может быть несколько)
если на входе есть одинаковые значения, то меньший индекс получит вход, который ближе к началу алфавита
пример: вход -> выход
356 -> 4
16 -> 1
0 -> 0
88 -> 3
0 -> 0
16 -> 2

Начну из далека: СССР(надеюсь помните или знаете) взял на себя обязательства не применять первым ядерное оружие, на практике это означает, если все страны возьмут такое обязательство - запрещение применения ядерного оружия! Как это относится к нашей задаче, как я предварительно понимаю чисто теоретической, в смысле, нигде не видел более четырёх насосов, сейчас в большинстве случаев народ вообще больше двух не ставит, судя по сообщениям на форуме, короче, Вам достаточно будет запускать насос с наименьшей наработкой(значением) из числа готовых к работе при пуске или ротации(работающий насос не входит в список готовых к работе насосов), всё!

maratin
29.10.2022, 07:38
Задача практическая. Для codesys она решена, теперь ищу решение для owenlogic.
Управление будет каскадное. В работу поэтапно будет вводится по одному доп. насосу, в зависимости от давления или уровня. Нужно сразу отобразить приоритеты запуска всех насосов.
Реальный проект 1:
63489
Реальный проект 2:
63490

melky
29.10.2022, 09:39
В ваших хотелках вряд ли, но для самой задачи был макрос от AI! на 8 насосов, который рассчитывал время наработки, а дальше ваша логика до макроса. Битовая маска требуемых рабочих насосов, аварии, датчики и т.д.

Сергей0308
29.10.2022, 12:17
Задача практическая. Для codesys она решена, теперь ищу решение для owenlogic.
Управление будет каскадное. В работу поэтапно будет вводится по одному доп. насосу, в зависимости от давления или уровня. Нужно сразу отобразить приоритеты запуска всех насосов.
Реальный проект 1:
63489
Реальный проект 2:
63490

Хорошо, давайте обозначим условия(разберёмся), в смысле, мне кажется Вы даже ТЗ не можете сформулировать, имеется 6(на картинке 8 насосов), каскадное регулирование, поддерживаем заданное давление в определённом диапазоне, например 5-6 бар, делаем ротацию по наработке, наработка - целочисленное значение в часах, каждый час у вас должна происходить ротация одного из работающих насосов, я правильно понимаю?

Dimensy
29.10.2022, 12:49
Вот, набросал макрос по вашей задаче

63497

maratin
29.10.2022, 14:40
Задача была озвучена в первом сообщении. Экраны приведены в качестве примера, что такие проекты бывают.
Остальное не имеет отношение к ТЗ - без давления, ротации и т.д.
Есть только моточасы и приоритеты как в первом сообщении.

maratin
29.10.2022, 14:46
Вот, набросал макрос по вашей задаче

63497

Браво, Dimensy!
Это то, что нужно.
Проверил - работает нормально. Само решение еще не проанализировал.
Огромное вам спасибо за помощь!
Писал в форум без особой надежды что мне помогут.

Сергей0308
29.10.2022, 15:07
Браво, Dimensy!
Это то, что нужно.
Проверил - работает нормально. Само решение еще не проанализировал.
Огромное вам спасибо за помощь!
Писал в форум без особой надежды что мне помогут.

Так Вы можете вразумительно объяснить для чего это надо? Если не знаете, можно же так и написать, в смысле, я не знаю для чего, но так надо, так начальник хочет, короче, это делается в принципе для выравнивания наработки, допустим Вы добились своей цели, наработка выровнена, тогда, как я уже написал, ротация будет происходить каждый час! Может проще сделать ротацию каждый час работы насосов, Вы что, действительно не понимаете, что не будет разницы в работе? Кроме того там ещё много всяких нюансов, допустим у вас насос полгода был в ремонте или вы новый поставили(ничего вечного не бывает), он что должен молотить без отдыха полгода или пять лет, пока наработка со старыми насосами не сравняется?
И, в принципе, для чего выравнивать наработку? Чтобы все насосы умерли одновременно и это добавило Вам проблем?

1exan
29.10.2022, 15:52
подскажите как реализовать следующий алгоритм на Owenlogic (для ПР200):
(индексация входных переменных)
на вход макроса подается несколько переменных типа "целое" (udint) - моточасы насоса -
A, B, C, D, E, F и соответствующие им выходные переменные Pa, Pb, Pc, Pd, Pe, Pf - очередность запуска насоса
значение каждой входной переменной: 0 (не готов к работе) или любое положительное число (наработка)
задача - присвоить каждой выходной переменной значения: ноль или возрастающее число от 1 до количества ненулевых входов:
0, если входная переменная равна 0
1, если входная переменная минимальная из всех положительных входных значений
2, если входная переменная минимальная из оставшихся переменных (без учета минимальной переменной, которой уже присвоили номер 1)
и т.д.
т.е. если на входе все >0, то на выходе должны быть значения от 1 до 6, без повторов (нулевых входов и выходов может быть несколько)
если на входе есть одинаковые значения, то меньший индекс получит вход, который ближе к началу алфавита
пример: вход -> выход
356 -> 4
16 -> 1
0 -> 0
88 -> 3
0 -> 0
16 -> 2



FUNCTION out: UDINT;
VAR_INPUT
In_Time1, In_Time2, In_Time3, In_Time4, In_Time5, In_Time6 : UDINT;
enabl: BOOL;
END_VAR

VAR
Queue, Data1, Data2 : ARRAY[1..6] OF UDINT;
swOrder, swNumber, i, j, mini : UDINT;
f, sort : BOOL;
END_VAR

IF enabl THEN
Data1[1] := 1;
Data1[2] := 2;
Data1[3] := 3;
Data1[4] := 4;
Data1[5] := 5;
Data1[6] := 6;

Data2[1] := In_Time1;
Data2[2] := In_Time2;
Data2[3] := In_Time3;
Data2[4] := In_Time4;
Data2[5] := In_Time5;
Data2[6] := In_Time6;

FOR j:=1 TO 6 DO
IF Data2[j] = 0 THEN Data2[j] := 4294967295; END_IF;
END_FOR;


FOR j:=1 TO 6 DO
f := FALSE; mini := j;
FOR i:=j TO 6-j DO
IF Data2[i] > Data2[i+1] THEN
swOrder:= Data2[i]; swNumber:= Data1[i];
Data2[i] := Data2[i+1]; Data1[i] := Data1[i+1];
Data2[i+1] := swOrder; Data1[i+1] := swNumber;
f := TRUE;
END_IF;
IF Data2[i] < Data2[mini] THEN mini := i; END_IF;
END_FOR;
IF NOT f THEN EXIT; END_IF;
IF mini <> j THEN
swOrder:= Data2[j]; swNumber:= Data1[j];
Data2[j] := Data2[mini]; Data1[j] := Data1[mini];
Data2[mini] := swOrder; Data1[mini] := swNumber;
END_IF;
END_FOR;

FOR j:=1 TO 6 DO
IF Data2[j] = 4294967295 THEN
Queue[Data1[j]] := 0;
ELSE
Queue[Data1[j]] := j;
END_IF;
END_FOR;

out := Queue[1] * 100000 + Queue[2] * 10000 + Queue[3] * 1000 + Queue[4] * 100 + Queue[5] * 10 + Queue[6];

END_IF;

END_FUNCTION

Порядок - в соответствующих десятичных разрядах

maratin
29.10.2022, 23:36
Это больше похоже на codesys, в owenlogic нет массивов.

maratin
29.10.2022, 23:42
Все остальное уже реализовано и прекрасно работает на 3х насосах - нужно было расширить для 6 и более насосов, без обсуждения сопутствующих вопросов про СССР и что более 4х насосов практически не бывает.
Спасибо другим ребятам, особенно Dimensy, которые поняли задачу в том виде в каком было написано ТЗ и решили ее.

petera
30.10.2022, 04:31
Это больше похоже на codesys, в owenlogic нет массивов.

В лоджике теперь есть функции на ST, в которых массивы есть.

1exan
30.10.2022, 14:27
Это больше похоже на codesys, в owenlogic нет массивов.

Это и был блок из CDS, только немного с другим функционалом. Под Logic прямое копирование конечно не вариант, но после подпиливания - вполне работоспособно.

Сергей0308
31.10.2022, 04:08
В этой теме в постах #695 и #700 выкладывал проекты, в них макросы нахождения максимального значения из 16 с указанием номера входа(входов), короче можно этот макрос переделать для поиска не максимума, а минимума и он будет указывать какой следующий насос запускать или останавливать, по хорошему останавливать надо насос с наибольшей наработкой, то есть и мой макрос может пригодится, это я уже на худой конец предложил исходя из очень небольших познаний ТС(в этой сфере), чтобы он для начала как-нибудь сделал, скажем так не идеально, но вполне приемлемо, для первого раза, надо же когда то начинать!

https://owen.ru/forum/showthread.php?t=25067&page=70

Sergej_
31.10.2022, 05:30
В лоджике теперь есть функции на ST, в которых массивы есть.

А с какого релиза поддерживаются массивы, в самых первых не поддерживались, или я ошибаюсь? Не устанавливал просто ОЛ с поддержкой ST нужды не было. Если поддерживает реально ,то хорошо.

kondor3000
31.10.2022, 08:30
А с какого релиза поддерживаются массивы, в самых первых не поддерживались, или я ошибаюсь? Не устанавливал просто ОЛ с поддержкой ST нужды не было. Если поддерживает реально ,то хорошо.

Если не ошибаюсь, ещё с первого Лоджика, версия 1.23.279 ( по 289) уже работало. Но только функции, что не есть хорошо.

Sergej_
31.10.2022, 10:35
Если не ошибаюсь, ещё с первого Лоджика, версия 1.23.279 ( по 289) уже работало. Но только функции, что не есть хорошо.

Массивы работали? насколько я понял из сообщений форума, там ST усеченный был массивов не было, но повторю это с чужих слов. То ,что только функции понятно. По другому спрошу : сейчас массивы в ST ОЛ есть? Ставить ОЛ чтоб проверить не хочеться.

petera
31.10.2022, 11:38
Массивы работали? насколько я понял из сообщений форума, там ST усеченный был массивов не было, но повторю это с чужих слов. То ,что только функции понятно. По другому спрошу : сейчас массивы в ST ОЛ есть? Ставить ОЛ чтоб проверить не хочеться.

Есть

63542 63543

Sergej_
31.10.2022, 11:40
Есть


Спасибо большое.

maratin
31.10.2022, 17:41
В этой теме в постах #695 и #700 выкладывал проекты, в них макросы нахождения максимального значения из 16 с указанием номера входа(входов), короче можно этот макрос переделать для поиска не максимума, а минимума и он будет указывать какой следующий насос запускать или останавливать, по хорошему останавливать надо насос с наибольшей наработкой, то есть и мой макрос может пригодится, это я уже на худой конец предложил исходя из очень небольших познаний ТС(в этой сфере), чтобы он для начала как-нибудь сделал, скажем так не идеально, но вполне приемлемо, для первого раза, надо же когда то начинать!

https://owen.ru/forum/showthread.php?t=25067&page=70

Сергей, ТЗ было сформулировано четко с необходимым набором данных. Вы начали про СССР, затем признались, что не видели насосных станций на 4 и более насосов, затем предложили "натянуть сову на глобус".
В последнем сообщении сделали странный вывод о познаниях ТС (вы предсказатель или умеете ставить диагнозы незнакомым людям дистанционно?). Я, в отличие от вас, не только видел, но и запускал насосные станции на 14 насосов.
Рабочий макрос был написан в сообщении #6.
Если вам не хватает знаний сделать подобное, то продолжайте натягивать сову на глобус. До уровня Dimensy в owenlogic вы видимо не дотягиваете.
Или научитесь вежливому общению с людьми. Надо же когда-то начинать.
В вашей помощи и советах не нуждаюсь.

63547

Dimensy
31.10.2022, 18:15
До уровня Dimensy в owenlogic вы видимо не дотягиваете.


Тут я не соглашусь, Сергей0308 в Лоджике достиг дзена, его макросы красивы и функциональны. Но, иногда за деревьями он не видит леса.
а вообще, конечно, странно, что при конкретно поставленной задаче гуру начали философствовать

Сергей0308
31.10.2022, 19:21
Помните мультик про рассеянного с улицы Бассейной, он видит горы и долины, но не видит ничего, что под носом у него! В смысле ТС, сам написал, что запускается(останавливается) по одному насосу и достаточно определить следующий для запуска(останова) насос, это требуется для работы согласно озвученному алгоритму, остальное всё можно знать или рассчитать, но для работы по нашему алгоритму не требуется! Надеюсь понятно объяснил, Вы можете хоть рассчитывать время полёта до ближайшей к Солнцу звезды, короче, бывает много вариантов решения той или иной задачи, каждый со своими плюсами и минусами! И, что Вы там выдумывайте и фантазируете, говорит, что даже Вы понимаете, всю шаткость вашей позиции и отсутствие весомых аргументов!
Я же не спорю, может Вы крутой специалист, например землепашец, я же не захожу на ваш форум землепашцев и не учу как надо пахать, в свал или в развал!
Я то чего Вам плохого сделал, ну вижу другой вариант решения, более простой, ну предложил(подсказал) Вам как его сделать, не хотите не делайте, Вас никто не заставляет, зачем здесь рогами в ворота упираться, так и скажите, меня устраивает более сложный вариант, ПР не перетрудится, так часто бывает, люди добавляют всякие свистелки-перделки, чтобы пыль в глаза пустить несведущим людям, нам то лапшу на уши сложней навешать и вообще лучше делом займитесь, чем спорите, в смысле, научитесь сравнивать несколько переменных, это же элементарный вопрос, тогда и подсказки Вам не понадобились бы!

maratin
31.10.2022, 19:30
Я озвучил обязательное требование в сообщении №3: "Нужно сразу отобразить приоритеты запуска всех насосов"
Опять будете философствовать, что мой заказчик не прав и на самом деле он не хочет или не должен знать порядок запуска насосов?

maratin
31.10.2022, 19:35
Тут я не соглашусь, Сергей0308 в Лоджике достиг дзена, его макросы красивы и функциональны. Но, иногда за деревьями он не видит леса.
а вообще, конечно, странно, что при конкретно поставленной задаче гуру начали философствовать
Именно из-за такого подхода, как у Сергея я стараюсь не обращаться на данный форум с вопросами. При формулировании задачи, мне пытаются объяснить, что моя задача неправильная, и нужно искать решение в изменении задачи, а не в алгоритме. Иногда это правда так, но часто мне нужно решение именно сформулированной мною задачи.
Я сразу хотел абстрагировать свой вопрос и написать, что на входах у меня натуральные числа или 0 и нужно их (ненулевые) проиндексировать по возрастанию. Но знал, что могут сказать про абстрактность примера или попросить детали, поэтому написал про моточасы и приоритеты. Но Сергей захотел больше деталей.

Сергей0308
31.10.2022, 19:45
Я же написал, ваша очередь - это филькина грамота, она может меняться в процессе работы(у вас же очередь по наработке) и смотреть на неё тоже бессмысленно, в этом же нет никакого практического смысла! Насосная станция нужна для работы, а не очередь смотреть!

maratin
31.10.2022, 19:51
Я же написал, ваша очередь - это филькина грамота, она может меняться в процессе работы(у вас же очередь по наработке) и смотреть на неё тоже бессмысленно, в этом же нет никакого практического смысла! Насосная станция нужна для работы, а не очередь смотреть!

Я понял. По вашим сообщениям насосные станции больше 3 насосов тоже не нужны, т.к. вы их нигде не видели.

Сергей0308
26.12.2022, 03:11
Я понял. По вашим сообщениям насосные станции больше 3 насосов тоже не нужны, т.к. вы их нигде не видели.

Я так понимаю, очередную лабуду придумали, к тому же прямо противоположную действительности! Пожалуйста пишите что-то помимо лабуды, в смысле, лабуда надоела! Я всегда выступал за более универсальные макросы(алгоритмы), в смысле, за большее количество элементов(насосов в данном случае) Делал на 8 с возможностью легкого расширения(до 32), но мне обычно говорили, что так много не нужно и у них нигде больше 2 насосов не встречается!
Так что, всё правильно, только наоборот!
Просто логика(алгоритм) такой получался, в смысле, можно было легко расширить без значительного увеличения сложности!

https://owen.ru/forum/showthread.php?t=36564

https://owen.ru/forum/showthread.php?t=30327

Dimensy
30.12.2022, 13:22
Небольшой эксперимент, как одна и та же программа, выполненная по разному, влияет на цикл ПР.
Чтобы наверняка увидеть разницу запускал программы с четырьмя одинаковыми макросами.
Получилось следующее:
Макрос, который я выкладывал - цикл получился 17 мс
64969
Чуть подредактировал макрос и получил 15 мс
64970
Макрос на ST - 12 мс
64971
И макрос, выполненный по технике Сергея0308 - 7 мс
64972

capzap
30.12.2022, 17:13
Макрос на ST - 12 мс

мне кажется его можно еще сократить 64974

Dimensy
30.12.2022, 20:11
мне кажется его можно еще сократить
Возможно, но мне, когда здесь выложили решение на SТ, стало просто интересно, а как он будет влиять на цикл ПР (там ведь вложенные циклы). Ну и вот, добрался до железа.

1exan
05.01.2023, 16:25
Небольшой эксперимент, как одна и та же программа, выполненная по разному, влияет на цикл ПР.
Чтобы наверняка увидеть разницу запускал программы с четырьмя одинаковыми макросами.
Получилось следующее:
Макрос, который я выкладывал - цикл получился 17 мс
64969
Чуть подредактировал макрос и получил 15 мс
64970
Макрос на ST - 12 мс
64971
И макрос, выполненный по технике Сергея0308 - 7 мс
64972

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

Filini
25.02.2023, 08:46
И, в принципе, для чего выравнивать наработку? Чтобы все насосы умерли одновременно и это добавило Вам проблем?

Тоже всегда интересовал ответ на этот вопрос))))))