Simulink仿真命令的应用

    在毕设的过程中,要用脚本动态的控制mdl模型的运行。在编写脚本的过程中,有几个命令特别常用(open_system,find_system,set_param,get_param和close_system),这里总结一下它们的用法。

  • open_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

该函数的使用形式:

 

 

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

该函数的使用形式: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类型。

  • get_system

该函数的典型用法:

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
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);

 

 

 

你可能感兴趣的:(matlab,system,object,脚本,c,正则表达式,vector)