控件的使用方法mpcmoveCodeGeneration
命令生成C代码来计算实时应用的最优MPC控制动作。
该装置为单输入、单输出、稳定的二阶线性装置。
Plant = tf(5,[1 0.8 3]);
将对象转换为离散时间、状态空间形式,并指定一个零初始状态向量。
Ts = 1;工厂= ss (c2d(植物、Ts));x0 = 0(大小(plant.B, 1), 1);
创建一个带有默认视野的MPC控制器。
mpcobj = mpc(植物、Ts);
——> mpc对象的“PredictionHorizon”属性为空。尝试PredictionHorizon = 10。mpc对象的“ControlHorizon”属性是空的。假设2。- - - >“权重。操控变量的“mpc”对象的属性为空。假设默认的0.00000。- - - >“权重。“mpc”对象的属性为空。假设默认的0.10000。 -->The "Weights.OutputVariables" property of "mpc" object 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 = [];
设置模拟时间。
尖= 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 = mpcstate (mpcobj);
假设在测量输出通道#1上添加的输出扰动是集成白噪声。——>”模式。mpc对象的Noise属性为空。假设每个测量输出通道上都有白噪声。
通过调用运行一个闭环仿真mpcmove
在一个循环中。
选择= mpcmoveopt;为ct = 1:圆形(尖/ 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[],选项);%更新和存储工厂状态。x =植物。* x + plant.B * u;uMPCMOVE = [uMPCMOVE u];结束
mpcmoveCodeGeneration
命令为了准备从MATLAB生成计算最优控制动作的代码,建议用mpcmoveCodeGeneration
命令,然后使用codegen
命令从MATLAB编码器产品。
yCodeGen = [];uCodeGen = [];
初始化植物状态。
x = x0;
创建要使用的数据结构mpcmoveCodeGeneration使用
getCodeGenerationData
.
[coredata, statedata onlinedata] = getCodeGenerationData (mpcobj);
通过调用运行一个闭环仿真mpcmoveCodeGeneration
在一个循环中。
为ct = 1:圆形(尖/ 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);%更新和存储工厂状态。x =植物。* x + plant.B * u;uCodeGen = [uCodeGen u];结束
仿真结果与实际应用结果一致mpcmove
.
t = 0: Ts:尖;图;次要情节(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
,在使用the时作为常量codegen
命令。
第二个输入参数,mpcmove_state
,由命令更新,并作为第二个输出返回。在大多数情况下,您不需要修改其内容,只需在下一个控制间隔中将其传递回命令。唯一的例外是启用自定义状态估计时,在这种情况下,您必须使用此参数提供当前状态估计。
如果~许可证(“测试”,“MATLAB_Coder”) disp (“需要MATLAB编码器(TM)运行这个例子。”)返回结束
生成墨西哥人的功能。
有趣的=“mpcmoveCodeGeneration”;funOutput =“mpcmoveMEX”;Cfg = coder.config (墨西哥人的);Cfg。DynamicMemoryAllocation =“关闭”;codegen (“配置”Cfg,有趣,“o”funOutput,“参数”,...{coder.Constant (coredata)、statedata onlinedata});
代码生成成功。
初始化数据存储。
yMEX = [];uMEX = [];
初始化植物状态。
x = x0;
使用getCodeGenerationData
创建要使用的数据结构mpcmoveCodeGeneration
.
[coredata, statedata onlinedata] = getCodeGenerationData (mpcobj);
通过调用生成的函数来运行闭环仿真mpcmoveMEX
循环中的函数。
为ct = 1:圆形(尖/ 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);%更新并存储工厂状态。x =植物。* x + plant.B * u;uMEX = [uMEX u];结束
仿真结果与实际应用结果一致mpcmove
.
图次要情节(1、2、1)情节(t yMPCMOVE”——*’t yMEX“o”)网格传奇(“mpcmove”,墨西哥人的)标题(“植物输出”次要情节(1、2、2)情节(t uMPCMOVE”——*’t uMEX“o”)网格传奇(“mpcmove”,墨西哥人的)标题(控制器动作的)
getCodeGenerationData
|mpcmoveCodeGeneration