Design ADRC for Multi-Input Multi-Output Plant

Since R2023b

This example shows how to design active disturbance rejection control (ADRC) for a multi-input multi-output (MIMO) plant.

Overview

In this example, the plant is a model of a pilot-scale distillation column [1]. This model has two inputs: the flux flow rate ${\mathit{u}}_{1}$ and the steam flow rate ${\mathit{u}}_{2}$. The model has two outputs: the purity of light product ${\mathit{y}}_{1}$ and the purity of heavy product ${\mathit{y}}_{2}$. The model also contains unknown disturbances.

Define the plant transfer function.

```s = tf('s'); G = [12.8/(16.7*s+1),-18.9/(21*s+1);6.6/(10.9*s+1),-19.4/(14.4*s+1)];```

The controller objective is to keep the outputs at desired values ${\mathit{r}}_{1}=0$ and ${\mathit{r}}_{2}=1$. To design the two ADRC controllers for the plant, you apply a dynamic decoupling control approach [1]. Each ADRC block controls the channel from input ${\mathit{u}}_{\mathit{i}}$ to output ${\mathit{y}}_{\mathit{i}}$ ($\mathit{i}=1,2$). Then, you design a model predictive controller (MPC) as a benchmark controller for the ADRC design performance.

To design the decoupled ADRC controllers, approximate the two-input two-output plant model as follows.

`$\begin{array}{l}{{\mathit{y}}_{1}}^{\left({\mathit{n}}_{1}\right)}={\mathit{b}}_{1}{\mathit{u}}_{1}+{\mathit{f}}_{1}\left(\mathit{t}\right)\\ {{\mathit{y}}_{2}}^{\left({\mathit{n}}_{2}\right)}={\mathit{b}}_{2}{\mathit{u}}_{2}+{\mathit{f}}_{2}\left(\mathit{t}\right)\end{array}$`

Here:

• ${\mathit{f}}_{\mathit{i}}\left(\mathit{t}\right)$ represents the total disturbance for the channel from input ${\mathit{u}}_{\mathit{i}}$ to output ${\mathit{y}}_{\mathit{i}}$ ($\mathit{i}=1,2$), including unknown dynamics, cross channel interference, and external disturbances.

• ${\mathit{n}}_{\mathit{i}}$ represents the orders of the derivative.

• ${\mathit{b}}_{\mathit{i}}$ represents the critical gains.

To determine the order of derivative ${\mathit{n}}_{\mathit{i}}$ and critical gain ${\mathit{b}}_{\mathit{i}}$, perform a step input experiment on the plant model. This example provides the `DecoupledPlantIO` model to simulate the model with decoupled inputs and outputs.

```mdl_step = "DecoupledPlantIO"; open_system(mdl_step)```

To perform the experiment from input ${\mathit{u}}_{1}=1$ to output ${\mathit{y}}_{1}$, specify `m` = 1.

Simulate the model and examine the output response.

```m = 1; out = sim(mdl_step); t1 = out.logsout{1}.Values.Time; y1 = out.logsout{1}.Values.Data; plot(t1,y1); xlabel("time (s)") ylabel("y1")```

The step response is first-order, thus the order of derivative ${\mathit{n}}_{1}=1$. You can approximate the critical gain ${\mathit{b}}_{1}$ using the slope. For this response, ${\mathit{b}}_{1}=0.75$.

`b1 = 0.75;`

Similarly, specify $\mathit{m}=2$ for the experiment from input ${\mathit{u}}_{2}=1$ to output ${\mathit{y}}_{2}$.

```m = 2; out = sim(mdl_step); t2 = out.logsout{1}.Values.Time; y2 = out.logsout{1}.Values.Data; plot(t2,y2); xlabel('time (s)') ylabel('y2')```

The step response is also first-order, thus ${\mathit{n}}_{2}=1$ and the critical gain ${\mathit{b}}_{2}=-1.3$ .

`b2 = -1.3;`

To tune the performance of the ADRC controllers, use the controller bandwidth ${\mathit{w}}_{\mathit{c}}$ and observer bandwidth ${\mathit{w}}_{\mathit{o}}$ parameters. In this example, the tuning goal is to match the performance of an optimal MPC controller.

Design an MPC controller for the plant model.

```Ts = 1; % sample time mpc1 = mpc(G,Ts);```
```-->"PredictionHorizon" is empty. Assuming default 10. -->"ControlHorizon" is empty. Assuming default 2. -->"Weights.ManipulatedVariables" is empty. Assuming default 0.00000. -->"Weights.ManipulatedVariablesRate" is empty. Assuming default 0.10000. -->"Weights.OutputVariables" is empty. Assuming default 1.00000. ```

You can adjust the weights of the controller to tune the performance. For more information, see Tune Weights (Model Predictive Control Toolbox).

Specify weights for the MPC controller.

```mpc1.Weights.ManipulatedVariablesRate = 0.7389*[1,1]; mpc1.Weights.OutputVariables = 0.1353*[1,1];```

To match the response of the MPC controller, you must set the controller bandwidth and observer bandwidth of the ADRC controllers. For this example, ${\mathit{w}}_{\mathit{c}}=0.25$ and ${\mathit{w}}_{\mathit{o}}=3$ match the response of the MPC controller.

```wc = 0.25; wo = 3;```

Run the model for 45 seconds.

```T = 45; mdl = "ADRCWithBenchmarkMIMO"; open_system(mdl);```

`sim(mdl);`
```-->Converting the "Model.Plant" property to state-space. -->Converting model to discrete time. -->Assuming output disturbance added to measured output #1 is integrated white noise. -->Assuming output disturbance added to measured output #2 is integrated white noise. -->"Model.Noise" is empty. Assuming white noise on each measured output. ```

View the outputs of the plant using the scope.

`open_system(mdl + "/outputs")`

The MPC controller and ADRC controllers have a similar response for output ${\mathit{y}}_{2}$. The ADRC controllers have a smaller tracking error for output ${\mathit{y}}_{1}$ compared to the MPC controller.

Disturbance Rejection

The model has an external disturbance from 50 to 100 seconds. Run the model to 150 seconds.

```T = 150; sim(mdl);```

View the outputs of the plant using the scope.

`open_system(mdl + "/outputs")`

For this example, the ADRC controllers have better disturbance rejection results compared to the benchmark MPC controller. The outputs more quickly converge to reference values in the presence of a disturbance sue to the ADRC controllers using control inputs with larger magnitudes. View the inputs of the plant using the scope.

`open_system(mdl + "/inputs")`

References

[1] Zheng, Qing, Zhongzhou Chen, and Zhiqiang Gao. “A Dynamic Decoupling Control Approach and Its Applications to Chemical Processes.” In 2007 American Control Conference, 5176–81, 2007. https://doi.org/10.1109/ACC.2007.4282973.