但很多时候,需要在Simulink仿真过程中修改模块的对话框参数(称为在线修改或动态修改模块参数),如:希望在仿真过程中改变正弦波的频率,实现扫频信号;希望在仿真过程中改变增益模块增益值,实现变增益;希望在仿真过程中改变PID控制器增益,实现自适应的PID控制;希望在仿真过程中改变传递函数的分子或分母系数,实现时变的传递函数。
本文详细介绍Simulink如何在线修改(动态修改)模块参数的方法,并提供原创的Dynamic Change Parameter模块(简称DCP模块),可以轻松解决在线修改(动态修改)模块参数问题,提供详细帮助文件和大量例程,简单易用。
2. 方法
Simulink中的对话框参数有三种类型: Tunable(可调); Nontunable(不可调);SimOnlyTunable(不可动态调整)。需要动态调整的参数,必须为可调(Tunable)类型。
郑志波《Simulink 模块参缺拆皮数在线修改方法的研究》中提到了两种在线更新参数的方法:1. 使用全局变量,在m文件中动态修改全局变量的值,进而达到修改参数的目的;2. 使用set_param函数,在m文件中动态设置对话框参数。
经测试,第一种方法不可行。如下图所示,Modify_c函数中对全局变量进行动态更新,使c的取值由0每隔1s增加御伍至11,Simulink运行完成后全局变量的c更新为11,模型对全局变量的更新是成功的,但对话框参数并未随全局变量的改变而改变,增益c仍然为0。原因是:simulink模块对变量的读入只在模型初始化(或开始运行)的回调函数中执行,在仿真进行的过程中,尽管对话框参数的变量值改变了,但是系统并不会读取更新后的参数值,仿真中使用的参数值仍是变量的初始值0。
第二种方法是可行的,该方法可用S函数来实现,将模块名和参数名都作为S函数的参数,需要改变的参数值作为S函数的输入,在S函数的状态更新(Updata)回调函数中,使用set_param函数对对话框参数进行动态更新。
本人采用Level-2的S函数实现了上述第二种方法,并将其封装为模块形式(下文中称此模块为DCP模块),方便在其它模型中调用。
3. DCP模块
DCP模块经封装后,与Simulink自带模块完全相同,有两个输入端口,双击模块会d出属性对话框,可以在对话框中设置需要动态改变的模块参数信息。
输入接口:
接口1 [var]: 需要设定的参数值;
接口2[flag]: flag=0时忽略接口1的输入,不对参数进行更新;flag~=0时更新参数。
对话框参数:
模块名[block_name]: 格式为“mdl文件名/子模型名/模块名(tag)”,字符串形式;
参数名[par_name]: 需要动态修改的参数变量名,字符串形式,如需要修改增益模块的增益值,则输入“Gain”。一般来说,手动输入模块名、参数名比较复杂而且容易出错,模块中采用函数自动提取模块名和变量名,用户只需在所提供的GUI中作出选择即可。
重置[Reset] : 此复选框选中时,d出选择模块和参数设置GUI,如下图所示。
采样模式:1*2矩阵;设置模块的采样方式(与S函数中的采样方式定义相同)。
[0 offset] [ts offset] [-1, 0] [-2, 0]
连续采样时间,offset给定时间偏置 离散采样时间,ts为采样时间 继承采样时间,取决于上一模块的采样方式和时间 可变采样时间
参数维数:1*2矩阵,表示需要修改参数的维数(即接口1中输入数伏差据的维数),使用本模块必须保证参数的维数不变。
4. 使用
DCP模块配套文件(放置在DCPFiles文件夹内,源程序下载方式见文尾)有:
文件名 文件功能
Sfun_DCP.m Level-2的M文件编写的S函数,实现动态改变参数的功能
slblocks.m 将模块加入simulink模块浏览器的m文件,模块组名字为 User Defined Block
fig_par_set.m 模块属性中载入所需修改“模块/参数”的 GUI
m文件
AddFilePath.m 将文件加入Matlab搜索路径,首次使用DCP模块之前,需要运行本文件一次
str_bracket.m 功能是在在字符串头尾插入括号
User_Defined_MDL.slx 自定义模块的库文件,里面已含动态改变参数(程序中简称DCP)模块,可将需要加入模块浏览器的模块均放入此slx文件之中
使用步骤如下:
1) 将DCP文件夹放置在Matlab工作目录下;
2) 运行1次AddFilePath.m文件(仅首次使用DCP模块时需要执行此步骤);
3) 两种方式将DCP模块加入到Simulink中:方法一,打开Simulink Library Browser ->User Defined Block模块组 ->DCP模块 ->将DCP模块拖入Simulink模型中; 方法二,复制例程中的DCP模块至需要的Simulink模型中。
4) 双击DCP模块,d出属性设置对话框,点击Reset复选框,d出模块和参数设置GUI,选择需要在线修改的模块和参数,设置采样时间和参数维度,点击“OK”确定;
5) 将需要修改的参数值接入DCP模块的输入接口1,输入接口2用于进行时序控制,如不需要进行时序控制,输入接口2可以接入常数1。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)