主要内容

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

方法的使用mpcmoveCodeGeneration命令生成C代码,为实时应用程序计算最优MPC控制动作。

经过控制器的模拟使用mpcmove,你用mpcmoveCodeGeneration使用优化的数据结构来模拟控制器,重现相同的结果。然后生成具有相同输入和输出的可执行文件mpcmoveCodeGeneration.最后,使用生成的可执行文件模拟控制器,使用与之前相同的代码和数据结构mpcmoveCodeGeneration

工厂模式

该装置是单输入、单输出、稳定的二阶线性装置。

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

设置1秒的采样时间,将植物转换为离散时间、状态空间形式,并指定零初始状态向量。

Ts = 1;plant = ss(c2d(plant,Ts));x0 = 0 (size(plant.B,1),1);

MPC控制器设计

创建一个MPC控制器,具有默认的视界和指定的采样时间。

mpcobj = mpc(plant,Ts);
——>“PredictionHorizon”属性为空。假设默认为10。“ControlHorizon”属性为空。假设默认2。- - - >“权重。属性为空。假设默认值为0.00000。- - - >“权重。属性为空。假设默认为0.10000。 -->The "Weights.OutputVariables" property is empty. Assuming default 1.00000.

指定控制器调优权重。

mpcobj.Weights.MV = 0;mpcobj.Weights.MVrate = 0.5;mpcobo . weights . ov = 1;

指定被操作变量和工厂输出的初始约束。这些约束将在运行时更新。

mpcobj.MV.Min = -1;mpcobj.MV.Max = 1;mpcobo . ov . min = -1;mpcobj.OV.Max = 1;

模拟在线约束更改mpcmove命令

在闭环仿真中,约束被更新并输入mpcmove命令。

ymcmove = [];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是一个句柄对象,指向控制器的当前(总是更新)状态。

XMPC = mpcstate(mpcobj);
假设添加到测量输出通道#1的输出扰动是集成白噪声。——>”模式。“噪音”属性为空。假设每个测量输出都有白噪声。

通过调用运行闭环模拟mpcmove在一个循环中。

选项= mpcmoveopt;ct = 1:圆(Tsim/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:圆(Tsim/Ts)+1更新和存储工厂产量。y = plant.C*x;yCodeGen = [yCodeGen y];在线数据更新测量输出。onlindata .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:尖;图;次要情节(1、2、1)情节(t yMPCMOVE”——*’t yCodeGen“o”);网格传奇(“mpcmove”“codegen”)标题(“植物输出”) subplot(1,2,2) plot(t,uMPCMOVE,”——*’t uCodeGen“o”);网格传奇(“mpcmove”“codegen”)标题(控制器动作的

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

生成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 = code .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:圆(Tsim/Ts)+1更新和存储工厂产量。y = plant.C*x;yMEX = [yMEX y];在线数据更新测量输出。onlindata .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”墨西哥人的)标题(控制器动作的

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

另请参阅

|

相关的话题