生成代码来计算最优货币政策委员会在MATLAB
这个例子展示了如何使用mpcmoveCodeGeneration
命令生成C代码来计算最优MPC控制移动实时应用程序。
在模拟控制器使用mpcmove
,可以使用mpcmoveCodeGeneration
使用优化的数据结构来模拟控制器,复制相同的结果。然后生成一个可执行的有相同的输入和输出mpcmoveCodeGeneration
。最后,您使用生成的可执行模拟控制器,使用相同的代码和数据结构mpcmoveCodeGeneration。
工厂模式
植物是一个单,对于稳定,二阶线性植物。
工厂=特遣部队(5 [1 0.8 - 3]);
设置一个采样时间1秒,植物转化成离散时间,状态方程形式,并指定一个零初始状态向量。
Ts = 1;工厂= ss (c2d(植物、Ts));x0 = 0(大小(plant.B, 1), 1);
MPC控制器设计
创建一个MPC控制器使用默认的视野和指定的取样时间。
mpcobj = mpc(植物、Ts);
- - >“PredictionHorizon”属性是空的。假设默认10。- - >“ControlHorizon”属性是空的。假设默认2。- - >“权重。ManipulatedVariables”属性是空的。假设默认的0.00000。- - >“权重。ManipulatedVariablesRate”属性是空的。假设默认的0.10000。 -->The "Weights.OutputVariables" property is empty. Assuming default 1.00000.
指定控制器优化权重。
mpcobj.Weights。MV = 0;mpcobj.Weights。MVrate = 0.5;mpcobj.Weights。OV = 1;
指定初始约束被控变量和植物的输出。这些约束在运行时将被更新。
mpcobj.MV。最小值= 1;mpcobj.MV。Max = 1;mpcobj.OV。最小值= 1;mpcobj.OV。Max = 1;
模拟在线约束变化mpcmove
命令
在闭环仿真,约束和美联储到更新mpcmove
命令在每个控制区间。
yMPCMOVE = [];uMPCMOVE = [];
设置仿真时间。
尖= 20;
初始化网络约束数据。
MVMinData = -0.2 - 0.95 [1 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 - 0.95 [1 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:圆形(尖/ 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[],选项);uMPCMOVE = [uMPCMOVE u];%更新植物状态。x =植物。* x + plant.B * 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);uCodeGen = [uCodeGen u];%更新植物状态。x =植物。* x + plant.B * 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命令编码器产品。在本例中,生成一个墨西哥人的功能mpcmoveMEX
复制在MATLAB仿真结果。你可以改变目标代码生成C / c++静态库,动态库,通过使用一组不同的可执行文件,等等coder.config
设置。
当生成C代码mpcmoveCodeGeneration
命令:
因为没有执行数据完整性检查输入参数,您必须确保所有的输入数据都正确的类型,尺寸,和价值观。
您必须定义第一个输入参数,
mpcmove_struct
使用时,作为一个常数codegen
命令。第二个输入参数,
mpcmove_state
更新的命令并返回第二个输出。在大多数情况下,您不需要修改其内容,就应该把它回到命令在未来控制间隔。唯一的例外是当启用自定义状态估计时,在这种情况下,您必须使用这个论点提供当前状态估计。
%检查MATLAB编码器许可证如果~许可证(“测试”,“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);uMEX = [uMEX u];%更新植物状态。x =植物。* x + plant.B * u;结束
仿真结果获得使用完全相同mpcmove
。
图次要情节(1、2、1)情节(t yMPCMOVE”——*’t yMEX“o”)网格传奇(“mpcmove”,墨西哥人的)标题(“植物输出”次要情节(1、2、2)情节(t uMPCMOVE”——*’t uMEX“o”)网格传奇(“mpcmove”,墨西哥人的)标题(控制器动作的)
另请参阅
mpcmoveCodeGeneration
|getCodeGenerationData