此示例演示如何使用mpcmoveCodeGeneration
命令生成C代码,以计算实时应用程序的最佳MPC控制移动。
所述植物是单输入,单输出的,稳定的,第二阶线性植物。
植物= TF(5,[1 0.8 3]);
植物转换成离散时间,状态空间形式,并指定一个零个的初始状态矢量。
TS = 1;植物= SS(C2D(植物中,Ts));X0 =零(大小(plant.B,1),1);
创建一个具有默认界面的MPC控制器。
mpcobj = mpc(植物、Ts);
- >“MPC”对象的“PredictionHorizon”属性是空的。试图PredictionHorizon = 10 - >的“MPC”对象的“ControlHorizon”属性是空的。假设2。 - >“MPC”对象的“Weights.ManipulatedVariables”属性是空的。假设默认0.00000。- >“MPC”对象的“Weights.ManipulatedVariablesRate”属性是空的。假设默认0.10000。- >“MPC”对象的“Weights.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”)标题(“控制行动”)
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')标题(“控制行动”)
getCodeGenerationData
|mpcmoveCodeGeneration