В этом примере показано, как использовать Toolbox™ системы управления для настройки цифровой системы управления движением.
Рассматриваемая система движения показана ниже.

Рис. 1: Аппаратные средства цифрового управления движением
Это устройство может быть частью какой-то производственной машины и предназначено для перемещения некоторой нагрузки (захват, инструмент, насадка или что-либо еще, что вы можете себе представить) из одного углового положения в другое и обратно. Эта задача является частью «производственного цикла», который должен быть выполнен для создания каждого продукта или партии продуктов.
Цифровой контроллер должен быть настроен на максимальную скорость производства машины без ущерба для точности и качества продукции. Для этого сначала моделируем систему управления в Simulink с помощью модели инерции и гибкого вала 4-го порядка:
open_system('rct_dmc')

«Настраиваемый цифровой контроллер» состоит из последовательного усиления с контроллером опережения/запаздывания.

Рис. 2: Цифровой контроллер
Тюнинг осложняется наличием на заводе гибкого режима вблизи 350 рад/с:
G = linearize('rct_dmc','rct_dmc/Plant Model'); bode(G,{10,1e4}), grid

Мы ищем 0,5-секундное время отклика на команду шага в угловом положении с минимальным превышением. Это соответствует целевой полосе пропускания приблизительно 5 рад/с. looptune команда предлагает удобный способ настройки компенсаторов фиксированной структуры, как в данном приложении. Использовать looptune, сначала создать экземпляр slTuner для автоматического получения управляющей структуры от Simulink. Обратите внимание, что интересующие сигналы уже помечены как точки линейного анализа в модели Simulink.
ST0 = slTuner('rct_dmc',{'Gain','Leadlag'});
Следующее использование looptune для настройки параметров компенсатора на частоту перехода целевого коэффициента усиления 5 рад/с:
Measurement = 'Measured Position'; % controller input Control = 'Leadlag'; % controller output ST1 = looptune(ST0,Control,Measurement,5);
Final: Peak gain = 0.979, Iterations = 19 Achieved target gain value TargetGain=1.
Конечное значение ниже или около 1 указывает на успех. Проверьте настроенные значения фильтра усиления и опережения/запаздывания:
showTunable(ST1)
Block 1: rct_dmc/Tunable Digital Controller/Gain =
D =
u1
y1 1.869e-05
Name: Gain
Static gain.
-----------------------------------
Block 2: rct_dmc/Tunable Digital Controller/Leadlag =
3.855 s + 6.322
---------------
s + 13.35
Name: Leadlag
Continuous-time transfer function.
Для проверки конструкции используйте slTuner интерфейс для быстрого доступа к интересующим функциям передачи с замкнутым контуром и сравнения ответов до и после настройки.
T0 = getIOTransfer(ST0,'Reference','Measured Position'); T1 = getIOTransfer(ST1,'Reference','Measured Position'); step(T0,T1), grid legend('Original','Tuned')

Настроенный отклик имеет значительно меньшее превышение и удовлетворяет требованию времени отклика. Однако эти моделирования получаются с использованием компенсатора непрерывного времени опережения/запаздывания (looptune работает в непрерывном режиме), поэтому нам необходимо дополнительно проверить дизайн в Simulink, используя цифровую реализацию компенсатора опережения/запаздывания. Использовать writeBlockValue применение настроенных значений к модели Simulink и автоматическая дискретизация компенсатора опережения/запаздывания для скорости, указанной в Simulink.
writeBlockValue(ST1)
Теперь вы можете смоделировать реакцию завода непрерывного времени с помощью цифрового контроллера:
sim('rct_dmc'); % angular position logged in "yout" variable t = yout.time; y = yout.signals.values; step(T1), hold, plot(t,y,'r--') legend('Continuous','Hybrid (Simulink)')
Current plot held

Моделирование близко совпадает, и коэффициенты цифрового опережения/запаздывания могут быть считаны из блока «Leadlag» в Simulink.
Затем попробуйте увеличить полосу пропускания управления с 5 до 50 рад/с. Из-за резонанса установки около 350 рад/с компенсатор опережения/запаздывания больше не достаточен для получения достаточного запаса устойчивости и небольшого перепуска. Одно из средств состоит в добавлении фильтра выемки, как показано на фиг.3.

Рис. 3: Цифровой контроллер с фильтром пробок
Чтобы настроить эту измененную архитектуру управления, создайте slTuner экземпляр с тремя настраиваемыми блоками.
ST0 = slTuner('rct_dmcNotch',{'Gain','Leadlag','Notch'});
По умолчанию блок «Пробка» параметризуется как любая передаточная функция второго порядка. Для сохранения структуры вырубки

укажите коэффициенты как
реальные параметры и создайте параметрическую модель N передаточной функции, показанной выше:
wn = realp('wn',300); zeta1 = realp('zeta1',1); zeta2 = realp('zeta2',1); zeta1.Minimum = 0; zeta1.Maximum = 1; % 0 <= zeta1 <= 1 zeta2.Minimum = 0; zeta2.Maximum = 1; % 0 <= zeta2 <= 1 N = tf([1 2*zeta1*wn wn^2],[1 2*zeta2*wn wn^2]); % tunable notch filter
Затем свяжите эту параметрическую модель вырубки с блоком «Вырубка» в модели Simulink. Поскольку система управления настроена за непрерывное время, можно использовать непрерывную параметризацию фильтра выемки, даже если сам блок «Выемка» является дискретным.
setBlockParam(ST0,'Notch',N);
Следующее использование looptune совместно настраивать блоки «Gain», «Leadlag» и «Notch» с целевой частотой пересечения 50 рад/с. Для устранения остаточных колебаний от резонанса установки укажите целевую форму петли со скатыванием -40 дБ/декада за 50 рад/с.
% Specify target loop shape with a few frequency points Freqs = [5 50 500]; Gains = [10 1 0.01]; TLS = TuningGoal.LoopShape('Notch',frd(Gains,Freqs)); Measurement = 'Measured Position'; % controller input Control = 'Notch'; % controller output ST2 = looptune(ST0,Control,Measurement,TLS);
Final: Peak gain = 1.05, Iterations = 60
Конечный коэффициент усиления близок к 1, что указывает на выполнение всех требований. Сравните отклик шага с замкнутым контуром с предыдущими конструкциями.
T2 = getIOTransfer(ST2,'Reference','Measured Position'); clf step(T0,T1,T2,1.5), grid legend('Original','Lead/lag','Lead/lag + notch')

Чтобы убедиться, что фильтр надрезов работает так, как ожидалось, оцените суммарный компенсатор C и отклик с разомкнутым контуром L и сравнить ответы Боде G, C, L:
% Get tuned block values (in the order blocks are listed in ST2.TunedBlocks) [g,LL,N] = getBlockValue(ST2,'Gain','Leadlag','Notch'); C = N * LL * g; L = getLoopTransfer(ST2,'Notch',-1); bode(G,C,L,{1e1,1e3}), grid legend('G','C','L')

Этот сюжет Боде подтверждает, что резонанс растения был правильно «вырезан».
Снова использовать writeBlockValue для дискретизации настроенных фильтров опережения/запаздывания и пробки и записи их значений обратно в Simulink. Сравните ответы MATLAB и Simulink:
writeBlockValue(ST2) sim('rct_dmcNotch'); t = yout.time; y = yout.signals.values; step(T2), hold, plot(t,y,'r--') legend('Continuous','Hybrid (Simulink)')
Current plot held

Реакция Simulink демонстрирует небольшие остаточные колебания. Дискретизация фильтра надрезов является вероятной причиной, поскольку частота надрезов близка к частоте Найквиста. pi/0.002=1570 рад/с. По умолчанию вырубка дискретизируется с помощью метода ZOH. Сравните это с методом Тастина, предварительно прорабатываемым на частоте пробки:
wn = damp(N); % natural frequency of the notch filter Ts = 0.002; % sample time of discrete notch filter Nd1 = c2d(N,Ts,'zoh'); Nd2 = c2d(N,Ts,'tustin',c2dOptions('PrewarpFrequency',wn(1))); clf, bode(N,Nd1,Nd2) legend('Continuous','Discretized with ZOH','Discretized with Tustin',... 'Location','NorthWest')

Метод ZOH имеет значительное искажение, и вместо него следует использовать предварительно обработанный Tustin. Для этого укажите требуемый способ преобразования скорости для блока фильтра пробок:
setBlockRateConversion(ST2,'Notch','tustin',wn(1)) writeBlockValue(ST2)
writeBlockValue теперь использует Tustin, предварительно прореженный на частоте выемки, для дискретизации фильтра выемки и записи его обратно в Simulink. Убедитесь, что это устраняет колебания.
sim('rct_dmcNotch'); t = yout.time; y = yout.signals.values; step(T2), hold, plot(t,y,'r--') legend('Continuous','Hybrid (Simulink)')
Current plot held

В качестве альтернативы можно настроить контроллер непосредственно за дискретное время, чтобы избежать проблем дискретизации с фильтром надрезов. Для этого укажите, что модель Simulink должна быть линеаризована и настроена при времени выборки контроллера 0,002 секунды:
ST0 = slTuner('rct_dmcNotch',{'Gain','Leadlag','Notch'}); ST0.Ts = 0.002;
Для предотвращения управления с высоким коэффициентом усиления и насыщения добавьте требование, ограничивающее коэффициент усиления от опорного до управляющего сигнала (выход блока Notch).
GL = TuningGoal.Gain('Reference','Notch',0.01);
Теперь повторно запустите контроллер с заданной частотой дискретизации и проверьте настроенные отклики с разомкнутым и замкнутым контуром.
ST2 = looptune(ST0,Control,Measurement,TLS,GL); % Closed-loop responses T2 = getIOTransfer(ST2,'Reference','Measured Position'); clf step(T0,T1,T2,1.5), grid legend('Original','Lead/lag','Lead/lag + notch')
Final: Peak gain = 1.04, Iterations = 38

% Open-loop responses [g,LL,N] = getBlockValue(ST2,'Gain','Leadlag','Notch'); C = N * LL * g; L = getLoopTransfer(ST2,'Notch',-1); bode(G,C,L,{1e1,2e3}), grid legend('G','C','L')

Результаты аналогичны полученным при настройке контроллера в непрерывное время. Теперь проверьте цифровой контроллер по заводу постоянного времени в Simulink.
writeBlockValue(ST2) sim('rct_dmcNotch'); t = yout.time; y = yout.signals.values; step(T2), hold, plot(t,y,'r--') legend('Discrete','Hybrid (Simulink)')
Current plot held

На этот раз гибридный отклик близко соответствует его дискретно-временной аппроксимации, и дальнейшая регулировка фильтра выемки не требуется.
looptune (slTuner)(Проект управления Simulink)