在毕设的过程中,要用脚本动态的控制mdl模型的运行。在编写脚本的过程中,有几个命令特别常用(open_system,find_system,set_param,get_param和close_system),这里总结一下它们的用法。
该函数的形式很多,常用的有:
open_system('sys')
open_system('blk')
open_system('blk', 'force')
open_system('blk', 'parameter')
open_system('blk', 'mask')
open_system('blk', 'OpenFcn')
open_system('sys', 'destsys', 'replace')
open_system('sys', 'destsys', reuse')
打开由sys指定的系统模型或子系统窗口。例子:
model='fir'; % 模型名称 % 打开模型 open_system(model);
该函数的使用形式:
find_system(sys, 'c1', cv1, 'c2', cv2,...'p1', v1, 'p2', v2,...),用来查找具有某种特性的模块、系统、线、端口或注释的路径或句柄。
如果sys是路径名或者路径名cell array,那么find_system返回它查找到的对象的路径名的cell array;
如果sys是句柄或句柄向量(vector),那么find_system返回它查找到的对象的句柄向量。
另外,在find_system中可以设置查找的方式,例如“SearchDepth”等,利用这些设置选项,可以灵活地查找对象。例如:
% 需要改变参数的模块 Qam_blocks=find_system(model,'lookundermasks','all','regexp','on','C','.*');
这句话就是允许深入封装模块、允许使用正则表达式来查找所有含有变量“C”的模块的路径名,Qam_blocks是个cell array。
该函数的使用形式:set_param(object, paramName1, Value1, ..., paramNameN, ValueN),用来设置系统或模块参数的值。
一般而言,对于大规模的对很多模块的同一参数设置相同的值(如很多模块都有参数C,整个模型系统中C的值是一致的),
一般而言是先用find_system找到这些模块的位置,再有set_param将这些模块的参数设置成相应的值。例如:
% 设置QAM映射参数 for temp=1:length(Qam_blocks) set_param(Qam_blocks{temp},'C',num2str(C(c_m))); end
对于set_param函数,有一点需要注意,参数的值ValueN一般要转换为string类型。
该函数的典型用法:
paramValue = get_param(object, paramName)
paramValues = get_param(objectCellArray, paramName)
paramValue = get_param(objectHandle, paramName)
paramValue = get_param(0, paramName)
paramStruct = get_param(object, 'ObjectParameters')
paramCellArray = get_param(object, 'DialogParameters')
与set_param相对应,用来获取参数的值。
该函数的用法:
close_system close_system('sys') close_system('sys', saveflag) close_system('sys', 'newname') close_system('sys', 'newname','ErrorIfShadowed', true)
与open_system函数相对应,用来关闭Simulink系统的窗口或对话框。
这个函数在对多个模型做仿真时很有用。
当然,Simulink的仿真命令还有很多:add_block,delete_block等等,本文只是介绍在脚本的编写中比较常用的。
最后附上一篇毕设中用到的典型脚本:
ebn0=10:2:30; % EbN0 C=5:8; % QAM映射方式,C=6代表128QAM,依次类推。 model='fir'; % 模型名称 % weight=[0.5]; % interp_option={'linear','gaussian','cubic spline','dft','general'}; % 插值类型的选择方式 interp_option={'general'}; % 插值类型的选择方式 error_fir=ones(length(interp_option),11); % BER统计矩阵,第一行是linear插值的BER,第二行是gaussian插值的BER,第三行是cubic % spline插值的BER,第四行是dft插值的BER,第五行是基于线性滤波器+线性插值的BER record_fir=cell(length(C),2); % 记录不同映射(C)方式下的各种插值方法的BER % 第一列记录C,第二列记录error_isi_fir(上面一句提到的矩阵). % 打开模型 open_system(model); % 需要改变参数的模块 Qam_blocks=find_system(model,'lookundermasks','all','regexp','on','C','.*'); EbNo_blocks=find_system(model,'RegExp','on','SearchDepth','1','EbNo','.*'); interp_blocks=find_system(model,'RegExp','on','SearchDepth','1','flag','.*'); for c_m=1:length(C) for interp_m=1:length(interp_option) % 设置QAM映射参数 for temp=1:length(Qam_blocks) set_param(Qam_blocks{temp},'C',num2str(C(c_m))); end % 设置插值方法 for temp=1:length(interp_blocks) set_param(interp_blocks{temp},'flag',interp_option{interp_m}); end for ebn0_m=1:length(ebn0) % 设置EbN0 for temp=1:length(EbNo_blocks) set_param(EbNo_blocks{temp},'EbNo',num2str(ebn0(ebn0_m))); end % 运行model sim(model); error_fir(interp_m,ebn0_m)=ber_fir(1); end end record_fir{c_m,1}=C(c_m); record_fir{c_m,2}=error_fir; end % 关闭model close_system(model,0);