如果您的工厂是非线性的,设计用于在特定目标区域运行的控制器在其他区域可能表现不佳。一种常见的补偿方法是创建多个控制器,每个控制器都针对特定的操作条件组合设计。然后,随着条件的变化,您可以在控制器之间实时切换。有关更多信息,请参见获得预定的MPC.
下面的示例演示了如何为此目的协调多个模型预测控制器。
这种植物有两个部分,M1
和M2
,连接两个弹簧。具有弹簧常数的弹簧k1
把质量M1
向右,和一个弹簧,弹簧常数k2
把质量M2
靠左。操纵变量是一个力拉动质量M1
向左,如下图中红色箭头所示。
两个物体自由运动,直到相互碰撞。碰撞是非弹性的,质量粘在一起,直到施加的力发生变化将它们分开。因此,不同动力学的系统存在两种运行条件。
控制目标是使其成为位置M1
跟踪参考信号,显示为上一个图像中的蓝色三角形。只有这样的位置M1
并且接触传感器可用于反馈。
定义模型参数。
m1 = 1;%的质量m2 = 5;K1 = 1;%春季常数K2 = 0.1;B1 = 0.3;%摩擦系数b2 = 0.8;yeq1 = 10;%壁挂式位置yeq2 = -10;
为批量不接触时创建状态空间模型;这是质量M1
自由移动。
A1 = [0 1;-k1 / m1 -b1 / m1];b1 = [0 0;-1 / m1 k1 * yeq1 / m1];c1 = [1 0];d1 = [0 0];sys1 = ss(a1,b1,c1,d1);sys1 = setmpcsignals(sys1,'mv', 1'MD'2);
为批量连接时创建状态空间模型。
A2 = [0 1;- (K1 + K2)/(M1 + M2) - (B1 + B2)/(M1 + M2)];b2 = [0 0;-1 /(M1 + M2)(K1 * YEQ1 + K2 * YEQ2)/(M1 + M2)];c2 = [1 0];d2 = [0 0];SYS2 = SS(A2,B2,C2,D2);sys2 = setmpcsignals(sys2,'mv', 1'MD'2);
对于两种模型,:
状态是的位置和速度M1
.
输入是施加的力,即操纵变量(MV)和弹簧恒定校准信号,其是测量的干扰(MD)。
输出是位置M1
.
为每个电厂模型设计一个MPC控制器。除了内部预测模型外,两个控制器是相同的。
定义相同的采样时间,TS.
,预测地平线,P.
和控制地平线,M.
,用于两个控制器。
t = 0.2;p = 20;m = 1;
为每个工厂模型创建默认的MPC控制器。
MPC1 = MPC(SYS1,TS,P,M);MPC2 = MPC(SYS2,TS,P,M);
- >“MPC”对象的“权重”属性为空。假设默认为0.00000。- >“MPC”对象的“权重”属性为空。假设默认为0.10000。- >“MPC”对象的“权重”属性为空。假设默认为1.0万。- >“MPC”对象的“权重”属性为空。假设默认为0.00000。- >“MPC”对象的“权重”属性为空。假设默认为0.10000。 -->The "Weights.OutputVariables" property of "mpc" object is empty. Assuming default 1.00000.
为受操纵的变量定义约束。由于施加的力不能改变方向,所以将下限设为零。另外,设置输入力的最大变化率。这两个控制器的约束条件是相同的。
MPC1。MV =结构('min'0,'最大限度',30,“杀鼠灵”,-10,“RateMax”10);MPC2。MV = MPC1.MV;
模拟控制器的性能使用MPC控制器块。
打开Simulin金宝appk模型。
mdl =“mpc_switching”;Open_System(MDL)
在该模型中,质量M1子系统模拟了质量的运动M1
,两者何时自由地移动和连接到M2
.质量M2子系统模拟了质量M2在自由运动时的运动。模态选择和速度重置子系统协调质量的碰撞和分离。
该模型包含切换逻辑,检测何时的位置M1
和M2
都是一样的。由此产生的切换信号连接到转变
在多个MPC控制器块的Inport,并控制哪些MPC控制器处于活动状态。
为每个物体指定初始位置。
Y1initial = 0;Y2initial = 10;
要指定增益计划的控制器,请双击多个MPC控制器块。在“块参数”对话框中,将控制器指定为控制器名称的单元格数组。将每个控制器的初始状态设置为其各自的标称值,通过指定状态{'[],'[]'}
.
点击好的.
运行仿真。
SIM(MDL)
- >将模型转换为离散时间。- >假设添加到测量的输出干扰,输出通道#1是集成的白噪声。- >“MPC”对象的“Model.Noise”属性为空。假设每个测量的输出通道上的白噪声。- >将模型转换为离散时间。- >假设添加到测量的输出干扰,输出通道#1是集成的白噪声。- >“MPC”对象的“Model.Noise”属性为空。假设每个测量的输出通道上的白噪声。- >将模型转换为离散时间。- >假设添加到测量的输出干扰,输出通道#1是集成的白噪声。 -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
要查看仿真结果,请打开信号范围。
open_system ([mdl'/信号'])
最初,MPC1
移动质量M1
到参考设定值。大约13秒,M2
碰撞与M1
.切换信号从1到2变为2,切换控制MPC2
.
碰撞移动M1
远离它的设定值MPC2
快速地将混合质量返回到参考点。
在随后的参考信号转换过程中,当质量分离和碰撞时,多个MPC控制器块之间进行切换MPC1
和MPC2
相应的行动。因此,合并后的质量迅速沉降到参考点。
为了演示使用两个MPC控制器的益处,可以使用即可模拟系统MPC2
.
改变MPC1
匹配MPC2
.
MPC1SAVE = MPC1;MPC1 = MPC2;
运行仿真。
SIM(MDL)
当群众没有连接时,MPC2
施加过度的力,因为它预计大量质量。这种激进的控制作用会产生振荡行为。一旦质量连接,控制性能会改善,因为控制器专为这种情况而设计。
或者,改变MPC2
匹配MPC1
导致群众连接的控制行动和长度稳定时间。
放MPC1
回到它原来的结构。
mpc1 = mpc1save;
为了减少在线计算的工作量,您可以为每个工况创建一个显式MPC控制器,并使用增益计划显式MPC控制多个显式MPC控制器块。有关显式MPC控制器的更多信息,请参见明确的MPC.
要创建显式MPC控制器,首先定义控制器状态,输入信号和参考信号的操作范围。
使用相应的传统控制器创建一个显式MPC范围对象,MPC1
.
范围= generateExplicitRange (MPC1);
指定控制器状态的范围。这两个MPC1
和MPC2
包含各国:
质量的位置和速度M1
.
来自默认输出干扰模型的积分器。
当可能时,使用您对工厂的知识来定义状态范围。例如,第一个状态对应于位置M1
,其在-10和10之间的范围。
当状态不对应于物理参数时,设置状态变量的范围可能是困难的,例如用于输出干扰模型状态。在这种情况下,使用具有典型参考和干扰信号的模拟来收集范围信息。对于此系统,您可以激活可选的埃斯特拉特
多MPC控制器块的出口,并使用范围查看估计的状态。在模拟控制器响应时,请使用覆盖预期工作范围的参考信号。
根据估计的状态范围定义显式MPC控制器的状态范围。
Range.state.min(:) = [-10; -8; -3];Range.state.max(:) = [10; 8; 3];
定义参考信号的范围。选择小于的引用范围M1
位置范围。
Range.Reference.min = -8;Range.Reference.max = 8;
使用定义的MV约束指定操纵变量范围。
Range.ManipuldVariaire.min = 0;Range.ManipuldVariaire.max = 30;
定义测量干扰信号的范围。由于测量的干扰是恒定的,因此在恒定值周围指定一个小范围,1
.
范围..MeasuredDisturbance.min = 0.9;Range.measureddisturbance.max = 1.1;
创建一个对应的显式MPC控制器MPC1
使用指定的范围对象。
expmpc1 = generateexplicitmpc(mpc1,范围);
地区找到/未开发:4/0
创建一个对应的显式MPC控制器MPC2
.自从MPC1
和MPC2
在相同的状态和输入范围内操作,并具有相同的约束,可以使用相同的范围对象。
expmpc2 = generateexplicitmpc(mpc2,范围);
地区找到/未开发:5/0
通常,不同控制器的显式MPC范围可能不匹配。例如,控制器可以具有不同的约束或状态范围。在这种情况下,为每个控制器创建一个单独的显式MPC范围对象。
在实现增益预定的显式MPC之前,验证每个显式MPC控制器的性能是良好的做法。例如,比较表现MPC1
和expMPC1
,仿真每个控制器的闭环响应sim卡
.
r = [零(30,1);5 *那些(160,1);-5 *(160,1)];[YIMP,TIMP,UIMP] = SIM(MPC1,350,R,1);[YEXP,TEXP,UEXP] = SIM(ExpMPC1,350,R,1);
- >将模型转换为离散时间。- >假设添加到测量的输出干扰,输出通道#1是集成的白噪声。- >“MPC”对象的“Model.Noise”属性为空。假设每个测量的输出通道上的白噪声。
比较两个控制器的植物输出和操纵变量序列。
图次要情节(2,1,1)情节(Timp Yimp,'b-',texp,yexp,“r——”网格)在Xlabel('时间(s)')ylabel('输出')标题('显式MPC验证') 传奇('隐含MPC'那'明确的MPC')子图(2,1,2)绘图(TIMP,UIMP,'b-',texp,Uexp,“r——”网格)在ylabel('mv')Xlabel('时间(s)'的)
隐式和显式控制器的闭环响应和操纵变量序列匹配。同样,您可以验证性能expMPC2
反对MPC2
.
如果隐式和显式控制器的响应不匹配,调整显式MPC范围,并创建一个新的显式MPC控制器。
为了实现增益调度的显式MPC控制,可以用“多显式MPC控制器”块代替“多显式MPC控制器”块。
expmodel ='mpc_switching_explict';open_system (expModel)
要指定显式MPC控制器,请双击多个显式MPC控制器块。在“块参数”对话框中,将控制器指定为控制器名称的单元格数组。将每个控制器的初始状态设置为其各自的标称值,通过指定状态{'[],'[]'}
.
点击好的.
如果之前验证了显式MPC控制器,则替换和配置多个显式MPC控制器块应产生与多MPC控制器块相同的结果。
运行仿真。
sim (expModel)
要查看仿真结果,请打开信号范围。
Open_System([ExpModel'/信号'])
增益计划的显式MPC控制器提供与增益计划的隐式MPC控制器相同的性能。
bdclose (“所有”的)