生成代码计算最优MPC移动在MATLAB中
控件的实例mpcmoveCodeGeneration
命令生成C代码来计算实时应用程序的最佳MPC控制移动。
仿真后的控制器使用mpcmove
,你用mpcmoveCodeGeneration
使用优化的数据结构模拟控制器,重现相同的结果。然后生成具有相同输入和输出的可执行文件mpcmoveCodeGeneration
.最后,使用生成的可执行文件模拟控制器,使用与模拟控制器相同的代码和数据结构mpcmoveCodeGeneration
.
工厂模式
该装置是一个单输入、单输出、稳定的二阶线性装置。
Plant = tf(5,[1 0.8 3]);
设置采样时间为1秒,将对象转换为离散时间、状态空间形式,并指定零初始状态向量。
Ts = 1;plant = ss(c2d(plant,Ts));x = 0 (size(plant.B,1),1);
MPC控制器设计
创建具有默认视界和指定采样时间的MPC控制器。
mpcobj = mpc(plant,Ts);
“PredictionHorizon”属性为空。假设默认值为10。“ControlHorizon”属性为空。假设默认值为2。- - - >“权重。“ManipulatedVariables”属性为空。假设默认值为0.00000。- - - >“权重。“操纵性变量率”属性为空。假设默认值为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.Min = -1;mpcobj.MV.Max = 1;mpcobj.OV.Min = -1;mpcobj.OV.Max = 1;
模拟在线约束变化mpcmove
命令
在闭环仿真中,约束被更新并馈入mpcmove
命令在每个控制间隔。
yMPCMOVE = [];uMPCMOVE = [];
设置模拟时间。
sim = 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.55 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上的输出扰动是集成白噪声。——>”模式。“噪音”属性是空的。假设每个测量输出都有白噪声。
通过调用运行闭环模拟mpcmove
在循环中。
Options = mpcmoveopt;为ct = 1:round(sim/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,[],options);uMPCMOVE = [uMPCMOVE u];%更新工厂状态。X =植物。A*x + plant.B*u;结束
验证仿真结果mpcmoveCodeGeneration
命令
为了准备从MATLAB中生成计算最优控制移动的代码,建议使用mpcmoveCodeGeneration
命令,然后使用codegen
命令从MATLAB编码器产品。
yCodeGen = [];uCodeGen = [];
初始化工厂状态。
X = x0;
创建要使用的数据结构mpcmoveCodeGeneration使用
getCodeGenerationData
.
[coredata,statedata,onlinedata] = getCodeGenerationData(mpcobj);
通过调用运行闭环模拟mpcmoveCodeGeneration
在循环中。
为ct = 1:round(sim/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 =植物。A*x + plant.B*u;结束
仿真结果与采用mpcmove
.
t = 0:Ts: tm;图;次要情节(1、2、1)情节(t yMPCMOVE”——*’t yCodeGen“o”);网格传奇(“mpcmove”,“codegen”)标题(“植物输出”) subplot(1,2,2) plot(t,uMPCMOVE,”——*’t uCodeGen“o”);网格传奇(“mpcmove”,“codegen”)标题(控制器动作的)
生成MEX函数mpcmoveCodeGeneration
命令
生成C代码mpcmoveCodeGeneration
命令,使用codegen
命令从MATLAB编码器产品。在本例中,生成一个MEX函数mpcmoveMEX
在MATLAB中重现仿真结果。你可以改变代码生成目标为C/ c++静态库,动态库,可执行文件等coder.config
设置。
类生成C代码时mpcmoveCodeGeneration
命令:
由于没有对输入参数执行数据完整性检查,因此必须确保所有输入数据都具有正确的类型、维度和值。
你必须定义第一个输入参数,
mpcmove_struct
,作为常量使用codegen
命令。第二个输入参数,
mpcmove_state
,由命令更新并作为第二个输出返回。在大多数情况下,您不需要修改其内容,只需在下一个控制间隔中将其传递回命令即可。唯一的例外是启用自定义状态估计时,在这种情况下,您必须使用此参数提供当前状态估计。
生成MEX函数。
有趣的=“mpcmoveCodeGeneration”;funOutput =“mpcmoveMEX”;Cfg = coder.config(墨西哥人的);Cfg。DynamicMemoryAllocation =“关闭”;codegen (“配置”Cfg,有趣,“o”funOutput,“参数”,...{coder.Constant (coredata)、statedata onlinedata});
代码生成成功。
初始化数据存储。
yMEX = [];[];
初始化工厂状态。
X = x0;
使用getCodeGenerationData
创建要使用的数据结构mpcmoveCodeGeneration
.
[coredata,statedata,onlinedata] = getCodeGenerationData(mpcobj);
运行闭环模拟,调用生成的mpcmoveMEX
循环中的函数。
为ct = 1:round(sim/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 =植物。A*x + plant.B*u;结束
仿真结果与采用mpcmove
.
图subplot(1,2,1) plot(t,yMPCMOVE,”——*’t yMEX“o”)栅格图例(“mpcmove”,墨西哥人的)标题(“植物输出”) subplot(1,2,2) plot(t,uMPCMOVE,”——*’t uMEX“o”)栅格图例(“mpcmove”,墨西哥人的)标题(控制器动作的)
另请参阅
mpcmoveCodeGeneration
|getCodeGenerationData