kondor3000 спасибо, принцип понятен. жалко, что в ST нет понятий List и Dyctionary :)
Вид для печати
kondor3000 спасибо, принцип понятен. жалко, что в ST нет понятий List и Dyctionary :)
Покажу моделирование работы каскадного регулятора с интегральным критерием
Возможно, я немного устал и не могу сосредоточиться, но толком настроить его не получилось - колеблется число работающих насосов от 0 до 5.
Не получается от того, что при накоплении интегрального критерия не учитывается наступивший перегиб на графике уровня - уровень уже снижается, но насосы выключаются (или наоборот), ощущение, что не хватает дифференциальной или пропорциональной составляющей.
Или прямых рук.
У меня в модели потребитель из резервуара с постоянной нагрузкой, а в жизни нагрузка будет меняться...
Проверял на моделях насосов и резервуара.
Модель насоса - на него подаётся питание и с небольшой задержкой он включается - замыкается допконтакт bRun. Немного времени на разгон и появляется проток bStream. Сигнал протока подаётся на модель резервуара.
Модель резервуара - не стал заморачиваться с геометрией и производительностями насосов - просто обозначил, что один работающий насос в секунду добавляет в резервуар несколько миллиметров уровня, и чем больше насосов, тем выше скорость наполнения. Насос отбора из резервуара тоже отбирает с заданной скоростью rSub.
С экрана нужно задать исправность насосов и включить алгоритм - работа начнётся.
Регулятор состоит из трёх частей:
- сам регулятор, определяющий необходимое число насосов
- диспетчер, распределяющий включения между насосами
- коммутатор, исключающий одновременную коммутацию пускателей
Сейчас уже немного устал и проверять не буду. Чуть позже займусь.
Хочу довести до ума макрос с алгоритмом https://owen.ru/forum/showthread.php...l=1#post479184
количество насосов определяется по 4 дискретным уровням (аналоговым уставкам) и на каком-то из них и уравняется баланс между притоком и оттоком воды в резервуар (+/-1 насос).
Проверю и его на модели.
Т.е. на промежуточном этапе у меня нет умиротворения от качества работы каскадного регулятора.
з.ы. мне кажется надо измерять скорость расхода воды, и исходя из этого включать необходимое количество насосов. Нет расхода, не полная емкость - оставляем один насос для докачки.
Спасибо
Сейчас, когда уже готова модель для проверки - смогу проверить разные варианты, и от kondor3000 и от Валенок.
Сейчас занят другими заданиями, сегодня вечером займусь - что-то возьму готовым, что-то создам.
Может, доработаю существующую - при росте уровня не добавлять новый насос или что-то в этом духе. Но это выглядит, как костыль, усложняющий понимание принципов работы системы.
Может и вправду, вариант kondor3000 несмотря на кажущуюся простоту - самый оптимальный - ведь точное до миллиметра поддержание на требуется, а разброс в 300 мм при уставке 8000 мм - не сильно критичен.
---------------
Я ничего не игнорировал, просто модель для проверки была готова только вчера и проверять было не на чем.
Теперь начну проверять разные варианты.
-----------------
Для каскада на основе ПИД регулятора и сетки выбора количества насосов, как понимаю пропуски в интервалах выбора case - это реализация гистерезиса для борьбы с частыми переключениями
------------------Код:case real_to_udint(rPID) of
0..13: need := 0;
18..31: need := 1;
36..49: need := 2;
54..67: need := 3;
72..84: need := 4;
88..100: need := 5;
end_case
Проверил вариант, предложенный kondor3000 - в части оценки количества требуемых насосов. Получилось довольно хорошо.
Задал сетку уставок. Переключение (+1 или -1) числа требуемых насосов выполняется на следующей уставке, а не на той, которая вызвала крайнее переключение - подобие гистерезиса.
В моей модели повезло с подбором сетки - баланс наступает точно на задании регулятора, но это случайность - в общем случае ожидал где-то внутри сетки :)
Гистерезис организовал по следующему алгоритму:
- пусть в диапазоне между двумя уставками переключения возможно два значения требуемых насосов, в зависимости от того, снижается или повышается уровень - (nMin) и (nMin+1)
- для измеренного уровня и заданной сетки определяю минимальное значение возможных насосов (nMin)
- если на предыдущем цикле запрашивалось меньше nMin, то настал час увеличить до этого минимума
- если на предыдущем цикле запрашивалось больше (nMin+1), то снижаем аппетиты до этого (nMin+1)
Наверное, можно получить гибрид таких подходов к гистерезису при использованию ПИД - при изменении диапазона переключать или не переключать количество в зависимости от направления изменения выхода ПИД.Код:// число агрегатов в диапазоне нахождения измеренного значения уровня
// равно nMin или nMin+1 в зависимости от того снижается уровень или растёт
// Поэтому, если уровень снижается и теперь нужно больше агрегатов (nAmount < nMin),
// то повышаем их запрашиваемое количество.
// Если уровень вырос и агрегатов требуется меньше (nAmount > nMin + 1),
// то понижаем их запрашиваемое количество
IF nAmount < nMin THEN
// если реально включено меньше, то требуем не меньше минимального
nAmount := nMin;
ELSIF nAmount > nMin + 1 THEN
// если уровень поднялся и стало требоваться меньше агрегатов, то на один снижаем
nAmount := nMin + 1;
END_IF
А может и не стОит... :)
Склоняюсь остановить выбор на "сетке уставок", как на близком к ПИД (вернее, П без ИД - отсюда и статическая ошибка регулирования), но простом в пояснении для эксплуатации.
Спасибо большое за помощь в выборе алгоритма!
Нашёл ошибку - не обрабатывалась ситуация отключения всех насосов при превышении верхнего рабочего уровня.
Теперь уже точно всё
Во время ПНР обнаружилась ошибка при формировании сигналов включения насосов - реальная программа была сложнее, позволяла включать часть насосов вручную, а часть в автоматическом режиме, и из-за этого в ФБ Dispatcher_ формировалась неправильная последовательность включений и выключений.
Изначальная задумка была в том, чтобы при таким смешанном режиме за счёт управляемых насосов поддерживать требуемое количество, независимо от количества насосов, включённых вручную.
Но где-то ошибся в условии выбора и при недостатке времени принял решение отказаться от этого улучшения.
Исправленный вариант прикрепляю к сообщению