主要内容

生成代码来计算最优货币政策委员会在MATLAB

这个例子展示了如何使用mpcmoveCodeGeneration命令生成C代码来计算最优MPC控制移动实时应用程序。

在模拟控制器使用mpcmove,可以使用mpcmoveCodeGeneration使用优化的数据结构来模拟控制器,复制相同的结果。然后生成一个可执行的有相同的输入和输出mpcmoveCodeGeneration。最后,您使用生成的可执行模拟控制器,使用相同的代码和数据结构mpcmoveCodeGeneration。

工厂模式

植物是一个单,对于稳定,二阶线性植物。

工厂=特遣部队(5 [1 0.8 - 3]);

设置一个采样时间1秒,植物转化成离散时间,状态方程形式,并指定一个零初始状态向量。

Ts = 1;工厂= ss (c2d(植物、Ts));x0 = 0(大小(plant.B, 1), 1);

MPC控制器设计

创建一个MPC控制器使用默认的视野和指定的取样时间。

mpcobj = mpc(植物、Ts);
- - >“PredictionHorizon”属性是空的。假设默认10。- - >“ControlHorizon”属性是空的。假设默认2。- - >“权重。ManipulatedVariables”属性是空的。假设默认的0.00000。- - >“权重。ManipulatedVariablesRate”属性是空的。假设默认的0.10000。 -->The "Weights.OutputVariables" property is empty. Assuming default 1.00000.

指定控制器优化权重。

mpcobj.Weights。MV = 0;mpcobj.Weights。MVrate = 0.5;mpcobj.Weights。OV = 1;

指定初始约束被控变量和植物的输出。这些约束在运行时将被更新。

mpcobj.MV。最小值= 1;mpcobj.MV。Max = 1;mpcobj.OV。最小值= 1;mpcobj.OV。Max = 1;

模拟在线约束变化mpcmove命令

在闭环仿真,约束和美联储到更新mpcmove命令在每个控制区间。

yMPCMOVE = [];uMPCMOVE = [];

设置仿真时间。

尖= 20;

初始化网络约束数据。

MVMinData = -0.2 - 0.95 [1 0.9 0.85 0.8 0.75 0.7 0.65 0.6 0.55 0.50.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95 1);MVMaxData = 0.2 + (1 0.95 0.9 0.85 0.8 0.75 0.7 0.65 0.6 0.55 0.50.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95 1);OVMinData = -0.2 - 0.95 [1 0.9 0.85 0.8 0.75 0.7 0.65 0.6 0.55 0.50.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95 1);OVMaxData = 0.2 + (1 0.95 0.9 0.85 0.8 0.75 0.7 0.65 0.6 0.55 0.50.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95 1);

初始化植物状态。

x = x0;

初始化MPC。请注意,xmpc是一个处理对象指向当前(总是)更新状态的控制器。

xmpc = mpcstate (mpcobj);
- - >输出假设扰动添加到测量输出通道# 1是集成的白噪声。- - >”模型。噪音”属性是空的。假设白噪声在每个测量输出。

运行一个闭环仿真通过调用mpcmove在一个循环中。

选择= mpcmoveopt;ct = 1:圆形(尖/ Ts) + 1%更新和存储装置输出。y = plant.C * x;yMPCMOVE = [yMPCMOVE y];%更新约束。选项。MVMin = MVMinData (ct);选项。MVMax = MVMaxData (ct);选项。OutputMin = OVMinData (ct);选项。OutputMax = OVMaxData (ct);%计算和存储装置输入控制操作。u = mpcmove (mpcobj xmpc y 1[],选项);uMPCMOVE = [uMPCMOVE u];%更新植物状态。x =植物。* x + plant.B * u;结束

验证仿真结果与mpcmoveCodeGeneration命令

准备计算最优控制从MATLAB生成代码,建议复制相同的控制结果mpcmoveCodeGeneration命令使用前codegen从MATLAB命令编码器产品。

yCodeGen = [];uCodeGen = [];

初始化植物状态。

x = x0;

创建数据结构来使用mpcmoveCodeGeneration使用getCodeGenerationData

[coredata, statedata onlinedata] = getCodeGenerationData (mpcobj);

运行一个闭环仿真通过调用mpcmoveCodeGeneration在一个循环中。

ct = 1:圆形(尖/ Ts) + 1%更新和存储装置输出。y = plant.C * x;yCodeGen = [yCodeGen y];%更新输出在线测量数据。onlinedata.signals。ym = y;%更新参考在线数据。onlinedata.signals。ref = 1;%更新在线数据的约束。onlinedata.limits。umin = MVMinData (ct);onlinedata.limits。umax = MVMaxData (ct);onlinedata.limits。ymin = OVMinData (ct);onlinedata.limits。ymax = OVMaxData (ct);%计算和存储控制动作。[u, statedata] = mpcmoveCodeGeneration (coredata, statedata onlinedata);uCodeGen = [uCodeGen u];%更新植物状态。x =植物。* x + plant.B * u;结束

仿真结果获得使用完全相同mpcmove

t = 0: Ts:尖;图;次要情节(1、2、1)情节(t yMPCMOVE”——*’t yCodeGen“o”);网格传奇(“mpcmove”,“codegen”)标题(“植物输出”次要情节(1、2、2)情节(t uMPCMOVE”——*’t uCodeGen“o”);网格传奇(“mpcmove”,“codegen”)标题(控制器动作的)

图包含2轴对象。坐标轴对象1标题植物输出包含2线类型的对象。这些对象代表mpcmove codegen。坐标轴对象2 2标题控制器动作包含对象类型的线。这些对象代表mpcmove codegen。

生成函数墨西哥人从mpcmoveCodeGeneration命令

生成的C代码mpcmoveCodeGeneration命令,可以使用codegen从MATLAB命令编码器产品。在本例中,生成一个墨西哥人的功能mpcmoveMEX复制在MATLAB仿真结果。你可以改变目标代码生成C / c++静态库,动态库,通过使用一组不同的可执行文件,等等coder.config设置。

当生成C代码mpcmoveCodeGeneration命令:

  • 因为没有执行数据完整性检查输入参数,您必须确保所有的输入数据都正确的类型,尺寸,和价值观。

  • 您必须定义第一个输入参数,mpcmove_struct使用时,作为一个常数codegen命令。

  • 第二个输入参数,mpcmove_state更新的命令并返回第二个输出。在大多数情况下,您不需要修改其内容,就应该把它回到命令在未来控制间隔。唯一的例外是当启用自定义状态估计时,在这种情况下,您必须使用这个论点提供当前状态估计。

%检查MATLAB编码器许可证如果~许可证(“测试”,“MATLAB_Coder”)disp (MATLAB的编码器(TM)需要运行这个例子。)返回结束

生成墨西哥人的功能。

有趣的=“mpcmoveCodeGeneration”;funOutput =“mpcmoveMEX”;Cfg = coder.config (墨西哥人的);Cfg。DynamicMemoryAllocation =“关闭”;codegen (“配置”Cfg,有趣,“o”funOutput,“参数”,{coder.Constant (coredata)、statedata onlinedata});
代码生成成功。

初始化数据存储。

yMEX = [];uMEX = [];

初始化植物状态。

x = x0;

使用getCodeGenerationData创建数据结构使用mpcmoveCodeGeneration

[coredata, statedata onlinedata] = getCodeGenerationData (mpcobj);

运行一个闭环仿真通过调用生成的mpcmoveMEX函数在一个循环中。

ct = 1:圆形(尖/ Ts) + 1%更新和存储装置的输出。y = plant.C * x;yMEX = [yMEX y];%更新输出在线测量数据。onlinedata.signals。ym = y;%更新参考在线数据。onlinedata.signals。ref = 1;%更新在线数据的约束。onlinedata.limits。umin = MVMinData (ct);onlinedata.limits。umax = MVMaxData (ct);onlinedata.limits。ymin = OVMinData (ct);onlinedata.limits。ymax = OVMaxData (ct);%计算和存储控制动作。[u, statedata] = mpcmoveMEX (coredata, statedata onlinedata);uMEX = [uMEX u];%更新植物状态。x =植物。* x + plant.B * u;结束

仿真结果获得使用完全相同mpcmove

图次要情节(1、2、1)情节(t yMPCMOVE”——*’t yMEX“o”)网格传奇(“mpcmove”,墨西哥人的)标题(“植物输出”次要情节(1、2、2)情节(t uMPCMOVE”——*’t uMEX“o”)网格传奇(“mpcmove”,墨西哥人的)标题(控制器动作的)

图包含2轴对象。坐标轴对象1标题植物输出包含2线类型的对象。这些对象代表mpcmove,墨西哥人。坐标轴对象2 2标题控制器动作包含对象类型的线。这些对象代表mpcmove,墨西哥人。

另请参阅

|

相关的话题