这个例子展示了如何使用mpcmoveCodeGeneration
命令生成C代码,以计算实时应用程序的最佳MPC控制动作。
控制器模拟后使用MPCMOVE.
, 你用mpcmoveCodeGeneration
使用优化的数据结构模拟控制器,再现相同的结果。然后您生成具有相同输入和输出的可执行文件mpcmoveCodeGeneration
.最后,使用生成的可执行文件模拟控制器,使用与所使用的相同的代码和数据结构mpcmoveCodeGeneration。
该工厂是单输入,单输出,稳定的第二阶线性植物。
植物= TF(5,[1 0.8 3]);
设置一个秒的采样时间,将工厂转换为离散时间,状态空间形式,并指定零初始状态向量。
TS = 1;植物= SS(C2D(植物,TS));X0 =零(尺寸(植物,1),1);
创建一个带有默认视界和指定采样时间的MPC控制器。
mpcobj = mpc(植物、Ts);
- >“MPC”对象的“PredIctionHorizon”属性为空。尝试prediondhorizon = 10. - >“MPC”对象的“ControlHorizon”属性为空。假设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”)标题('控制器移动'的)
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')标题('控制器移动'的)
mpcmoveCodeGeneration
|getCodeGenerationData