此示例显示了如何使用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控制器。
MPCOBJ = MPC(Plant,TS);
- >“ MPC”对象的“预测曲线”属性为空。尝试预测Horizon =10。->“ MPC”对象的“ ControlHorizon”属性为空。假设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') 标题(“控制器移动”)
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') 标题(“控制器移动”)
mpcmoveceDgeneration
|getCodegenerationData