生成MATLAB代码来计算最优MPC移到

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

工厂模型

所述植物是单输入,单输出的,稳定的,第二阶线性植物。

植物= TF(5,[1 0.8 3]);

植物转换成离散时间,状态空间形式,并指定一个零个的初始状态矢量。

TS = 1;植物= SS(C2D(植物中,Ts));X0 =零(大小(plant.B,1),1);

MPC控制器设计

创建一个具有默认界面的MPC控制器。

mpcobj = mpc(植物、Ts);
- >“MPC”对象的“PredictionHorizo​​n”属性是空的。试图PredictionHorizo​​n = 10  - >的“MPC”对象的“ControlHorizo​​n”属性是空的。假设2。 - >“MPC”对象的“We​​ights.ManipulatedVariables”属性是空的。假设默认0.00000。- >“MPC”对象的“We​​ights.ManipulatedVariablesRate”属性是空的。假设默认0.10000。- >“MPC”对象的“We​​ights.OutputVariables”属性是空的。假设默认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”对象的“噪音”属性为空。假设每个测量的输出通道上都有白噪声。

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

选择= mpcmoveopt;对于CT = 1:轮(尖/ 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,[],选项);%更新和存储设备的状态。X = plant.A * X + plant.B * U;uMPCMOVE = [uMPCMOVEü];结束

用…验证仿真结果mpcmoveCodeGeneration命令

到用于产生计算从MATLAB最优控制移动代码准备,建议再现与相同的控制结果mpcmoveCodeGeneration在使用代码生成从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 = plant.A * X + plant.B * U;uCodeGen = [uCodeGenü];结束

仿真结果与实际情况基本一致mpcmove

t = 0时:TS:尖;数字;副区(1,2,1)情节(T,yMPCMOVE,”——*’,T,yCodeGen,“o”);格传说(“mpcmove”“codegen”)标题(“设备输出”)副区(1,2,2)情节(T,uMPCMOVE,”——*’t uCodeGen“o”);格传说(“mpcmove”“codegen”)标题(“控制行动”

生成MEX函数从mpcmoveCodeGeneration命令

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

时生成的C代码mpcmoveCodeGeneration命令:

  • 由于没有数据完整性检查输入参数执行,你必须确保所有输入数据具有正确的类型,尺寸和价值。

  • 你必须定义第一个输入参数,mpcmove_struct作为一个常数时,使用代码生成命令。

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

如果~许可证(“测试”'MATLAB_Coder')disp (“MATLAB编码器(TM)需要运行这个例子。”返回结束

生成MEX函数。

有趣=“mpcmoveCodeGeneration”;funOutput =“mpcmoveMEX”;Cfg = coder.config ('MEX');Cfg.DynamicMemoryAllocation =“关闭”;codegen ('-config',CFG,乐趣,'-o',funOutput,'-args'...{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 = plant.A * X + plant.B * U;UMEX = [UMEXü];结束

仿真结果与实际情况基本一致mpcmove

图副区(1,2,1)情节(T,yMPCMOVE,”——*’t yMEX“o”)网格图例(“mpcmove”'MEX')标题(“设备输出”)副区(1,2,2)情节(T,uMPCMOVE,”——*’t uMEX“o”)网格图例(“mpcmove”'MEX')标题(“控制行动”

也可以看看

|

相关的话题