主要内容

生成代码以计算MATLAB中的最佳MPC移动

此示例显示了如何使用mpcmoveceDgeneration命令生成C代码以计算实时应用程序的最佳MPC控制移动。

在模拟控制器之后mpcmove, 你用mpcmoveceDgeneration为了使用优化的数据结构模拟控制器,以重现相同的结果。然后,您生成具有相同输入和输出的可执行文件mpcmoveceDgeneration。最后,您使用生成的可执行文件模拟控制器,使用与您使用的相同代码和数据结构mpcmoveceDgeneration。

植物模型

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

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

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

TS = 1;植物= SS(C2D(植物,TS));x0 =零(size(plant.b,1),1);

设计MPC控制器

创建具有默认视野和指定采样时间的MPC控制器。

MPCOBJ = MPC(Plant,TS);
- >“ MPC”对象的“预测曲线”属性为空。尝试预测Horizo​​n =10。->“ MPC”对象的“ ControlHorizo​​n”属性为空。假设2.  - >“ weights.manipulationVariobles”属性“ MPC”对象是空的。假设默认为0.00000。- >“ weights.manipulationVariablesrate”属性“ MPC”对象是空的。假设默认为0.10000。- >“ MPC”对象的“ weight.outputvariables”属性为空。假设默认为1.00000。

指定控制器调整权重。

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.65 0.6 0.55 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];mvmaxdata = 0.2+[1 0.95 0.9 0.85 0.8 0.75 0.7 0.65 0.65 0.6 0.55 0.5 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.65 0.6 0.55 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];ovmaxdata = 0.2+ [1 0.95 0.9 0.85 0.8 0.75 0.7 0.65 0.65 0.6 0.55 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”对象的“ model.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,[],options);umpcMove = [umpcmove u];%更新植物状态。x = plant.a*x + plant.b*u;结尾

验证模拟结果与mpcmoveceDgeneration命令

为了准备生成从MATLAB的最佳控制移动的代码,建议使用相同的控制结果mpcmoveceDgeneration使用之前的命令代码根MATLAB编码器产品的命令。

ycodegen = [];ucodegen = [];

初始化植物状态。

x = x0;

创建用于使用的数据结构MPCMoveCeDgeneration使用getCodegenerationData

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

通过打电话运行闭环模拟mpcmoveceDgeneration循环。

为了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);%计算和存储控制动作。[u,newata] = mpcmovecodegeneration(coredata,neTata,onlinedata);ucodegen = [ucodegen u];%更新植物状态。x = plant.a*x + plant.b*u;结尾

模拟结果与使用的结果相同mpcmove

t = 0:ts:tsim;数字;子图(1,2,1)图(t,ympcmove,' - *',t,ycodegen,'o');网格传奇(“ mpcmove',,,,'codgen') 标题(“植物产量”)子图(1,2,2)图(t,umpcmove,' - *',t,ucodegen,'o');网格传奇(“ mpcmove',,,,'codgen') 标题(“控制器移动”

图包含2个轴对象。带有标题植物输出的轴对象1包含2个类型线的对象。这些对象代表mpcMove,codegen。带有标题控制器移动的轴对象2包含2个类型线的对象。这些对象代表mpcMove,codegen。

从中生成MEX功能mpcmoveceDgeneration命令

mpcmoveceDgeneration命令,使用代码根MATLAB编码器产品的命令。在此示例中,生成MEX函数mpcmovemex复制模拟结果MATLAB。您可以使用不同的集合,将代码生成目标更改为C/C ++静态库,动态库,可执行文件等。coder.config设置。

当生成C代码mpcmoveceDgeneration命令:

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

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

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

%检查MATLAB编码器许可证如果〜许可证('测试',,,,'matlab_coder')disp(运行此示例需要“ MATLAB编码器(TM)。”返回结尾

生成MEX功能。

有趣=“ mpcmoveceDgeneration';funOutput ='mpcmovemex';cfg = coder.config('Mex');cfg.dynamicmemoryallocation ='离开';Codegen(Codegen)('-config',CFG,有趣,'-o',funoutput,'-args',,,,...{coder.constant(coredata),satedata,Onlinedata});
代码生成成功。

初始化数据存储。

ymex = [];umex = [];

初始化植物状态。

x = x0;

采用getCodegenerationData创建用于与mpcmoveceDgeneration

[coredata,estatedata,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);%计算和存储控制动作。[u,satedata] = mpcmovemex(coredata,estateata,onlinedata);umex = [umex u];%更新植物状态。x = plant.a*x + plant.b*u;结尾

模拟结果与使用的结果相同mpcmove

图子图(1,2,1)图(t,ympcmove,' - *',t,ymex,'o')网格传奇(“ mpcmove',,,,'Mex') 标题(“植物产量”)子图(1,2,2)图(t,umpcmove,' - *',T,Umex,'o')网格传奇(“ mpcmove',,,,'Mex') 标题(“控制器移动”

图包含2个轴对象。带有标题植物输出的轴对象1包含2个类型线的对象。这些对象代表mpcmove,mex。带有标题控制器移动的轴对象2包含2个类型线的对象。这些对象代表mpcmove,mex。

也可以看看

|

相关话题