Несколько точек проекта в интерфейсе slTuner

Для настройки запланированной на усиление системы управления необходимо заставить модель Simulink® линеаризовать к массиву моделей LTI, соответствующих различным условиям работы, которые являются точками проекта. Таким образом, после того, как вы получаете семейство линейных моделей объекта управления, как описано в Моделях объекта управления для Запланированного на усиление диспетчера Тунинга, необходимо сопоставить его с интерфейсом slTuner к модели Simulink. Для этого вы используете замену блока, чтобы вызвать замену slTuner подсистема объекта модели с массивом линейных моделей. Этот процесс создает семейство настраиваемых моделей с обратной связью в интерфейсе slTuner.

Блокируйте замену на объект

Предположим, что у вас есть массив линейных моделей объекта управления, полученных в каждой рабочей точке в вашей сетке проекта. В самом прямом случае отвечают следующим условиям:

  • Линейные модели в массиве соответствуют точно подсистеме объекта в вашей модели.

  • Кроме элементов вы хотите настроиться, ничто иное в модели не меняется в зависимости от переменных планирования.

Для модели Simulink mdl, содержащий подсистему объекта G и линейный образцовый массив, Garr, который представляет объект в сетке точек проекта, следующие команды, создает интерфейс slTuner:

BlockSubs = struct('Name','mdl/G','Value',Garr);
st0 = slTuner('mdl',{'Kp','Ki'},BlockSubs);

st0 содержит семейство линейных моделей с обратной связью, каждый линеаризовавший в точке проекта и каждом с соответствующим линейным объектом, вставленным для G. Если 'Kp' и 'Ki' являются расписаниями усиления, вы хотите настроиться (такие как интерполяционные таблицы), можно параметризовать их с настраиваемыми поверхностями усиления, как описано в Параметризовали Расписания Усиления и настраивают их.

Несколько замен блока

В других случаях линеаризовавший массив моделей объекта управления, которые вы имеете, не может соответствовать точно подсистеме объекта в вашей модели Simulink. Или, вы можете должны быть заменить другие части модели, которые меняются в зависимости от условий работы. В таких случаях больше ухода необходимо в построении правильной замены блока. Следующие разделы подсвечивают несколько таких случаев.

Например, рассмотрите модель следующего рисунка.

Эта модель имеет внутренний цикл с пропорционально-единственным запланированным на усиление контроллером. Контроллер представлен интерполяционной таблицей Kp_in и блок prod продукта. Внешний цикл включает контроллер PI с запланированными на усиление пропорциональными и интегральными коэффициентами, представленными интерполяционными таблицами Kp и Ki. Все расписания усиления зависят от той же переменной alpha планирования.

Предположим, что вы хотите настроиться, усиление внутреннего цикла планируют Kp_in с открытым внешним циклом. С этой целью вы получаете массив линейных моделей G_in от входа u до выходных параметров {q,alpha}. Этот образцовый массив имеет неправильные размерности ввода-вывода, чтобы использовать в качестве замены блока на G. Поэтому необходимо "заполнить" G_in дополнительной выходной размерностью.

Garr = [0; G_in];
BlockSubs1 = struct('Name','mdl/G','Value',Garr);

Кроме того, можно удалить весь эффект внешнего цикла, заменив блок Varying PID Controller на систему, которая линеаризует, чтобы обнулить во всех условиях работы. Поскольку этот блок имеет три входных параметров, замените его на нулевую систему с одним выходом, с 3 входами.

BlockSubs2 = struct('Name','mdl/Varying PID Controller','Value',ss([0 0 0]));

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

st0 = slTuner('mdl','Kp_in');
st0.BlockSubstitutions = [BlockSubs1; BlockSubs2];

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

Замена Блокируется, которые Зависят от Переменных Планирования

Затем, предположите, что вы уже настроили расписание усиления внутреннего цикла и получили массив Kp_in_tuned значений Kp_in, которые соответствуют каждой точке проекта (каждое значение alpha, в котором вы линеаризовали объект). Предположим также, что у вас есть новый Garr, который является полным объектом от u до {y,q,alpha}, линеаризовавшего с настроенным замкнутым внутренним кругом. Чтобы настроить внешний цикл получают расписания, необходимо заменить блок продукта на массив Kp_in_tuned. Важно отметить, что вы заменяете инжекционную точку, блок prod продукта, а не интерполяционную таблицу Kp_in. Заменение блока продукта эффективно преобразовывает его в переменное усиление. Кроме того, необходимо обнулить первый вход блока продукта, чтобы удалить эффект интерполяционной таблицы Kp_in.

prodsub = [0 ss(Kp_in_tuned)];
BlockSubs1 = struct('Name','mdl/prod','Value',prodsub);
BlockSubs2 = struct('Name','mdl/G','Value',Garr);

st0 = slTuner('mdl',{'Kp','Ki'});
st0.BlockSubstitutions = [BlockSubs1; BlockSubs2];
Для другого примера, который показывает этот вид замены на ранее настроенную интерполяционную таблицу, смотрите Управление ориентацией в автопилоте HL-20 - Проект SISO.

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

Чтобы гарантировать, что slTuner линеаризует этот блок правильно во всех значениях alpha в сетке проекта, необходимо заменить его массивом линейных моделей, один для каждого значения alpha. Этот блок эквивалентен отправке u через усиление 1/alpha:

Поэтому можно использовать следующую замену блока в интерфейсе slTuner, где alphagrid является массивом значений alpha в точках проекта.

divsub = ss[(1/alphagrid), 0]
BlockSubs = struct('Name','mdl/div-by-alpha','Value',divsub);
st0.BlockSubstitutions = [st0.BlockSubstitutions; BlockSubs]

Каждая запись в образцовом массиве divsub делит свой первый вход на соответствующую запись в alphagrid и нули его второй вход. Таким образом эта замена дает желаемому результату y = u/alpha.

Решение Несоответствий Между Блоком и его Заменой

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

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

Gsub = Garr*[1/3 1/3 1/3];
BlockSubs = struct('Name','mdl/G_full','Value',Gsub);

Иногда, можно разрешить несоответствие в размерностях ввода-вывода путем дополнения вводов или выводов нулями, как показано в Нескольких Заменах Блока. Во все еще других случаях вы можете должны быть выполнить другую образцовую арифметику, с помощью команд как series, feedback или connect, чтобы создать подходящую замену.

Блокируйте замену на блоки LPV

Если объект в вашей модели Simulink представлен Системой LPV, необходимо все еще выполнить замену блока при создании интерфейса slTuner для настройки расписаний усиления. slTuner не может считать линейный образцовый массив непосредственно из блока LPV System. Однако можно использовать линейный образцовый массив, заданный в блоке для замены блока, если это соответствует точкам проекта, для которых вы настраиваетесь. Например, предположите, что ваш объект является блоком LPV System, LPVPlant, который задает образцовый массив PlantArray. Можно сконфигурировать замену блока на LPVPlant можно следующим образом:

BlockSubs = struct('Name','mdl/LPVPlant','Value',PlantArray);

Смотрите также

Похожие темы