Robust Control Toolbox 

This example uses systune to design and tune a MIMO controller for a Diesel engine. The controller is tuned in discrete time for a single operating condition.
On this page… 

Tuning of Blackbox MIMO Controller 
Modern Diesel engines use a variable geometry turbocharger (VGT) and exhaust gas recirculation (EGR) to reduce emissions. Tight control of the VGT boost pressure and EGR massflow is necessary to meet strict emission targets. This example shows how to design and tune a MIMO controller that regulates these two variables when the engine operates at 2100 rpm with a fuel mass of 12 mg per injectioncylinder.
open_system('rct_diesel')
The VGT/EGR control system is modeled in Simulink. The controller adjusts the positions EGRLIFT and VGTPOS of the EGR and VGT valves. It has access to the boost pressure and EGR massflow targets and measured values, as well as fuel mass and engine speed measurements. Both valves have rate and saturation limits. The plant model is sampled every 0.1 seconds and the control signals EGRLIFT and VGTPOS are refreshed every 0.2 seconds. This example considers step changes of +10 KPa in boost pressure and +3 g/s in EGR massflow, and disturbances of +5 mg in fuel mass and 200 rpm in speed.
For the operating condition under consideration, we used System Identification to derive a linear model of the engine from experimental data. The frequency response from the manipulated variables EGRLIFT and VGTPOS to the controlled variables BOOST and EGR MF appears below. Note that the plant is ill conditioned at low frequency which makes independent control of boost pressure and EGR massflow difficult.
sigma(Plant(:,1:2)), grid
title('Frequency response of the linearized engine dynamics')
There are two main control objectives:
Respond to step changes in boost pressure and EGR massflow in about 5 seconds with minimum crosscoupling
Be insensitive to (small) variations in speed and fuel mass.
Use a tracking requirement for the first objective. Specify the amplitudes of the step changes to ensure that crosscouplings are small relative to these changes.
% 5second response time, steadystate error less than 5% TR = TuningGoal.Tracking({'BOOST REF';'EGRMF REF'},{'BOOST';'EGRMF'},5,5e2); TR.Name = 'Setpoint tracking'; TR.InputScaling = [10 3];
For the second objective, treat speed and fuel mass as disturbances and require that the sensitivity to these disturbances be small at low frequency and gradually increase as we approach the control bandwidth. Specify the signal amplitudes to properly reflect the relative contribution of each disturbance.
s = tf('s'); DR = TuningGoal.Gain({'FUELMASS';'SPEED'},{'BOOST';'EGRMF'},0.2*s/(s+0.05)); DR.Name = 'Rejection'; DR.InputScaling = [5 200]; DR.OutputScaling = [10 3]; viewSpec(DR)
To provide adequate robustness to unmodeled dynamics and aliasing, limit the control bandwidth and impose sufficient stability margins at both the plant inputs and outputs. Because we are dealing with a 2by2 MIMO feedback loops, these stability margins are interpreted as disk margins (see loopmargin and TuningGoal.Margins for details).
% Roll off of 20 dB/dec past 1 rad/s RO = TuningGoal.MaxLoopGain({'EGRLIFT','VGTPOS'},1,1); RO.LoopScaling = 'off'; RO.Name = 'Rolloff'; % 7 dB of gain margin and 45 degrees of phase margin M1 = TuningGoal.Margins({'EGRLIFT','VGTPOS'},7,45); M1.Name = 'Plant input'; M2 = TuningGoal.Margins('DIESEL ENGINE',7,45); M2.Name = 'Plant output';
Tuning of Blackbox MIMO Controller
Without apriori knowledge of a suitable control structure, first try "blackbox" statespace controllers of various orders. The plant model has four states, so try a controller of order four or less. Here we tune a secondorder controller since the "SS2" block in the Simulink model has two states.
Figure 1: Secondorder blackbox controller.
Use the slTuner interface to configure the Simulink model for tuning. Mark the block "SS2" as tunable, register the locations where to assess margins and loop shapes, and specify that linearization and tuning should be performed at the controller sampling rate.
ST0 = slTuner('rct_diesel','SS2'); ST0.Ts = 0.2; addPoint(ST0,{'EGRLIFT','VGTPOS','DIESEL ENGINE'})
Now use systune to tune the statespace controller subject to our control objectives. Treat the stability margins and rolloff target as hard constraints and try to best meet the remaining objectives (soft goals). Randomize the starting point to reduce exposure to undesirable local minima.
Opt = systuneOptions('RandomStart',2);
rng(0), [ST1,~,~,Info1] = systune(ST0,[TR DR],[M1 M2 RO],Opt);
Final: Soft = 1.08, Hard = 0.87819, Iterations = 580 Final: Soft = 1.05, Hard = 0.97739, Iterations = 454 Final: Soft = 1.05, Hard = 0.9623, Iterations = 521
All requirements are nearly met (a requirement is satisfied when its normalized value is less than 1). Verify this graphically.
viewSpec([TR DR RO M1 M2],ST1,Info1)
Plot the setpoint tracking and disturbance rejection responses. Scale by the signal amplitudes to show normalized effects (boost pressure changes by +10 KPa, EGR massflow by +3 g/s, fuel mass by +5 mg, and speed by 200 rpm).
clf T1 = getIOTransfer(ST1,{'BOOST REF';'EGRMF REF'},{'BOOST','EGRMF','EGRLIFT','VGTPOS'}); T1 = diag([1/10 1/3 1 1]) * T1 * diag([10 3]); subplot(211), step(T1(1:2,:),20), title('Setpoint tracking') subplot(212), step(T1(3:4,:),20), title('Control effort')
D1 = getIOTransfer(ST1,{'FUELMASS';'SPEED'},{'BOOST','EGRMF','EGRLIFT','VGTPOS'}); D1 = diag([1/10 1/3 1 1]) * D1 * diag([5 200]); subplot(211), step(D1(1:2,:),20), title('Disturbance rejection') subplot(212), step(D1(3:4,:),20), title('Control effort')
The controller responds in less than 5 seconds with minimum crosscoupling between the BOOST and EGRMF variables.
Tuning of Simplified Control Structure
The statespace controller could be implemented as is, but it is often desirable to boil it down to a simpler, more familiar structure. To do this, get the tuned controller and inspect its frequency response
C = getBlockValue(ST1,'SS2'); clf bode(C(:,1:2),C(:,3:4),{.02 20}), grid legend('REF to U','Y to U')
bodemag(C(:,5:6)), grid
title('Bode response from FUELMASS/SPEED to EGRLIFT/VGTPOS')
The first plot suggests that the controller essentially behaves like a PI controller acting on REFY (the difference between the target and actual values of the controlled variables). The second plot suggests that the transfer from measured disturbance to manipulated variables could be replaced by a simple gain. Altogether this suggests the following simplified control structure consisting of a MIMO PI controller with a disturbance feedforward gain.
Figure 2: Simplified control structure.
Using variant subsystems, you can implement both control structures in the same Simulink model and use a variable to switch between them. Here setting MODE=2 selects the MIMO PI structure. Again use systune to tune the three 2by2 gain matrices Kp, Ki, Kff in the simplified control structure.
% Select "MIMO PI" variant in "CONTROLLER" block MODE = 2; % Configure tuning interface ST0 = slTuner('rct_diesel',{'Kp','Ki','Kff'}); ST0.Ts = 0.2; addPoint(ST0,{'EGRLIFT','VGTPOS','DIESEL ENGINE'}) % Tune MIMO PI controller. [ST2,~,~,Info2] = systune(ST0,[TR DR],[M1 M2 RO]);
Final: Soft = 1.07, Hard = 0.99626, Iterations = 253
Again all requirements are nearly met.
viewSpec([TR DR RO M1 M2],ST2,Info2)
Plot the closedloop responses and compare with the statespace design.
clf T2 = getIOTransfer(ST2,{'BOOST REF';'EGRMF REF'},{'BOOST','EGRMF','EGRLIFT','VGTPOS'}); T2 = diag([1/10 1/3 1 1]) * T2 * diag([10 3]); subplot(211), step(T1(1:2,:),T2(1:2,:),20), title('Setpoint tracking') legend('SS2','PI+FF') subplot(212), step(T1(3:4,:),T2(3:4,:),20), title('Control effort')
D2 = getIOTransfer(ST2,{'FUELMASS';'SPEED'},{'BOOST','EGRMF','EGRLIFT','VGTPOS'}); D2 = diag([1/10 1/3 1 1]) * D2 * diag([5 200]); subplot(211), step(D1(1:2,:),D2(1:2,:),20), title('Disturbance rejection') legend('SS2','PI+FF') subplot(212), step(D1(3:4,:),D2(3:4,:),20), title('Control effort')
The blackbox and simplified control structures deliver similar performance. Inspect the tuned values of the PI and feedforward gains.
showTunable(ST2)
Block 1: rct_diesel/CONTROLLER/MIMO PID/Kp = d = u1 u2 y1 0.006688 0.001778 y2 0.01786 0.01865 Name: Kp Static gain.  Block 2: rct_diesel/CONTROLLER/MIMO PID/Ki = d = u1 u2 y1 0.007889 0.003068 y2 0.02346 0.07097 Name: Ki Static gain.  Block 3: rct_diesel/CONTROLLER/MIMO PID/Kff = d = u1 u2 y1 0.01675 0.0003041 y2 0.05472 0.0004848 Name: Kff Static gain.
To validate the MIMO PI controller in the Simulink model, push the tuned controller parameters to Simulink and run the simulation.
writeBlockValue(ST2)
The simulation results are shown below and confirm that the controller adequately tracks setpoint changes in boost pressure and EGR massflow and quickly rejects changes in fuel mass (at t=90) and in speed (at t=110).
Figure 3: Simulation results with simplified controller.