1 Проект 1.jpg 1 Проект 2.jpg
Сразу видно, мои проекты даже не смотрели, всё подписано как на схеме, так и в ФБ.
1 Проект 1.jpg 1 Проект 2.jpg
Сразу видно, мои проекты даже не смотрели, всё подписано как на схеме, так и в ФБ.
Последний раз редактировалось kondor3000; 02.02.2026 в 21:20.
Ещё раз благодарю всех, откликнувшихся на просьбу о помощи
Я - пошутил, рассыпухой, а не битовыми масками уже решал задачу ротации с приоритетным выбором по наработке, а не просто по очереди, поэтому хоть и не все детали, но общий смысл понимаю в схеме AI!
Если серьёзно, именно эта схема получается нерасширяемой - к ней нет пояснений с выводом формул (можно вывести самостоятельно - но терять время), также холст плотно заполнен, из-за этого встраивать приоритеты ротации будет труднее, чем создание с нуля - сначала вывести формулы, расчистить холст, добавить расширение функционала.
Правда, сделать самому, хоть и не с таким мастерством битовых трюков - быстрее. А в моём случае - просто достать из предыдущей работы.
Как урок мастерства - интересно. Запомню приём и при необходимости его применю. Пример уже будет.
Спасибо.
Внимательно читал и именно этот пример. В сообщении выше разбирал его работу.
В собственном тестовом примере реализовал его каскадный регулятор с учётом аналогового датчика и количества насосов. Не совсем разобрался с дискретными уровнями и непривычными битовыми трюками, но, показалось, что идею понял - по мере роста уровня на заданных отметках последовательно отключаются насосы.
Достоинства - простота в понимании принципа работы для наладчика и эксплуатации. Главное объяснить, что баланс наступит на одном из назначенных уровней переключения, а не на каком-то конкретном.
Недостаток - при включении на пустой резервуар сразу включает все доступные насосы, что можно компенсировать следующим ФБ, ограничивающим одновременную коммутацию. А также требуется отдельная задержка при смене количества насосов - чтобы избежать возможного частого "тактирования".
Вот блок ротации просмотрел несколько бегло. Он сделан универсально, но циклов много - ощущение, что часть можно заменить однопроходными алгоритмами, усложняя условия проверки. А для ничтожного количества - (до 5) циклы можно развернуть и решение получится довольно простым и наглядным даже на FBD. Это причины беглого осмотра макроса, хотя просмотрел его полностью и комментарии прочитал.
Недавно готовил документацию на библиотеку коллег в CODESYS 3.5 - там был подобный блок ротации и АВР на открытых массивах array[*] для безграничного числа насосов - мне кажется, он содержал всего 3 цикла.
Наверное, не буду жадничать и на выходных подготовлю и опубликую свою ротацию на небольшое число насосов - не универсальный, а под конкретное количество. Заказчик потребовал отказа от ротации в работе (только при пуске учитывать наработку) и проверить макрос на практике я не смог, только в эмуляции, но думаю, он рабочий.
----------------------------------
От себя добавлю, делая небольшие утилиты в Pascal (FreePascal), использовал автоформаттер исходного кода JCF. Поэтому, после начала работы с ST начал искать подобный инструмент - он существует, но только в виде двух вариантов расширений к VSCode - после установки VSCode нужно зайти в магазин расширений и найти искомое. Ему во всём далеко до AStyle и JCF, есть глюки - комментарии автодокументирования "///" разделяет пробелом "/ //", но код читать легче.
Коллеги, делясь кодом с другими - прогоняйте его через автоформаттер! да и просто придерживайтесь аккуратного оформления.
Мне нравится один из форумов по программированию в рунете - если кто-то "приволакивает" интересную задачку, то люди решают её и объективно критикуют чужие решения (иной раз и излишне резко), все учатся.
Здесь из-за профессиональной среды, нет разборов решений, только предложения собственных выстраданных решений.
Надеюсь, что попытками взвесить достоинства и недостатки предложенных решений никого не обидел.
Хорошее сравнение
У меня 3 цикла и кол-во насосов тоже любое. Но у них всего 3 цикла (но это не точно), а тут целых 3 цикла. У них массивы +, а у других минус.
Не считая того, что в Cоdesys в 100 раз больше возможностей, а тут надо выносить всё наружу для сохранения, границы массивов переменной не задать.
И сравнивать Cоdesys с Лоджиком как минимум некорректно.
По поводу разборов решений, если есть интересный вопрос, народ включается, только таких вопросов всё меньше с каждым годом.
А больше достают пустомели, которые даже не вникнув (прочитав часть последнего поста или вырвав из контекста кусок), пишут всякую муть.
Последний раз редактировалось kondor3000; 03.02.2026 в 08:57.
Да. У вас всего там 3 входа, битовыми масками управлять не сложно.
Задали количество и маску насосов.
По аварии меняется маска. Все остальное делает макрос.
kondor3000 а где можно задать границы массивов? в смысле вы про на лету поменять границы или о чем тут ?
В Cоdesys можно написать nasos : ARRAY[1..nam] OF BOOL; // кол-во насосов , где nam задать равным 2,3,4,5 или 8 или 12
а в Ложике только nasos : ARRAY[0..4] OF BOOL; // кол-во насосов и менять всё вручную, например у меня надо исправить в 5 местах.
Чтобы сохранить наработку в Лоджике, её надо вывести на выход и на вход ФБ, а в Cоdesys только присвоить в глобальные и RETAIN.
Это усложняет все ФБ наработки, основной ФБ и кол-во входов-выходов, кратно от кол-ва насосов.
Последний раз редактировалось kondor3000; 03.02.2026 в 10:02.
В CODESYS 3.5 можно сделать открытый массив (в терминах привычного мне Pascal)
А при обращении к ФБ дать ему массив с твёрдо заданными границами.Код:var_input или var_in_out abMyArray: array[*] of bool;
Внутри ФБ диапазон индексов для цикла уточняется при помощи функций - LOWER_BOUND(abMyArray, 1) и UPPER_BOUND(abMyArray, 1), где 1 - это номер интересующей размерности массива (от 1), для матрицы нужно было бы использовать и 1 и 2.
Таким образом получается достаточно универсальный ФБ.
Последний раз редактировалось FPavel; 03.02.2026 в 17:55.
ARRAY[1..nam] но я так понимаю, что вы даете ему границы в рамках запуска программы? То есть при инициализации этого массива, так ведь?
Если проще - можно сделать так: array[5] а потом записать в него 6-ю переменную и он сам увеличится? или все же надо объявить новый, скопировать из старого и добавить эту 6-ю переменную?
просто сам увеличивается насколько понял только в javascript, везде нужно делать resize
Последний раз редактировалось kondor3000; 04.02.2026 в 09:53.
kondor3000 спасибо, принцип понятен. жалко, что в ST нет понятий List и Dyctionary![]()