1. 问题描述
假定有一个simulink仿真任务,需要针对同一个参考设置、同一个控制对象,运行两种控制算法,以比较算法效果。这时,你可以
- (1) 分别建立两个simulink模型,包括相同的参考、对象,不同的控制算法,然后两个模型分别仿真,并记录数据,一起绘图。
- (2)建立一个simulink模型,包括参考、对象,两种控制算法(如两个控制模块blocks, 组成一个subsystem),设置该subsytem为variant subsystem; 写一个运行脚本(.m文件),脚本中通过控制可变子系统的运行控制表达式,来实现simulink两种算法的分步运行和综合比较。
2. 实现原理
如下图中是一个subsystem, 当鼠标浮于下图中1时,会出现Variant expression model,说明这是一个可变子系统,即 variant subsystem,包含的Subsystem blocks 或者 Model blocks 是可变的,或者运行时包含的子系统模块或模型模块是可以变化和选择的!
- variant subsystem block 中最多只允许有一个子系统或模块同时运行。
- VSB 被预先配置为包含两个子系统块,用于作为Variant子系统的选择(即选择哪个来运行)。一个VSB可以包含子系统和模型块(model blocks)的混合。还可以包括Inport、Outport和Connection Port块。
- 如果内部是两个model blocks,则子系统成为variant model block (VMB)。
- VSB或VMB都与一个定义在global workspace中的variant control相关联,它来决定哪个variant system (subsystem or blocks)是活动的。
- variant control可以是条件表达式 (a Simulink.Variant object specifying a condition expression),或默认变量。评估结果为true的Variant control 确定活动的Variant system。
- 在仿真过程中,Simulink®禁用variant subsystem的非活动端口。
- 如果VSB->Outport block中选择了Specify output When source is unconnected选项时,可以指定一个非真值(任意指定)作为其输出。
3. 方法例子
前面的图是一个VSB,里面包含了两个variant subsystem,如下图,两个子系统是两种控制算法,具有相同的输入和输出。
在Simulink总模型界面,
-
建立一个variant subsystem(如下图)。本例已经建立如前述的VSB子系统。
-
点击model explorer (下图中1),打开界面(下图中2);
-
左侧面板点击VSB(即下图中3:Lane Following Controller);
-
右侧面板中出现VSB的block parameters (下图中4);
-
在下图5处选择默认方式,即variant control mode为’expression’;
-
在下图6和7处,分别选择两个variant subsystem的可变控制表达式(选项如何设置见下文),即当表达式为true时,激活(active)该模块,否则禁止(disable)该模块
-
在主程序控制脚本中,可通过设置全局变量(本例中为controller_type)来激活不同的模块,实现分步运行。
% First, simulate the model using nonlinear MPC. To do so, set
% |controller_type| to |1|.
controller_type = 1;% variant subsystem or variant model, set the Expression
sim(mdl) % simulink running the first block
logsout1 = logsout;
% Second, simulate the model using adaptive MPC. To do so, set
% |controller_type| to |2|.
controller_type = 2; % variant subsystem or variant model, set the Expression
sim(mdl) % simulink running the second block
logsout2 = logsout;
-
难点: 如何设置VSB的控制变量?
- 为了可以对VSB的控制变量选择进行编程,Simulink通过Simulink.Variant object,来与每个可选的模块进行联系。
- Simulink.Variant objects 在 MATLAB® global workspace 中创建,该对象包括属性名’Condition’, 它是一个表达式,其值是一个二值型,如果为true则可使联系的child subsystem激活
- 例如,定义如下代码:可以在 global workspace 中创建一个 Simulink.Variant object ,即 VSS_LINEAR_CONTROLLE,其中创建参数 (‘VSS_MODE==1’) 定义了该联系的variant何时被激活。然后,在Variant Subsystem dialog中, 可以将某个child subsystem 与VSS_LINEAR_CONTROLLER 对象联系起来。
- 通过编程一下代码(in the global workspace)可以激活 VSS_LINEAR_CONTROLLER 联系的child subsystem (variant)
VSS_LINEAR_CONTROLLER=Simulink.Variant('VSS_MODE==1');
VSS_MODE=1
- 第二种简单方法:可以直接在VSB->右键单击block parameters直接修改variant control expression
4. 总结
- VSB 或 VMB的两个子系统是排他的关系,每次仿真时只有一个是生效的,它由某个变量(global workspace)来控制。
- 每次模型加载时,会在基础工作区创建variant control变量。
5. 参考文献
可变子系统模块:
https://ww2.mathworks.cn/help/simulink/slref/variantsubsystem.html
可变子系统示例:
https://ww2.mathworks.cn/help/simulink/examples/variant-subsystems.html