主要内容

在MATLAB中生成计算最优MPC移动的代码

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

控制器模拟后使用MPCMOVE., 你用mpcmoveCodeGeneration使用优化的数据结构模拟控制器,再现相同的结果。然后您生成具有相同输入和输出的可执行文件mpcmoveCodeGeneration.最后,使用生成的可执行文件模拟控制器,使用与所使用的相同的代码和数据结构mpcmoveCodeGeneration。

植物模型

该工厂是单输入,单输出,稳定的第二阶线性植物。

植物= TF(5,[1 0.8 3]);

设置一个秒的采样时间,将工厂转换为离散时间,状态空间形式,并指定零初始状态向量。

TS = 1;植物= SS(C2D(植物,TS));X0 =零(尺寸(植物,1),1);

MPC控制器设计

创建一个带有默认视界和指定采样时间的MPC控制器。

mpcobj = mpc(植物、Ts);
- >“MPC”对象的“PredIctionHorizo​​n”属性为空。尝试prediondhorizo​​n = 10.  - >“MPC”对象的“ControlHorizo​​n”属性为空。假设2.  - >“MPC”对象的“权重”属性为空。假设默认为0.00000。- >“MPC”对象的“权重”属性为空。假设默认为0.10000。- >“MPC”对象的“权重”属性为空。假设默认为1.0万。

指定控制器调优权重。

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

在操作变量和工厂输出上指定初始约束。这些约束将在运行时更新。

mpcobj.mv.min = -1;mpcobj.mv.max = 1;mpcobj.ov.min = -1;mpcobj.ov.max = 1;

在线模拟约束变化MPCMOVE.命令

在闭环仿真中,对约束条件进行更新并馈入MPCMOVE.命令在每个控制间隔。

yMPCMOVE = [];uMPCMOVE = [];

设置模拟时间。

Tsim = 20;

初始化在线约束数据。

MVMINDATA = -0.2- [1 0.95 0.9 0.85 0.8 0.75 0.7 0.65 0.6 0.55 0.5......0.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.5......0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95 1];OVMinData = -0.2-[1 0.95 0.9 0.85 0.8 0.75 0.7 0.65 0.6 0.55 0.5......0.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.5 0.5 0.5......0.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的输出扰动为集成白噪声。——>”模式。mpc对象的Noise属性为空。假设每个测量输出通道上都有白噪声。

通过调用。运行一个闭环模拟MPCMOVE.在循环中。

选择= mpcmoveopt;为了CT = 1:圆形(TSIM / TS)+1%更新和存储工厂输出。y = plant.C * x;ympcmove = [ympcmove y];%更新约束。options.mvmin = mvmindata(CT);options.mvmax = mvmaxdata(CT);options.Outputmin = OVMINDATA(CT);options.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,stateata,onlinedata] = getcodegenerationdata(mpcobj);

通过调用。运行一个闭环模拟mpcmoveCodeGeneration在循环中。

为了CT = 1:圆形(TSIM / 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);%compute和存储控制操作。[u,zatientata] = mpcmovecodegeneration(coredata,stateata,onlinedata);ucodegen = [ucodegen u];更新植物状态。x =植物。* x + plant.B * u;结尾

仿真结果与实际应用结果基本一致MPCMOVE.

T = 0:TS:TSIM;数字;子图(1,2,1)绘图(t,ympcmove,”——*’,t,ycodegen,“o”);网格传奇(“mpcmove”“codegen”)标题('植物输出')子图(1,2,2)绘图(t,umpcmove,”——*’t uCodeGen“o”);网格传奇(“mpcmove”“codegen”)标题('控制器移动'的)

图中包含2个轴对象。标题为Plant Output的轴对象1包含2个类型为line的对象。这些对象代表mpcmove, codegen。标题为Controller Moves的axis对象2包含2个类型为line的对象。这些对象代表mpcmove, codegen。

生成MEX功能mpcmoveCodeGeneration命令

生成C代码mpcmoveCodeGeneration命令,使用Codegen.来自MATLAB编码器产品的命令。在此示例中,生成MEX函数mpcmovemex.在MATLAB中再现仿真结果。您可以通过使用不同的集合来将代码生成目标更改为C/ c++静态库、动态库、可执行文件等Coder.config.设置。

的C代码mpcmoveCodeGeneration命令:

  • 由于没有对输入参数执行数据完整性检查,因此必须确保所有输入数据具有正确的类型、维度和值。

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

  • 第二个输入参数,mpcmove_state,由命令更新并作为第二个输出返回。在大多数情况下,您不需要修改它的内容,只需在下一个控制间隔中将它传递回命令。唯一的例外是启用了自定义状态估计,在这种情况下,您必须使用此参数提供当前状态估计。

%检查matlab编码器许可证如果~许可证(“测试”“MATLAB_Coder”) disp ('Matlab编码器(TM)需要运行此示例。的)返回结尾

生成MEX功能。

有趣=“mpcmoveCodeGeneration”;funOutput =“mpcmoveMEX”;Cfg = coder.config ('mex');cfg.dynamicmemoryallocation =“关闭”;codegen ('-config',cfg,有趣,'-o',funoutpul,'-args'......{编码器.Constant(coredata),stateata,onlinedata});
代码成功。

初始化数据存储。

yMEX = [];uMEX = [];

初始化工厂状态。

x = x0;

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

[coredata,stateata,onlinedata] = getcodegenerationdata(mpcobj);

通过调用生成来运行闭环仿真mpcmovemex.循环中的函数。

为了CT = 1:圆形(TSIM / 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);%compute和存储控制操作。[u, statedata] = mpcmoveMEX (coredata, statedata onlinedata);uMEX = [uMEX u];更新植物状态。x =植物。* x + plant.B * u;结尾

仿真结果与实际应用结果基本一致MPCMOVE.

图形子图(1,2,1)plot(t,ympcmove,”——*’t yMEX“o”)网格传奇(“mpcmove”'mex')标题('植物输出')子图(1,2,2)绘图(t,umpcmove,”——*’t uMEX“o”)网格传奇(“mpcmove”'mex')标题('控制器移动'的)

图中包含2个轴对象。标题为Plant Output的轴对象1包含2个类型为line的对象。这些对象代表MPCMove,MEX。标题为Controller Moves的axis对象2包含2个类型为line的对象。这些对象代表MPCMove,MEX。

也可以看看

|

相关的话题