Сообщение от
Салихов Ильдар
Добрый день!
Есть термостол. Регулирую температуру через библиотеку OSCAT PID -регулятор. Тут вопросов нет. А кто подскажет как можно реализовать еще и регулирование скорости изменения температуры? Т.е. задаем как температуру регулирования, так и скорость изменения этой температуры (град/сек). Пока, что пришло в голову - это использование P-регулятора с изменяемым коэффициентом P в зависимости от скорости изменения температуры...
Спасибо..
Добрый день, Ильдар.
Если я правильно понял задачу, то Вам необходимо плавно изменять уставку ПИД-регулятора от У1 до У2 в течение некоторого времени.
В таком случае Вам подойдет ФБ LIN_TRAFO из библиотеки Util.lib
Интерфейс ФБ выглядит так:
LIN_TRAFO.png
Для описанной выше задачи понадобится на входы IN_*** привязать все, что связано со временем, а на входы OUT_** все, что связано с уставкой.
Т.е.
IN_MIN - 0,
IN_MAX - время за которое уставка должна достичь максимума;
IN - время, прошедшее со старта изменения уставки
OUT_MIN - стартовое значение уставки (У1);
OUT_MAX - целевое значение уставки (У2);
Выход ERROR будет равен TRUE, если Вы задали нулевое время роста уставки или значение на входе IN выходит за диапазон IN_MIN .. IN_MAX.
А на выходе OUT будет содержаться текущее значение уставки.
Но хватит слов. Перейдем к делу:
Предположим есть 3 входных значения значения:
Код:
rStartValue : REAL; (* Стартовое значение параметра *)
rDesiredValue : REAL; (* Целевое значение параметра *)
timDesiredPeriod : TIME; (* Время, за которое должен измениться параметр *)
и выходное
Код:
rCurrent : REAL; (* Текущее значение параметра *)
Время старта хранится в переменной
Код:
m_timStartTime : TIME;
В таком случае расчет текущего значения параметра будет выглядеть так:
Код:
m_timExecutingBy := TIME() - m_timStartTime;
m_fb_CurrentValueCalc.IN := TIME_TO_REAL (m_timExecutingBy);
m_fb_CurrentValueCalc.IN_MIN := 0.0;
m_fb_CurrentValueCalc.IN_MAX := TIME_TO_REAL (timDesiredPeriod);
m_fb_CurrentValueCalc.OUT_MIN := m_rStartValue;
m_fb_CurrentValueCalc.OUT_MAX := m_rEndValue;
m_fb_CurrentValueCalc();
rCurrent := m_fb_CurrentValueCalc.OUT;
В приложении проект с реализованным ФБ SmoothValueChange на основе модели поведения Etrig (п. 5.1).
Чтобы использовать в своем проекте:
1) Перенесите типы данных ERRORS и STATE со вкладки "Data types" в свой проект;
2) Перенесите ФБ SmoothValueChange в свой проект;
3) Объявите экземпляр ФБ SmoothValueChange;
4) Задайте значения входов в соответствии с их назначением;
5) По переднему фронту xExecute ФБ начнет плавное изменение параметра;
6) Добавьте в проект библиотеку Util.lib (если она еще не добавлена);
7) Выход "rCurrent" экземпляра ФБ SmoothValueChange подайте на вход "уставка" ПИД-регулятора.
Обратите внимание, что возможности прервать работу ФБ в такой реализации нет. Если она будет нужна - Вам понадобиться в соответствии с п. 5.2 документа выше добавить вход "xAbort".