为了使用户在数据初始化,模块拖曳和仿真结果绘图操作等过程中能够更加便利,表现力更加丰富,Simulink为用户提供了一系列的回调函数,使得模型和模块的动作,甚至跟模块端口相连接的信号的动作都能够由用户自定义,用户可以建立使用便利,具有个性化的模型执行过程。
Simulink中回调函数分为模型回调函数、模块回调函数、端口回调函数和参数回调函数。前面已经介绍了模型回调函数和模块回调函数,今天主要介绍端口回调函数和参数回调函数以及实例。****
1.端口回调函数
模块输入和输出端口的回调函数称为连接回调函数(Connection Callback),在任何时刻端口信号连接发生改变时都会触发此回调函数。 变化情况包括:从端口连接信号线到其他端口;从端口删除信号线连接;删除、切断或增加连接到端口的分支或信号线等。
端口的回调函数无法通过对话框手动填入,必须使用get_param获得端口的句柄,使用set_param 设置端口的回调函数。此回调函数含有一个输入参数,代表端口句柄,但在调用set_param 时不包括此输入参数。例如,假设选择的模块有一个输入端口。以下的代码片断将函数foo设置为输入端口的连接回调函数。
Matlab
phs =get_param(gcb,'PortHandles') ;
set_param(phs.Inport,'ConnectionCallback','foo');
foo函数定义格式如下:
Matlab
foo函数定义格式如下:function foo(portHandle)
......
2.参数回调函数
模块,特别是用户自定义模块上往往封装了自定义的控件来实现一些自定义功能,双击这个模块时就能打开模块的参数对话框。这时每个控件的回调函数需要用户来设计,如按下按钮打开文件,在编辑框输入数据后进行类型和范围检测等,都通过模块参数的回调函数来约束,类似于GUIDE控件的回调函数。这些回调函数可以在 Mask Editor对话框的Callbacks弹出框中进行编写。右击模块,选择 Mask,在弹出的Mask Editor对话框右侧单击Callbacks按钮,打开Callback Editor可以进行回调函数代码的编辑。常用控件的类型及其回调函数的触发条件参考如图所示。各种回调函数将通过实例展示其应用方法。


3.回调函数使用例程
3.1 打开模型时自动加载变量
当打开一个模型时,可使用PreLoadFcn回调函数自动预加载变量到Base Workspace。 在Simulink模型的不同部位,有些模块的参数使用变量表示,这样在仿真多组数据时,只需要变更这些参数赋值的语句即可,不需要打开模型或模块参数对话框进行修改。
例如,**现有一个模型包含增益模块Gain且增益为K,Simulink就会在 Base Workspace中搜寻变量K。**使用以下方法,可以在每次打开模型时自动定义K。可以在单独的M脚本中定义变量,如K,然后使用PreLoadFcn回调函数来执行此脚本。手动创建模型回调函数需要打开模型的 Model Properties对话框,选择Callbacks选项卡来编辑回调功能。用编程方式实现回调功能需要输入以下命令:
Matlab
set_param('mymodelname','PreLoadFcn','expression')
这里的expression代表MATLAB内建函数,或搜寻路径中的M脚本文件。
例如,假设模型名称为test28.slx,在 MATLAB定义变量的脚本名为loadvar,.m,其内容为K=10;在 Command Window中输人以下命令并按下回车:
Matlab
set_param('test28','PreLoadFcn','loadvar')

然后保存模型。当打开模型modelname 时, loadvar功能都会执行。可以看到 Base Work-space里出现此变量,如图所示。
3.2 双击模块执行MATLAB脚本
双击模块时,可以使用OpenFcn回调函数自动执行MATLAB脚本。MATLAB脚本可以实现多个任务,如为模块定义变量,访问MATLAB某部分仿真数据或生成GUI界面。
当打开一个模块时,OpenFcn会重载和执行与打开一个模块相关的动作(如打开模块的对话框或者进入子系统内部)。
手动创建模型回调函数需要打开模块的Block Properties对话框,选择Callbacks页面编辑回调功能。用编程方式实现OpenFcn回调功能需要先选中要实现此功能的模块,然后输入以下命令:
Matlab
set param( gcb, '0penFcn', 'expression')
这里的expression代表MATLAB内建命令或搜寻路径中的有效M脚本。
双击模型test.slx中某个名为mysubsystem 的子系统时,通过回调函数OpenFcn执行MATLAB脚本myfunction.m的命令为:
Matlab
set_param('test28/mysubsystem','OpenFcn','myfunction')

myfunction.m
Matlab
close all;
t = -2*pi:0.01:2*pi;
y = sin(t);
figure;
plot(t,y,'b-');
xlabel('x');
ylabel('y');

3.3 开始仿真前执行命令
仿真开始前,可使用StartFcn回调函数自动执行命令。如可实现在仿真开始前将模型中包含的所有Scope Blocks(示波器模块)打开并显示在最前端,免去仿真之后再去一一双击Scope模块的烦琐。
更确切地说,可以创建一个简单的MATLAB脚本,命名为openscope. m,然后保存在MATLAB搜寻路径里,具体如下:
Matlab
function openscope
%% 打开Simulink中的示波器
%实现在仿真开始前将模型中包含的所有Scope Blocks(示波器模块)打开并显示在最前端,免去仿真之后再去一一双击Scope模块的烦琐。
blocks = find_system(bdroot,'BlockType','Scope');
%bdroot函数 返回当前系统的顶层模型。当前系统是当前处于活动状态的 Simulink Editor 窗口或在其中选择了模块的系统。
for i = 1:length(blocks )
set_param(blocks{i},'Open','on');
end
在创建这个脚本后,打开一个带有scope模块的模型来设置StartFcn函数使模型调用此脚本:
Matlab
m
set_param(gcs,'StartFcn','openscope')
此后,在每次运行此模型仿真时,所有的Scope blocks(示波器模块)都会自动打开并显示在最前方,如图所示。

3.4 提示模块端口的连线情况
In模块拥有一个输出端口,对In模块输出端口的连线情况进行检测,并将连线情况通过msgbox弹出显示。首先获取In模块的输出端口句柄,并设置其端口回调函数为M函数connect_.msg,代码如下:
Matlab
phs = get_param(gcb,'PortHandles');
set_param(phs.Outport, 'ConnectionCallback','connect_msg');
connect_msg必须是一个以端口句柄作为参数的函数,通过In输出端口句柄获取Line属性,若为-1则为断开状态,否则表示该端口处于连接状态。Line属性的值表示In输出端口所连接的信号线的句柄,端口回调的函数connect_msg的内容为:
Matlab
function connect_msg(port_handle)
%% In模块拥有一个输出端口,对In模块输出端口的连线情况进行检测,并将连线情况通过msgbox弹出显示。
prop = get(port_handle);
if isequal(prop.Line,-1)
msg_str = 'Connection is broken!';
else
msg_str = 'Connection is on!';
end
msgbox(msg_str,'Connect');%消息窗口
In输出端口信号线的连接和断开操作均可触发上述端口回调函数,从而得到弹出信息。
4.参考内容
1\] 孙忠潇.Simulink仿真及代码生成技术入门到精通\[M\].北京:北京航空航天大学出版社,2015. 本文内容来源于网络,仅供参考学习,如内容、图片有任何版权问题,请联系处理,24小时内删除。