PDA

Просмотр полной версии : ФБ на ST ротация насосов



7in
27.12.2023, 09:07
Около 7 лет назад AI! (https://owen.ru/forum/member.php?u=10247) выкладывал макрос для управления насосами с ротацией (https://owen.ru/forum/showthread.php?t=12687&page=164&p=221339&viewfull=1#post221339)
Данный макрос (его усеченная версия на 4 насоса) идеально подходит для моей задачи, отрабатывает ровно так, как нужно
В связи с появлением функциональных блоков на ST в OL появилась идея переписать данный макрос на ST, но к сожалению я так и не смог разобраться в принципе его работы.
Прошу помощи у более опытных участников форума в данном вопросе.
Возможно подобное уже было реализовано в CDS и можно это портировать на ПР ? (я на форуме подобного не нашел)

Сергей0308
27.12.2023, 09:41
Около 7 лет назад AI! (https://owen.ru/forum/member.php?u=10247) выкладывал макрос для управления насосами с ротацией (https://owen.ru/forum/showthread.php?t=12687&page=164&p=221339&viewfull=1#post221339)
Данный макрос (его усеченная версия на 4 насоса) идеально подходит для моей задачи, отрабатывает ровно так, как нужно
В связи с появлением функциональных блоков на ST в OL появилась идея переписать данный макрос на ST, но к сожалению я так и не смог разобраться в принципе его работы.
Прошу помощи у более опытных участников форума в данном вопросе.
Возможно подобное уже было реализовано в CDS и можно это портировать на ПР ? (я на форуме подобного не нашел)

Странно, если всё работает как хотите, зачем проблемы создавать на ровном месте, на СТ очень неудобно будет, в смысле, нельзя в макрос "спрятать", вот мой вариант, может Вас устроит:

72645

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

kondor3000
27.12.2023, 10:31
Около 7 лет назад AI! (https://owen.ru/forum/member.php?u=10247) выкладывал макрос для управления насосами с ротацией (https://owen.ru/forum/showthread.php?t=12687&page=164&p=221339&viewfull=1#post221339)
Данный макрос (его усеченная версия на 4 насоса) идеально подходит для моей задачи, отрабатывает ровно так, как нужно
В связи с появлением функциональных блоков на ST в OL появилась идея переписать данный макрос на ST, но к сожалению я так и не смог разобраться в принципе его работы.
Прошу помощи у более опытных участников форума в данном вопросе.
Возможно подобное уже было реализовано в CDS и можно это портировать на ПР ? (я на форуме подобного не нашел)

Для того, чтобы что то написать, нужно знать алгоритм работы, а вы даже не удосужились его расписать.

7in
27.12.2023, 11:35
зачем проблемы создавать на ровном месте, на СТ очень неудобно будет
Необходимость переписать на ST появилась в связи с тем, что в других похожих задачах на объекте заложен СПК без ПР и хотелось бы заранее попробовать реализацию на ST(на ПР), т.к. её должно быть легко в будущем перенести на ПЛК/СПК.
Помимо этого, я (возможно ошибочно) предполагал что реализация на ST позволит без больших усилий увеличить количество насосов с 8 до скажем 16, что тоже возможно пригодится.


Для того, чтобы что то написать, нужно знать алгоритм работы, а вы даже не удосужились его расписать.
Действительно, стоило сразу расписать алгоритм:
На вход ФБ подаются две целочисленные переменные
1. Битовая маска разрешенных насосов
2. Необходимое в данный момент количество включенных насосов
На выходе ФБ соответственно битовая маска на включение насосов
Сам алгоритм:
В соответствии с количеством необходимых насосов (поступивших на вход 2) ФБ выдает битовую маску на их включение, при этом включая только разрешённые насосы, начиная с младшего бита в маске.
Для каждого из насосов считается время наработки, в процессе работы при увеличении кол-ва необходимых насосов включается насос с наименьшей наработкой, в случае уменьшения - отключается насос с наибольшей наработкой. Наработка сбрасывается на 0 при перезапуске ПР.
Если в процессе работы изменилась битовая маска разрешенных насосов - необходимо включить/отключить насосы, чтобы необходимое количество соответствовало числу активных бит в маске на выходе ФБ.

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

melky
27.12.2023, 11:52
Я пробовал макрос AI! переписать в CodeSys 2.3 и... ничего не вышло. Переписывал ессно не в ST а так же в FBD (CFC кажется). Всему виной линия обратной связи, которая используется в макросе ПР.
Мне даже ребята на форуме помогли сделать аналог "Линии обратной связи" на CDS но работала она не так, как в макросе на ПР. В общем забил тогда, так как под мою задачу ротация по принципам данного макроса для меня была избыточна.
Делал ротацию по времени переключения для кондиционеров на ПЛК63. В общем делал по другому алгоритму.

Макрос же AI! высчитывает время работы каждого насоса и оперирует этими данными, который включать, а который нет уже дальше в зависимости от битовых масок количества и аварийных насосов.

вообще линия обратной связи в ПР работает очень уж хитро, ее сложно повторить на других языках. Это именно в тех режимах работы макроса, когда поведение с линией обратной связи отличается без этой линии (когда она желтым). то есть когда вообще кардинально меняется поведение работы макроса с линией и без.

Сергей0308
27.12.2023, 12:24
Необходимость переписать на ST появилась в связи с тем, что в других похожих задачах на объекте заложен СПК без ПР и хотелось бы заранее попробовать реализацию на ST(на ПР), т.к. её должно быть легко в будущем перенести на ПЛК/СПК.
Помимо этого, я (возможно ошибочно) предполагал что реализация на ST позволит без больших усилий увеличить количество насосов с 8 до скажем 16, что тоже возможно пригодится.


Действительно, стоило сразу расписать алгоритм:
На вход ФБ подаются две целочисленные переменные
1. Битовая маска разрешенных насосов
2. Необходимое в данный момент количество включенных насосов
На выходе ФБ соответственно битовая маска на включение насосов
Сам алгоритм:
В соответствии с количеством необходимых насосов (поступивших на вход 2) ФБ выдает битовую маску на их включение, при этом включая только разрешённые насосы, начиная с младшего бита в маске.
Для каждого из насосов считается время наработки, в процессе работы при увеличении кол-ва необходимых насосов включается насос с наименьшей наработкой, в случае уменьшения - отключается насос с наибольшей наработкой. Наработка сбрасывается на 0 при перезапуске ПР.
Если в процессе работы изменилась битовая маска разрешенных насосов - необходимо включить/отключить насосы, чтобы необходимое количество соответствовало числу активных бит в маске на выходе ФБ.


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

Вы понимаете, что такое наработка насосов? В смысле она не зависит от количества перезапусков ПР.
И что при изменение готовых(разрешённых) к работе насосов надо их передёргивать(выключать-включать) - это мракобесие, в смысле мой вариант свободен от этих недостатков.
Так что можно и мой вариант использовать, в смысле, большой разницы не будет.
Да, чуть не забыл, мой вариант позволяет в случае аварии включать ему на замену другой без всяких передёргиваний насосов, хоть убей не могу понять зачем у вас это сделано, это же очень неудобно!
И, легко расширяется до 32 насосов, я писал об этом в теме, что ссылку дал, не просто, а очень просто, думаю намного проще чем в СТ!
Мой алгоритм выполняет равномерное использование готовых к работе насосов!

7in
27.12.2023, 12:39
Вы понимаете, что такое наработка насосов? В смысле она не зависит от количества перезапусков ПР.
И что при изменение готовых(разрешённых) к работе насосов надо их передёргивать(выключать-включать) - это мракобесие
Что такое наработка я понимаю, что она никак не связана кол-вом перезапусков ПР я тоже понимаю. Я просто хотел обозначить что не нужно считать наработку "за все время", достаточно только с момента включения контроллера.
Касательно "передёргивать" - возможно некорректно выразился, я под "включить/отключить" подразумевал не перезапуск всех насосов, а то, что если один из работающих насосов ушел в аварию - нужно насос с аварией отключить и включить ему на замену другой из разрешенных.

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

Сергей0308
27.12.2023, 12:39
Редкий случай вменяемого описания.
Мало того, данное описание самое естественное, что встречается регулярно и чуть ли не каждый день в жизни каждого.

Согласен, описание хорошее, обычно такое напишут, что сомнения закрадываются в разумности написавшего!

melky
27.12.2023, 13:29
Макрос от AI! лучше всего подходит под описание Валенка :) то есть когда в режиме работы по внешним критериям могут работать 2,3,5 насосов в один момент времени, а через время опять переключаться с 5 на 3 или сразу на 2.
Например поддержание давления или еще чего-то.

У меня была простая ситуация, просто ротирование кондиционеров по времени. В конечном итоге они и так равномерно работают, кроме случаев аварии или вывода в обслуживание, но это не критично было.

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

Василий Кашуба
27.12.2023, 20:19
Вот упрощённая версия макроса, правда ротация 5-ти насосов.

Сергей0308
27.12.2023, 20:51
Вот упрощённая версия макроса, правда ротация 5-ти насосов.

Василий, здесь человек с проектом не может разобраться, а Вы предлагаете тоже самое по фотографии сделать, в смысле, мне кажется это усложнит задачу!

kondor3000
30.12.2023, 19:55
Необходимость переписать на ST появилась в связи с тем, что в других похожих задачах на объекте заложен СПК без ПР и хотелось бы заранее попробовать реализацию на ST(на ПР), т.к. её должно быть легко в будущем перенести на ПЛК/СПК.
Помимо этого, я (возможно ошибочно) предполагал что реализация на ST позволит без больших усилий увеличить количество насосов с 8 до скажем 16, что тоже возможно пригодится.
Действительно, стоило сразу расписать алгоритм:
На вход ФБ подаются две целочисленные переменные
1. Битовая маска разрешенных насосов
2. Необходимое в данный момент количество включенных насосов
На выходе ФБ соответственно битовая маска на включение насосов
Сам алгоритм:
В соответствии с количеством необходимых насосов (поступивших на вход 2) ФБ выдает битовую маску на их включение, при этом включая только разрешённые насосы, начиная с младшего бита в маске.
Для каждого из насосов считается время наработки, в процессе работы при увеличении кол-ва необходимых насосов включается насос с наименьшей наработкой, в случае уменьшения - отключается насос с наибольшей наработкой. Наработка сбрасывается на 0 при перезапуске ПР.
Если в процессе работы изменилась битовая маска разрешенных насосов - необходимо включить/отключить насосы, чтобы необходимое количество соответствовало числу активных бит в маске на выходе ФБ.

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

Вот накидал для 4 насосов, на ST, при желании можно расширить до 16 и больше. Кроме маски аварий и кол-ва необходимых насосов, 72725
вывел наработку по 4 насосам в секундах (можно сделать в минутах и часах). Наработка считается как Нараб=Часы*10000+Мин*100+Сек.
Если наработка не нужна, можно её убрать на выходах. Переключаться будет всё равно.
Ротация происходит через 10 часов ( можно изменить), по минимальной наработке. При аварии переключается на следующий исправный насос.
При включении ПР наработка сохраняется, сброс сделать не проблема, например по таймеру ТР на 0,5 сек ( ручной сброс есть).

kondor3000
01.01.2024, 17:52
Доработал вариант, улучшен алгоритм переключений при авариях. Наработка считается как Нараб=Часы*10000+Мин*100+Сек.72741
Варианты на 4 и на 8 насосов. Версия OWEN Logic2.5.342

Новый вариант 4 насоса_Наработка_Ротация по времени_4 Уровня, новый таймер без Т_цикла
Последний вариант 4 насоса_Наработка_Ротация по времени_Запоминание наработки -7,
Исправленный вариант 4 насоса_Наработка_Ротация по времени_Запоминание наработки -8,
Последний вариант с выбором насоса и задачей времени 4 насоса_Нараб_Ротация по времени_4 Уровня_10

Ротация на 3 насоса с уровнем тут https://owen.ru/forum/showthread.php?t=41447&p=465379&viewfull=1#post465379

в строке сброса таймера, было так ET=PT1, а должно быть так ET>=PT1
В третьей строке снизу, где сброс таймера и переключение Main:=Main+1;

if Q and ET>=PT1 or Res then PT1:=0; In:=false; ET:=0; Main:=Main+1; end_if
В реальном ПР переменная ЕТ может проскочить равенство на несколько единиц и сброс не сработает.

Сергей0308
02.01.2024, 15:42
Мне кажется, ротацию лучше производить не по абсолютной наработке, а для ротации иметь отдельную переменную для каждого насоса, эти переменные можно сбросить(выровнять) например при замене одного из насосов на новый, такое впечатление, что люди не от мира сего, в смысле, из другой галактики(вселенной), где совсем другие законы и логика.
И, сделайте вход выбора насоса, в смысле, зачем делать выход наработки для каждого насоса(нельзя что ли мультиплексор поставить?), может их 16(или больше), это же ёжик получится!
И, можно добавить, для универсальности, входную переменную, по сколько насосов производить ротацию, в одной из тем товарищ хотел, чтобы ротация происходила по два насоса, в смысле, могут быть какие-то оригинальные желания.

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

kondor3000
02.01.2024, 17:24
Мне кажется, ротацию лучше производить не по абсолютной наработке, а для ротации иметь отдельную переменную для каждого насоса, эти переменные можно сбросить(выровнять) например при замене одного из насосов на новый, такое впечатление, что люди не от мира сего, в смысле, из другой галактики(вселенной), где совсем другие законы и логика.
И, сделайте вход выбора насоса, в смысле, зачем делать выход наработки для каждого насоса(нельзя что ли мультиплексор поставить?), может их 16(или больше), это же ёжик получится!
И, можно добавить, для универсальности, входную переменную, по сколько насосов производить ротацию, в одной из тем товарищ хотел, чтобы ротация происходила по два насоса, в смысле, могут быть какие-то оригинальные желания.


Добавить мультиплексор не проблема, дописать одну строчку, кому надо сделает сам или спросит как сделать.
А по поводу выбора кол-ва насосов есть переменная Amount (Даже на скрине видно), специально ведь подписал в рамке Amount - необходимое число насосов 1-4 (1-8).
Поставьте 2 и будет по 2 насоса переключать.

Сергей0308
02.01.2024, 18:03
Добавить мультиплексор не проблема, дописать одну строчку, кому надо сделает сам или спросит как сделать.
А по поводу выбора кол-ва насосов есть переменная Amount (Даже на скрине видно), специально ведь подписал в рамке Amount - необходимое число насосов 1-4 (1-8).
Поставьте 2 и будет по 2 насоса переключать.

Это же количество одновременно работающих насосов, насколько я понимаю?
Мне кажется, алгоритм работы будет более универсальным(гибким), в смысле, если назначить отдельную переменную. Например в моём варианте, что я ссылку давал, может быть до 4 одновременно работающих насоса, но ротация всегда происходит по 1-у насосу, у Вас, насколько смог понять, ротация всегда происходит на количество одновременно работающих насосов, например, при 4-х одновременно работающих насосах, Вы не можете назначить как у меня, чтобы ротация происходила не одновременно для 4 насосов, а по одному насосу с периодом в 4 раза меньшим, в принципе будет тоже самое, но момент ротации насосов будет сдвинут на 1/4 периода работы насоса, в большинстве случаев одновременно все 4 насоса ротировать стрёмно, в смысле, лучше по одному.

Urfin_Dzhyus
26.03.2025, 14:04
Вот накидал для 4 насосов, на ST, при желании можно расширить до 16 и больше. Кроме маски аварий и кол-ва необходимых насосов, 72725
вывел наработку по 4 насосам в секундах (можно сделать в минутах и часах). Наработка считается как Нараб=Часы*10000+Мин*100+Сек.
Если наработка не нужна, можно её убрать на выходах. Переключаться будет всё равно.
Ротация происходит через 10 часов ( можно изменить), по минимальной наработке. При аварии переключается на следующий исправный насос.
При включении ПР наработка сохраняется, сброс сделать не проблема, например по таймеру ТР на 0,5 сек ( ручной сброс есть).

kondor3000, не подскажите, как переменную РТ1 сделать входящей, хотелось бы из меню задавать время ротации?

kondor3000
26.03.2025, 14:10
kondor3000, не подскажите, как переменную РТ1 сделать входящей, хотелось бы из меню задавать время ротации?

Только берите последний пример с запоминанием наработки. https://owen.ru/forum/showthread.php?t=38920&p=426052&viewfull=1#post426052
Достаточно задачу PT1 перенести из VAR в VAR_INPUT, потом обновить ФБ по ПКМ и все дела)

Urfin_Dzhyus
26.03.2025, 14:39
Только берите последний пример с запоминанием наработки.
Достаточно задачу PT1 перенести из VAR в VAR_INPUT, потом обновить ФБ по ПКМ и все дела)

Спасибо, всё заработало.

Urfin_Dzhyus
26.03.2025, 14:56
Только берите последний пример с запоминанием наработки. https://owen.ru/forum/showthread.php?t=38920&p=426052&viewfull=1#post426052
Достаточно задачу PT1 перенести из VAR в VAR_INPUT, потом обновить ФБ по ПКМ и все дела)

Э...заработало, на третьем примере, он открытым был, а я поспешил. Возможны последствия, просто интересно?

kondor3000
26.03.2025, 15:01
Э...заработало, на третьем примере, он открытым был, а я поспешил. Возможны последствия, просто интересно?

Третий пример 4 насоса_Нараб_Ротация по времени_4 Уровня_7 не запоминает наработку при выключении питания ПР.
Если вам не надо запоминать наработку, то можно использовать.

Urfin_Dzhyus
26.03.2025, 15:08
Третий пример 4 насоса_Нараб_Ротация по времени_4 Уровня_7 не запоминает наработку при выключении питания ПР.
Если вам не надо запоминать наработку, то можно использовать.

Ещё раз спасибо. Я понимаю, что таким образом можно практически любую переменную сделать входной или выходной. Магия, блин.

Urfin_Dzhyus
31.03.2025, 09:54
Третий пример.

kondor3000, подскажите почему не работает блочёк, вроде без ошибок.

kondor3000
31.03.2025, 10:11
kondor3000, подскажите почему не работает блочёк, вроде без ошибок.

Выходные переменные сделайте энергонезависимыми или подключите куда нибудь, например на выход ПР через преобразование.

Urfin_Dzhyus
31.03.2025, 10:41
Выходные переменные сделайте энергонезависимыми или подключите куда нибудь, например на выход ПР через преобразование.

Заработало, спасибо.

Urfin_Dzhyus
31.03.2025, 14:33
Выходные переменные сделайте энергонезависимыми или подключите куда нибудь, например на выход ПР через преобразование.

Заработало, да не совсем красиво. Не научите, как числа сделать двузначными, т.е как нолик прикрутить?

kondor3000
31.03.2025, 15:04
Заработало, да не совсем красиво. Не научите, как числа сделать двузначными, т.е как нолик прикрутить?

Вот, на днях показывал, вот так 82806 Деление на 10 и MOD 10
https://owen.ru/forum/showthread.php?t=9398&p=459515&viewfull=1#post459515
можно и на ST

Has_des:=Has/10;
Has_ed:=Has mod 10;

Urfin_Dzhyus
01.04.2025, 10:52
можно и на ST


Спасибо, вот что собственно у меня получилось, если есть что, подъюстируйте молотком, буду признателен.

1exan
01.04.2025, 12:00
Спасибо, вот что собственно у меня получилось, если есть что, подъюстируйте молотком, буду признателен.

Как вариант


...
Sek:=in_sek mod 60;
...

kondor3000
01.04.2025, 12:48
Спасибо, вот что собственно у меня получилось, если есть что, подъюстируйте молотком, буду признателен.
Только надо было по порядку расставить, смотреть наоборот не удобно)) 82822
Можно и так

Myn:=in_sek mod 3600/60;

Можно два блока соединить в один и время получить прямо в ФБ
https://owen.ru/forum/showthread.php?t=38721#8


DT_:=dt_to_udint(get_date_time()); // Дата и время DT
Timer:=DT_ MOD 86400 ; // Время

https://owen.ru/forum/showthread.php?t=37203&page=9&p=429061#81

Urfin_Dzhyus
25.04.2025, 12:05
https://owen.ru/forum/showthread.php?t=38891

Почему 2, а не 1 во всех программах этой серии? В симуляторе блок выдаёт 1, то же если его перенести в другой проект и если его взять из библиотеки проекта в этой же схеме. Я верно чего то не вижу. Поясните пожалуйста

kondor3000
25.04.2025, 12:33
Почему 2, а не 1 во всех программах этой серии? В симуляторе блок выдаёт 1, то же если его перенести в другой проект и если его взять из библиотеки проекта в этой же схеме. Я верно чего то не вижу. Поясните пожалуйста

В обоих блоках прописаны константы с 1, а не с 0 бита. 83424 При переносе проекта, константы слетают, надо следить за этим.
Так что 2 это правильно.

Urfin_Dzhyus
25.04.2025, 14:01
В обоих блоках прописаны константы с 1, а не с 0 бита. 83424 При переносе проекта, константы слетают, надо следить за этим.
Так что 2 это правильно.

Так и не понял, как это сделать самому, подскажите.

kondor3000
25.04.2025, 14:03
Так и не понял, как это сделать самому, подскажите.

В скачанном проекте нажмите на макрос ( выделите его) как на скрине и смотрите константы прописанные. Их можно изменить как вам надо.
На всех макросах они прописаны, те константы что в самом макросе использованы, номера бит или задача времени Блинка.
Я использовал:
Ротация 8 насосов с 2-я включёнными_2.owl https://owen.ru/forum/showthread.php?t=36564&p=385145&viewfull=1#post385145

Urfin_Dzhyus
25.04.2025, 15:53
Понял, ввело в заблуждение название констант, а это нумерация, шлёпаю по "значение константа 1" и ничего не происходит, а тут число редактировать надо.

witalexxx
22.07.2025, 12:26
Здравствуйте. Ранее в посте уважаемым пользователем kondor3000 были выложены проекты на ротацию насосов, скриншот прилагаю: 84952. А как переделать этот проект на 5 насосов с ротацией и запоминанием времени наработки с возможностью уставки времени ротации с экрана ПР200? Ссылку прилагаю, пост #13: https://owen.ru/forum/showthread.php?t=38920&page=2. Я бы рад и сам сделать, но пока затрудняюсь, язык ST не знаю.

melky
22.07.2025, 13:40
witalexxx там же в списке есть на 8 насосов, если так же на ST, можете сравнить.

kondor3000
22.07.2025, 13:57
Здравствуйте. Ранее в посте уважаемым пользователем kondor3000 были выложены проекты на ротацию насосов, скриншот прилагаю: . А как переделать этот проект на 5 насосов с ротацией и запоминанием времени наработки с возможностью уставки времени ротации с экрана ПР200? Ссылку прилагаю, пост #13: https://owen.ru/forum/showthread.php?t=38920&page=2. Я бы рад и сам сделать, но пока затрудняюсь, язык ST не знаю.

Все места где задано кол-во насосов можно изменить, на нужное вам кол-во. Щёлкните по функц. блоку, ТАМ ВСЁ ПОДПИСАНО.
Есть версии на 4 и 8, 12 насосов, просто сравните. Так же есть версии с задачей времени ротации (или самому дописать).
Как минимум попробуйте и выложите, если не получится.
https://owen.ru/forum/showthread.php?t=37203&page=9&p=429061#81

witalexxx
28.07.2025, 16:39
Здравствуйте. Не знаю в чем причина. Не могу переделать ротацию с 4 на 5 насосов. Вроде бы и разобрался (сравнивал на 2, и 3 и 4, и даже 8 насосов, как бы все логично), менял количество и описание переменных для изменения программы ротации с 4 на 5 насосов с памятью по времени, но на холсте количество выходов не меняется. И не могу избавиться от ошибок, хотя вся орфография по образцу от прежних программ. Подскажите пожалуйста , как сделать. Файл попыткой переделывания на насосов прилагаю.
85047

Валенок
28.07.2025, 17:19
Здравствуйте. Не знаю в чем причина. Не могу переделать ротацию с 4 на 5 насосов. Вроде бы и разобрался (сравнивал на 2, и 3 и 4, и даже 8 насосов, как бы все логично), менял количество и описание переменных для изменения программы ротации с 4 на 5 насосов с памятью по времени, но на холсте количество выходов не меняется. И не могу избавиться от ошибок, хотя вся орфография по образцу от прежних программ. Подскажите пожалуйста , как сделать. Файл попыткой переделывания на насосов прилагаю.
85047
А всякие Min2 Min4 - ваши?

kondor3000
28.07.2025, 17:48
Здравствуйте. Не знаю в чем причина. Не могу переделать ротацию с 4 на 5 насосов. Вроде бы и разобрался (сравнивал на 2, и 3 и 4, и даже 8 насосов, как бы все логично), менял количество и описание переменных для изменения программы ротации с 4 на 5 насосов с памятью по времени, но на холсте количество выходов не меняется. И не могу избавиться от ошибок, хотя вся орфография по образцу от прежних программ. Подскажите пожалуйста , как сделать. Файл попыткой переделывания на насосов прилагаю.


Вы не создали функцию Min5 ( с 5 входами), поставили в переменной T_5 прочерк не в конце, 85048
а так же не соединили блоки с переменными и не заменили блоки на новые. Замену блока можно сделать и по ПКМ, если подключен хотя бы один выход. Изменённый блок подсвечен красным.
Либо на время закомментируйте строку с функцией Min5.
И добавить переменную Нараб5, после исправления всё заработало.
При чём, все ошибки в блоке написаны внизу.

witalexxx
29.07.2025, 09:40
Вы не создали функцию Min5 ( с 5 входами), поставили в переменной T_5 прочерк не в конце, 85048
а так же не соединили блоки с переменными и не заменили блоки на новые. Замену блока можно сделать и по ПКМ, если подключен хотя бы один выход. Изменённый блок подсвечен красным.
Либо на время закомментируйте строку с функцией Min5.
И добавить переменную Нараб5, после исправления всё заработало.
При чём, все ошибки в блоке написаны внизу.

Извините за беспокойство, все исправил, только не могу понять, как создать функцию Min5 (с 5 входами), вроде бы все как у Вас, но ошибка не исчезает, 85050, 85051, понимаю, что это совсем простое действие, но не получается, при попытке исправления растут ошибки.

melky
29.07.2025, 09:56
так может там не надо Min5 писать, а Min, просто внутри должно быть 5 элементов. И в функции в том числе? з.ы. не смотрел код, но ошибка как бы намекает, что такой функции нет.

witalexxx
29.07.2025, 10:02
так может там не надо Min5 писать, а Min, просто внутри должно быть 5 элементов. И в функции в том числе? з.ы. не смотрел код, но ошибка как бы намекает, что такой функции нет.

Вот проект:85052

Alexus_Daedarus
29.07.2025, 11:49
85053

открываем функцию Min4
копируем всё
в панели инструментов нажимаем "создать функцию на ST"
вставляем ранее скопированное
правим содержимое под Вашу задачу, не забыв переименовать функцию

85054

kondor3000
29.07.2025, 13:36
Вот проект:85052

Выше вам уже выложили, правда с маленькой ошибкой, в функции Min5, в последней строке должно быть Min5:=5;
Вот исправленный проект

Валенок
29.07.2025, 17:27
Не проще ли сделать фб с дюжиной ножек и входным кол-вом, в нем пихнуть все в массив, крутануть цикл заданное кол-во раз и не возвращаться этому смешному вопросу поиска индекса минимума из то 2х то 3х то 4х то 5ти элементов
Для фб не обязательно все входы юзать.

melky
29.07.2025, 17:39
я когда делал ротацию, просто тупо сделал на 8-мь, даже если мне надо было 5-ть. Есть переменная "Общее количество" и "В отдыхе".

ставлю 6 и 2, получаю 4+2 например. Да, есть 8 входов для контроля (обратная связь) - легко делается одним входом по маске.

FPavel
29.07.2025, 18:48
Недавно делал - но ещё не проверял в работе - такой вариант выбора насоса по наименьшей наработке:
- сделал ФБ выбора одного из двух наборов данных по критерию минимума наработки, набор данных: наработка, номер насоса, готовность насоса. По наработке выбирается минимальный набор, если готовности нет, то этот набор исключается
- применил несколько раз этот макрос ко всем насосам системы
- выбор запоминается
- пересчёт выбора происходит по условиям: сигнал пуск установки, сигнал ротации, изменение готовности активного насоса, при изменении состояния от "нет ни одного готового" до "есть хоть один" после сброса

Есть проблема - при значительной разнице наработки ротации не будет. Но с другой стороны, такое техзадание - выравнивание наработки.

Валенок
29.07.2025, 19:30
...
Есть проблема - при значительной разнице наработки ротации не будет.
Овно-вопрос. Сравнивайте по сумме текущей "сессии" и наработке с разными весовыми коэффицентами. И всё.
Для наработки коэффициент меньше и отрицательный. Сравняется, вопрос времени.

FPavel
29.07.2025, 19:51
В принципе - да, сравняется, т.к. при пуске будет приоритет у наименьшей наработки.
А в ходе длительной работы за счёт "веса" появляется возможность ротации.

Спасибо.

1exan
29.07.2025, 20:07
В принципе - да, сравняется, т.к. при пуске будет приоритет у наименьшей наработки.
А в ходе длительной работы за счёт "веса" появляется возможность ротации.

Спасибо.

Возможно идея в том, чтобы ротацию выполнять не по суммарной наработке, а по локальной - например, начинающейся с момента последнего включения группы в работу.
При этом устройства с большой наработкой тоже участвуют в работе, но у них быстрее считается локальная наработка за счёт некоторого коэффициента.
А коэффициенты наверно можно рассчитывать обратно пропорционально значениям суммарной наработки.

Валенок
30.07.2025, 00:19
... с большой наработкой тоже участвуют в работе, но у них быстрее считается локальная наработка за счёт некоторого коэффициента...
Пожилые же. Устают быстрее
Отдыхать нужно больше - медленнее считается локальная наработка "отдыха"

witalexxx
30.07.2025, 08:48
Спасибо большое всем за помощь, все получилось, вот мой результат, на ST совсем раньше ничего не делал.85065

kondor3000
30.07.2025, 18:10
Спасибо большое всем за помощь, все получилось, вот мой результат, на ST совсем раньше ничего не делал.85065

У вас ошибка, не соединена переменная Наработка5.
Константу 1 к Enable можно не подключать, просто в переменной Enable на входе в ФБ, поставить начальное число 1.

witalexxx
08.09.2025, 08:54
Здравствуйте. Возвращаюсь к вопросу ротации 5-ти насосов с памятью наработки. В ПР-200 установил версию с поста, ссылка,85628, время ротации для 5-ти насосов установлена на 600 секунд (каждый насос ротируется через 10 минут, так как быстро перегревается, для этого и используется ротация). Но появляется постоянная проблема, при снятии питания с ПР-200 ротация начинается с первого насоса и не происходит смена ротации насоса, первый насос отрабатывает 600 секунд и продолжает работать дальше, ротации не происходит совсем. Проблему со сменой ротации можно решить сбросом времени наработки, и то через раз, всегда есть баг с первым насосом, который работает и не происходит переключение по времени ротации на другие насосы. В результате мои 5 насосов перегревались, не ротировались, пришлось делать костыли в виде температурного контроля для отключения перерабатывающего по времени ротации насоса. Схему прилагаю. Самое интересное, что в симуляторе все работает, а при заливке программы в ПР-200 ротация через раз. Я очень благодарен за помощь с программой ротации на 5 насосов и с памятью наработки, но есть проблема со сменой ротации и как ее сделать гарантированной? Ссылка на мой проект - 85629

kondor3000
08.09.2025, 09:21
Здравствуйте. Возвращаюсь к вопросу ротации 5-ти насосов с памятью наработки. В ПР-200 установил версию с поста, ссылка,85628, время ротации для 5-ти насосов установлена на 600 секунд (каждый насос ротируется через 10 минут, так как быстро перегревается, для этого и используется ротация). Но появляется постоянная проблема, при снятии питания с ПР-200 ротация начинается с первого насоса и не происходит смена ротации насоса, первый насос отрабатывает 600 секунд и продолжает работать дальше, ротации не происходит совсем. Проблему со сменой ротации можно решить сбросом времени наработки, и то через раз, всегда есть баг с первым насосом, который работает и не происходит переключение по времени ротации на другие насосы. В результате мои 5 насосов перегревались, не ротировались, пришлось делать костыли в виде температурного контроля для отключения перерабатывающего по времени ротации насоса. Схему прилагаю. Самое интересное, что в симуляторе все работает, а при заливке программы в ПР-200 ротация через раз. Я очень благодарен за помощь с программой ротации на 5 насосов и с памятью наработки, но есть проблема со сменой ротации и как ее сделать гарантированной? Ссылка на мой проект - 85629
Не используйте последнюю версию Owen Logic2.11.368, там ST врёт.
Можно вывести переменную Main (номер текущего насоса) на входы и переключать её через 10 мин снаружи, от 1 до 5.
Но дело скорее всего не в программе, а в помехах от коммутации насосов.

Вот исправленная версия, функция Min работает только при включении, далее насосы работают по очереди, версия OWEN Logic2.6.345
Последняя, с задачей времени и выбором насоса 11

Сергей0308
08.09.2025, 09:25
Здравствуйте. Возвращаюсь к вопросу ротации 5-ти насосов с памятью наработки. В ПР-200 установил версию с поста, ссылка,85628, время ротации для 5-ти насосов установлена на 600 секунд (каждый насос ротируется через 10 минут, так как быстро перегревается, для этого и используется ротация). Но появляется постоянная проблема, при снятии питания с ПР-200 ротация начинается с первого насоса и не происходит смена ротации насоса, первый насос отрабатывает 600 секунд и продолжает работать дальше, ротации не происходит совсем. Проблему со сменой ротации можно решить сбросом времени наработки, и то через раз, всегда есть баг с первым насосом, который работает и не происходит переключение по времени ротации на другие насосы. В результате мои 5 насосов перегревались, не ротировались, пришлось делать костыли в виде температурного контроля для отключения перерабатывающего по времени ротации насоса. Схему прилагаю. Самое интересное, что в симуляторе все работает, а при заливке программы в ПР-200 ротация через раз. Я очень благодарен за помощь с программой ротации на 5 насосов и с памятью наработки, но есть проблема со сменой ротации и как ее сделать гарантированной? Ссылка на мой проект - 85629

Так Вы хотите выравнивать наработку или как Вы пишите, ротация каждые 10 минут?
Если последнее, здесь посмотрите: https://owen.ru/forum/showthread.php?t=36564&p=385145&viewfull=1#post385145

1exan
08.09.2025, 09:45
Здравствуйте. Возвращаюсь к вопросу ротации 5-ти насосов с памятью наработки. В ПР-200 установил версию с поста, ссылка,85628, время ротации для 5-ти насосов установлена на 600 секунд (каждый насос ротируется через 10 минут, так как быстро перегревается, для этого и используется ротация). Но появляется постоянная проблема, при снятии питания с ПР-200 ротация начинается с первого насоса и не происходит смена ротации насоса, первый насос отрабатывает 600 секунд и продолжает работать дальше, ротации не происходит совсем. Проблему со сменой ротации можно решить сбросом времени наработки, и то через раз, всегда есть баг с первым насосом, который работает и не происходит переключение по времени ротации на другие насосы. В результате мои 5 насосов перегревались, не ротировались, пришлось делать костыли в виде температурного контроля для отключения перерабатывающего по времени ротации насоса. Схему прилагаю. Самое интересное, что в симуляторе все работает, а при заливке программы в ПР-200 ротация через раз. Я очень благодарен за помощь с программой ротации на 5 насосов и с памятью наработки, но есть проблема со сменой ротации и как ее сделать гарантированной? Ссылка на мой проект - 85629

Скорее всего проблема в том, что включена энергонезависимость всего подряд - там где надо и не надо

In_Da_Cher_A
08.09.2025, 10:20
народ уже предъявляет претензии, что помощь какую им оказали на форуме, работает не так как им хочется
скоро будут требовать гарантийный срок и возврат средств за упущенную выгоду
самим подумать - религия не позволяет вероятно

kondor3000
08.09.2025, 11:04
В последней версии ST перестало работать правильно. В версии 2.10.367 правильно 85634 в версии Owen Logic2.11.368 не правильно 85635
функция Min5 должна выдавать 4, а в последней версии выдаёт 2, четвёртая наработка самая маленькая 212410, у остальных одинаковая 222410

function Min5: udint; //имя функции и тип данных выхода

var_input //объявление входных переменных
I1,I2,I3,I4, I5 : udint; //входная переменная с типом данных udint
end_var

var //объявление локальных переменных
end_var

if I1<=I2 and I1<=I3 and I1<=I4 and I1<=I5 then
Min5:=1;
elsif I2<=I1 and I2<=I3 and I2<=I4 and I2<=I5 then
Min5:=2;
elsif I3<=I1 and I3<=I2 and I3<=I4 and I3<=I5 then
Min5:=3;
elsif I4<=I1 and I4<=I2 and I4<=I3 and I4<=I5 then
Min5:=4;
elsif I5<=I1 and I5<=I2 and I5<=I3 and I5<=I4 then
Min5:=5;

end_if

end_function

FPavel
08.09.2025, 18:04
В последней версии ST перестало работать правильно. В версии 2.10.367 правильно 85634 в версии Owen Logic2.11.368 не правильно 85635
функция Min5 должна выдавать 4, а в последней версии выдаёт 2, четвёртая наработка самая маленькая 212410, у остальных одинаковая 222410

function Min5: udint; //имя функции и тип данных выхода

var_input //объявление входных переменных
I1,I2,I3,I4, I5 : udint; //входная переменная с типом данных udint
end_var

var //объявление локальных переменных
end_var

if I1<=I2 and I1<=I3 and I1<=I4 and I1<=I5 then
Min5:=1;
elsif I2<=I1 and I2<=I3 and I2<=I4 and I2<=I5 then
Min5:=2;
elsif I3<=I1 and I3<=I2 and I3<=I4 and I3<=I5 then
Min5:=3;
elsif I4<=I1 and I4<=I2 and I4<=I3 and I4<=I5 then
Min5:=4;
elsif I5<=I1 and I5<=I2 and I5<=I3 and I5<=I4 then
Min5:=5;

end_if

end_function

Собирал подобное на макросе FBD, только реализовывал, как у

тут алиса (https://alice.yandex.ru/) утверждает что кот можно доработать предлагает такой


function Min5: udint;
var_input
I1, I2, I3, I4, I5: udint;
end_var
var
min_value: udint;
min_index: udint := 1;
begin
min_value := I1;

IF I2 < min_value THEN
min_value := I2;
min_index := 2;
END_IF;

IF I3 < min_value THEN
min_value := I3;
min_index := 3;
END_IF;

IF I4 < min_value THEN
min_value := I4;
min_index := 4;
END_IF;

IF I5 < min_value THEN
min_value := I5;
min_index := 5;
END_IF;

Min5 := min_index;
end_function
вдруг её вариант будет работать во всех версиях
т.е. последовательным сравнением.

Приводить здесь не буду, т.к. исходная задача может пострадать от учёта наработки, т.к. по её условию из-за перегрева насоса требуется чередование через 10 минут.
А если какой-то насос заменят на новый с 0 минут наработки, то он первый и сломается.

Думаю, что тут будет востребован инкремент номера текущего насоса с учётом его готовности. Если не готов, то ещё прибавить 1, и опять проверить. Т.е. последовательно 4 проверки (чтобы на следующем цикле вернуться к следующему после только что остановленного).
С учётом необходимости паузы в работе насоса, каждому насосу в конце 10-минутки присваивать по таймеру признак "не готов", который сбросится через заданную паузу.

Может ещё детали по мере реализации возникнут, но это уже забота новичка, который никого не трогал и вдруг возникла задача.

Валенок
08.09.2025, 18:37
to FPavel
kondor3000'у не нужно как-то решить эту задачу. Он говорит что в прошивке ПР грубый косяк. Говорит очень обтекаемо и осторожно - типа перестало работать правильно.
Capzap выше уже сказал тоже (в другой ветке походу)
Я просто говорю как есть (чего стеснятся-то за свои деньги) - авторы прошивки 368 просрали работу со стеком для функций (во всяком случае в эмуляции). Положили параметры для функции в одном порядке, в самой функции взяли в другом. Точнее в прямом, т.к. стек - LIFO а не FIFO

Пробуйте снаружи элементарщину

function pack: udint;

var_input
b0: bool;
b1: bool;
b2: bool;
b3: bool;
end_var

u.0 := b0;
u.1 := b1;
u.2 := b2;
u.3 := b3;

end_function

FPavel
08.09.2025, 19:54
to FPavel
kondor3000'у не нужно как-то решить эту задачу. Он говорит что в прошивке ПР грубый косяк. Говорит очень обтекаемо и осторожно - типа перестало работать правильно.
Capzap выше уже сказал тоже (в другой ветке походу)
Я просто говорю как есть (чего стеснятся-то за свои деньги) - авторы прошивки 368 просрали работу со стеком для функций (во всяком случае в эмуляции). Положили параметры для функции в одном порядке, в самой функции взяли в другом. Точнее в прямом, т.к. стек - LIFO а не FIFO
Да, уже видел в соседней теме "Фичи и баги Owen Logic" аналогичное подтверждение бага.

Мне показалось, что kondor3000 проверял причины неработоспособности решения для 5 насосов и обнаружил баг.
И именно поэтому, я и не согласился с тем решением-подходом учитывать наработку. Это касается не бага Owen Logic, а самого подхода, алгоритма.

И мне не совсем понравилась реализация функции Min5 - она нерасширяемая. Гораздо удобнее её решать последовательным сравнением с каждым элементом по очереди. Но после пересмотра алгоритма управления эта функция не будет использоваться в программе, поэтому моя вкусовщина уже ни на что не влияет.

А вообще, у той программы
https://owen.ru/forum/showthread.php?t=38920&p=471287&viewfull=1#post471287
масса недочётов:
- нет обработки неисправности датчиков температуры
- нет обработки неисправности ПРМ
- нет фиксации неисправностей на триггерах до нажатия кнопки "Сброс сигнализации", что при неустойчивой неисправности будет "дёргать" насос

Валенок
09.09.2025, 09:49
Гораздо удобнее её решать последовательным сравнением с каждым элементом...
.. массива в цикле

.. эта функция не будет использоваться в программе,..
если задача - "на работу самого отдохнувшего, на отдых самого уставшего" без этой функции или по другому реализованного этого же функционала не обойтись. Если нужен простой и рабочий как молоток код.

witalexxx
09.09.2025, 12:16
Как раз и была задача на работу самого отдохнувшего и на отдых самого уставшего из пяти насосов. А по вопросу: "А вообще, у программы https://owen.ru/forum/showthread.php...l=1#post471287
масса недочётов: - нет обработки неисправности датчиков температуры, - нет обработки неисправности ПРМ, - нет фиксации неисправностей на триггерах до нажатия кнопки "Сброс сигнализации", что при неустойчивой неисправности будет "дёргать" насос".
Поясню - не было времени сделать быстро и нормально, так как по закону подлости в пятницу я добавляв в программу переменные для вывода на экран, и в пятницу (выход обновления) пришлось ехать на объект и перезаливать программу в ПР-200, и как назло, эта проблема с прошивкой, сохранял изменения в новой версии. А в субботу аварийная ситуация на объекте, насосы не ротировались, перегрев, пришлось на коленях контроль температуры делать. Вот и думай, пользоваться ли дальше такими котроллерами. Да и был баг с той прошивкой, входы DI1,2,3 вообще +24 не видели, три раза с ПР-200 пришлось питание снимать, а так совсем не управлялся, ни паузы, ни сброса, ни готовности.

witalexxx
09.09.2025, 12:27
народ уже предъявляет претензии, что помощь какую им оказали на форуме, работает не так как им хочется
скоро будут требовать гарантийный срок и возврат средств за упущенную выгоду
самим подумать - религия не позволяет вероятно

Глупости пишете, никто никаких претензий не предъявляет, осктитесь, здесь вопрос о баге и есть этому подтверждение на форуме. Вы по себе о других не судите пожалуйста и хамить последнее дело, уважаемый. У меня 42 дня все корректно было, а тут это обновление и стечение обстоятельств с его установкой.

FPavel
09.09.2025, 18:56
witalexxx, исключительно по моему мнению, нужно иначе организовывать структуру программы - изначальная проблема только в этом. Структура программы позволяет применить механистический (почти бездумный) подход к написанию почти половины программы - защиты и блокировки. А рабочие алгоритмы выполнить в конце холста. Тогда даже при неправильном алгоритме - блокировки защитят оборудование, пока программист будет судорожно исправлять и дополнять рабочую часть.

Пока готовлю статью в своём бложике. Остановился из-за того, что обновил Owen Logic до версии 2.11.368.0 (с багом в ST) - не могу откатить исходники в младшую версию, жду обновления.

Суть подхода в разделении всей системы на независимые подсистемы и их общую часть. В вашем случае будет 6 подсистем (5 насосов и общая часть). Далее, в Exel готовлю стандартные переменные (так быстрее, чем руками набирать в Owen Logic) - каждая система содержит наборы по 16 бит:
- состояние (включён, выключен, в аварии, готов к работе и пр.)
- состояние предупредительной сигнализации
- состояние защитной блокировки
- команды из вышестоящей системы (панели оператора, SCADA, OwenCloud).
Получается всего 6 подсистем х 4 набора х 16 бит = 384 переменных. Конечно же тут Exel - незаменим.
Также добавляются группы переменных:
- для обмена с экраном
- для привязки к аппаратной части ПР (состояние ПРМ, наличие связи с ПЧВ, состояние аналоговых входов)
- входы
- выходы

После этого с участием этих переменных создаётся программа - защиты и рабочие алгоритмы.

По мере набора программы выясняется какие переменные для настройки потребуются и они отдельно прописываются в файл импорта сетевых переменных.
А пока эти места пропускаются.
Настройки удобно хранить в сетевых переменных - они энергонезависимы, позволяют редактироваться и с экрана и с панели (SCADA / OwenCloud), получают начальное значение.
Также в сетевые переменные отправляются текущие состояния (измеренные температуры, давления, упакованные биты состояний-сигнализации-блокировок и пр.)

Когда вся программа готова - окончательно приводится в порядок файл импорта сетевых переменных. Exel помогает вычислить адреса и заполнить дублирующиеся поля.

Импорт сетевых переменных их расстановка по экрану.

Структура программы позволяет сразу реализовать защиты. Отрицательный эффект в появлении множества переменных, который диалектически приводит к применению Exel и в целом ускоряет работу.

Не слежу за развитием ПР200, ещё недавно для инициализации начальным значением для сетевых переменных требовались дополнительные макросы - возможно уже это улучшили.

Вчерне этот рассказ иллюстрируется тремя последовательными этапами программы-примера: 2 насоса работают на одну магистраль.
Это просто иллюстративный пример, подозреваю, что на оборудовании не заработает.


Достоинство методики, на мой (авторский) взгляд:
1 механистический подход к значительной части программы - т.е. защиты и блокировки 100% не будут пропущены из-за спешки, т.к. реализуются в самом начале
2 сама программа разделяется на почти независимые разделы, а переменные служат для связи между ними. Причём, переменные имеют одинаковый префикс и механистически только по признаку этого префикса подключаются к макросам на холсте
3 при необходимости расширения программы - переменные состояния и блокировки уже объявлены и ждут лишь переименования под ситуацию

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

85681