Simulink高级应用-利用 variant subsystem/variant block 实现多个子模块的分步运行和综合比较

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)该模块

    扫描二维码关注公众号,回复: 15363418 查看本文章
  • 在主程序控制脚本中,可通过设置全局变量(本例中为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

猜你喜欢

转载自blog.csdn.net/kuvinxu/article/details/117556699