主要内容

在MATLAB中生成计算最优MPC移动的代码

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

工厂模式

该工厂是一个单输入,单输出,稳定,二阶线性工厂。

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

将对象转换为离散时间、状态空间形式,并指定零初始状态向量。

Ts = 1;工厂= ss (c2d(植物、Ts));x0 = 0(大小(plant.B, 1), 1);

MPC控制器的设计

创建具有默认视界的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”对象的“Model.Noise”属性为空。假设每个测量输出通道上存在白噪声。

通过调用mpcmove在一个循环中。

选项=mpcmovopt;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=植物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“哦”);网格传奇(“mpcmove”“codegen”)头衔(“植物输出”次要情节(1、2、2)情节(t uMPCMOVE'--*',t,uCodeGen,“哦”);网格传奇(“mpcmove”“codegen”)头衔(控制器动作的

图中包含两个轴。标题为Plant Output的轴1包含2个line类型的对象。这些对象表示mpcmove、codegen。标题控制器移动的轴2包含2个line类型的对象。这些对象表示mpcmove、codegen。

生成MEX函数mpcmoveCodeGeneration命令

mpcmoveCodeGeneration命令,可以使用codegen命令来自MATLAB编码器产品。在本例中,生成一个MEX函数mpcmoveMEX在MATLAB中再现仿真结果。您可以使用一组不同的代码将代码生成目标更改为C/C++静态库、动态库、可执行文件等coder.config设置。

在为mpcmoveCodeGeneration命令:

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

  • 必须定义第一个输入参数,mpcmove_结构,在使用codegen命令。

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

如果~z~执照(“测试”“MATLAB_Coder”)disp(运行此示例需要MATLAB编码器(TM)。返回结束

生成墨西哥人的功能。

有趣的=“mpcmoveCodeGeneration”; 娱乐输出=“mpcmoveMEX”; Cfg=coder.config(墨西哥人的);Cfg。DynamicMemoryAllocation =“关”; 编码基因(“配置”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,“哦”)网格传奇(“mpcmove”墨西哥人的)头衔(“植物输出”次要情节(1、2、2)情节(t uMPCMOVE'--*',t,uMEX,“哦”)网格传奇(“mpcmove”墨西哥人的)头衔(控制器动作的

图中包含2个轴。标题为Plant Output的轴1包含两个类型为line的对象。这些对象代表mpcmove, mex。标题为Controller Moves的轴2包含2个类型为line的对象。这些对象代表mpcmove, mex。

另请参阅

|

相关话题