# Documentation

### This is machine translation

Translated by
Mouseover text to see original. Click the button below to return to the English verison of the page.

## Generate Code and Deploy Controller to Real-Time Targets

Model Predictive Control Toolbox™ software provides code generation functionality for controllers designed in Simulink® and MATLAB®.

After designing a controller in Simulink using any of the MPC blocks, you can generate code and deploy it for real-time control. You can deploy controllers to all targets supported by the following products:

• Embedded Coder®

The sampling rate that a controller can achieve in real-time environment is system-dependent. For example, for a typical small MIMO control application running on Simulink Real-Time, the sampling rate can go as low as 1–10 ms. To determine the sampling rate, first test a less aggressive controller whose sampling rate produces acceptable performance on the target. Next, increase the sampling rate and monitor the execution time used by the controller. You can further decrease the sampling rate as long as the optimization safely completes within each sampling period under the normal plant operations. To reduce the sampling rate, you can also consider using explicit MPC. However, explicit MPC controllers have a larger memory footprint, since they store precomputed control laws.

You can generate code for any of the Model Predictive Control Toolbox Simulink blocks:

For more information, see Simulation and Code Generation Using Simulink Coder and Simulation and Structured Text Generation Using PLC Coder.

 Note:   The MPC Controller block is implemented using the MATLAB Function (Simulink) block. To see the structure, right-click the block and select Mask > Look Under Mask. Open the `MPC` subsystem underneath.

### Code Generation in MATLAB

After designing an MPC controller in MATLAB, you can generate C code using MATLAB Coder and deploy it for real-time control.

To generate code for computing optimal MPC control moves:

1. Generate data structures from an MPC or explicit MPC controller using `getCodeGenerationData`.

2. To verify that your controller produces the expected closed-loop results, simulate it using `mpcmoveCodeGeneration` in place of `mpcmove`.

3. Generate code for `mpcmoveCodeGeneration` using `codegen`. This step requires MATLAB Coder software.

For more information, see Generate Code To Compute Optimal MPC Moves in MATLAB.

### QP Problem Construction for Generated C Code

At each control interval, an MPC controller constructs a new QP problem, which is defined as:

`$\underset{x}{Min}\left(\frac{1}{2}{x}^{⊺}Hx+{f}^{⊺}x\right)$`

subject to the linear inequality constraints

`$Ax\ge b$`

where

• x is the solution vector.

• H is the Hessian matrix.

• A is a matrix of linear constraint coefficients.

• f and b are vectors.

In generated C code, the following matrices are used to provide H, A, f, and b. Depending on the type and configuration of the MPC controller, these matrices are either constant or regenerated at each control interval.

Constant MatrixSizePurposeImplicit MPCImplicit MPC with Online Weight TuningAdaptive MPC or LTV MPC
`Hinv`NM-by-NMInverse of the Hessian matrix, HConstantRegeneratedRegenerated
`Linv`NM-by-NMInverse of the lower-triangular Cholesky decomposition of H
`Ac`NC-by-NMLinear constraint coefficients, AConstant
`Kx`Nxqp-by-(NM–1)Used to generate fRegenerated
`Kr`p*Ny-by-(NM–1)
`Ku1`Nmv-by-(NM–1)
`Kv`(Nmd+1)*(p+1)-by-(NM–1)
`Kut`p*Nmv-by-(NM–1)
`Mlim`NC-by-1Used to generate bConstantConstant, except when there are custom constraints
`Mx`NC-by-NxqpRegenerated
`Mu1`NC-by-Nmv
`Mv`NC-by-(Nmd+1)*(p+1)

Here

• p is the prediction horizon.

• Nmv is the number of manipulated variables.

• Nmd is the number of measured disturbances.

• Ny is the number of output variables.

• NM is the number of optimization variables (m*Nmv+1, where m is the control horizon).

• Nxqp is the number of states used for the QP problem; that is, the total number of the plant states and disturbance model states.

• NC is the total number of constraints.

At each control interval, the generated C code computes f and b as:

`$f=K{x}^{⊺}\ast {x}_{q}+K{r}^{⊺}\ast {r}_{p}+Ku{1}^{⊺}\ast {m}_{l}+K{v}^{⊺}\ast {v}_{p}+Ku{t}^{⊺}\ast {u}_{t}$`
`$b=-\left(Mlim+Mx\ast {x}_{q}+Mu1\ast {m}_{l}+Mv\ast {v}_{p}\right)$`

where

• xq is the vector of plant and disturbance model states estimated by the Kalman filter.

• ml is the manipulated variable move from the previous control interval.

• ut is the manipulated variable target.

• vp is the sequence of measured disturbance signals across the prediction horizon.

• rp is the sequence of reference signals across the prediction horizon.

 Note:   When generating code in MATLAB, the `getCodeGenerationData` command generates these matrices and returns them in `configData`.