目录

0. 概要

1. 在模块属性中直接指定

2. 从Matlab workspace获取初始化参数

3. 利用InitFcn回调函数进行初始化

4. 子系统的参数初始化

4.1 子系统顶层的参数配置

4.2 子系统内部的派生参数初始化计算 

4.3 参数映射关系

参考文献


0. 概要

        汇总介绍simulink建模中各种参数初始化方法。

1. 在模块属性中直接指定

图1 模型实例一

        如上图所示一个简单的simulink模型,两条支路分别用一个IIR滤波器对一个矩形波进行滤波。这个滤波器模型是simulink内置模型,其滤波器参数可以通过模块属性进行指定,双击模块会弹出其模块属性对话框(这里我们先设置上面那条支路的滤波器):

        如图所示将滤波器传输函数设置为G(s)=\frac{1}{0.3s+1}。仿真以上模型可以得到结果如下(矩形波发生器产生了一个在0.5秒从跳变到1然后又在1.5秒处从1跳变为0的矩形波。低通滤波器起到了将输入波形平滑化的作用):

 

2. 从Matlab workspace获取初始化参数

        如果在开发调试过程中模型参数需要反复调节优化,那么可以采取从Matlab workspace获取初始化参数的方式更为灵活高效。

        双击以上模型中第2条支路的滤波器模块,对它的传输函数的分子和分母进行参数化设置,如下所示:

        然后在matlab命令行窗口输入命令对a1和b1进行赋值:

a1=[1];
b1=[0.75,1];

         执行完后,再运行以上模型,可以得到结果如下,第2个滤波器的参数设置与第1个不同,所以它们的平滑效果也不相同。

         当参数比较多了以后,可以将这些参数初始化处理写到一个matlab脚本文件比如说init_set.m中,然后每次执行simulink模型之前先执行init_set脚本对simulink模型进行参数初始化。 

3. 利用InitFcn回调函数进行初始化

        上一节中,提到将参数初始化处理汇集到一个matlab脚本中,每次在simulink模型执行之前先执行脚本。可不可以进一步简化运行过程呢?太可以了。实际的大型模型开发中更为常用的方法是利用InitFcn回调函数进行初始化处理。

        在simulink模型空白处,右键点击Model Properties;

         选择Callbacks然后再选择InitFcn,在对话框中输入如下语句(m文件名称不带.m后缀,第一行的filename赋值不是必需的,那是用于另外的调试目的):

 

        这样,就可以直接运行simulink模型了。simulink模型一开始会自动先执行init_set.m脚本进行参数初始化。

        当然,如果参数数量比较少,直接将要执行的初始化语句写在这个对话框里的效果是相同的。

4. 子系统的参数初始化

        对于复杂的系统的模型,通常会采用将一些处理封装为一个子系统,这样做的好处是通过将模型层次化,不同的设计细节在不同的层次进行处理,有助于提高大型模型的开发和调试效率。

        子系统可以有独立于顶层模型初始化处理的自己的参数初始化处理。子系统创建不在本文描述范围之内,这里仅以本文作者开发的一个模型的情况为例进行说明。如下图所示为顶层模型结构图:

4.1 子系统顶层的参数配置

        其中DBE为一个封装子系统。双击该模块可以看到这个子系统的模块属性。

        在这个模块属性对话框中定义这个子系统的一系列的基本属性参数(相对于后面要说的派生参数),这些参数采用的固定设置(因为已经完成了参数设计优化。当然,它们也可以如前面所述的那样由顶层的init_set.m进行初始化设置)。

4.2 子系统内部的派生参数初始化计算 

        在这个子系统内部包含一系列的处理(以下所示为其中一部分),其中有若干个滤波器,这些滤波器的参数是依赖于上节所示的子系统的基本属性参数的,即是说,需要在这些顶层参数确定后进行计算而得。最原始(但是很低效)的方式当然是,在顶层属性参数确定后计算这些滤波器的参数,然后以常数的方式对这些滤波器进行参数配置。

        在子系统中也有类似于顶层模型那种基于回调函数的参数初始化处理方式。 右键选中子系统模块,在下拉菜单选择“Mask”,然后再选择“Edit Mask”,如下图所示:

         在弹出的对话框中选择“Initialization”得到如下对话框:

         在“Initialization commands”栏输入初始化处理语句即可。在本例中,将这些初始化处理语句写到一个脚本DBE_set中进行统一执行,形式如下所示:

4.3 参数映射关系

        细心的小伙伴可能注意到了,这个初始化脚本DBE_set.m用到了fL、fH等参数,它们也同时出现在上图的左侧,那这些参数从何而来呢?这些参数可以直接来自顶层的初始化(即从Matlab workspace获取),但是,将所有各子系统的参数都统一到最顶层处理并不是一个明智的做法(特别是对于复杂的大系统的开发来说)。事实上,其中个别参数比如说fs2的确是属于系统顶层参数,因此是来自于顶层模型的初始化。

        本例中,这些是属于子系统的基本属性参数,它们是来自于“4.1”节中所示的模块属性对话框中的设置,但是在模块属性对话框中并没有给出参数名啊?这个参数名与模块属性对话框中设置是如何建立的呢?答案是4.2节所示图中“Initialization” Tab旁边的“Parameters&Dialog”Tab。点选“Parameters&Dialog”Tab,可以看到以下对话框:

        这个对话框的作用就是建立模型属性对话框中所设置的参数与参数变量名的对应关系,经过这个对应关系的建立后,在DBE_set.m中就可以引用这些参数并进行派生参数的计算。

        所以子系统参数初始化设置的一个基本流程为:

  1. 在模型参数对话框中指定子系统的基本属性参数
  2. 在Mask Editor对话框的“Parameters&Dialog”对话框中建立基本属性参数与参数变量名的对应关系
  3. 在模型内部直接引用这些参数
  4. 基于这些参数进行派生参数计算,并将派生参数计算处理脚本添加到Mask Editor对话框的“Initialization”对话框中

参考文献

【1】在simulink仿真中如何设定初始条件-百度经验 (baidu.com)

【2】

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐