Simulink仿真入门到精通(七) Simulink的回调函数
7.1 什么是回调函数
Callback functions(回调函数)是因某种操作而除法对其调用的函数,如按下按钮或双击操作等。
常用的Simulink回调函数可应用在以下场合:
- 打开Simulink模型时自动加载变量到工作空间
- 双击模型时执行MATLAB脚本
- 仿真开始前进行模型参数的初始化
- 仿真结束后将仿真出来的数据绘制图像
- 关闭模型时清除相关变量或关闭图像
7.2 回调跟踪
>> set_param(0,'CallbackTracing','on')
7.3 模型回调函数
File→Model Properties→Model Properties

callbacks区域显示各个回调函数的名字,从上到下按照时间先后顺序排列。
选中其中任意一个,右侧变为所选回调函数的内容编辑框。
>> uiopen('C:\Users\lenovo\Desktop\chap07_07_02_mdl.slx',1)
Evaluating callback 'PreLoadFcn' for chap07_07_02_mdl
Callback: Welcome to Simulink model!
也可以通过代码来实现。
set_param('chap07_07_02_mdl','PreLoadFcn','msgbox("Welcome to Simulink model!","HyoCustom")')
打开模型时弹出。

>> sldemo_clutch
Evaluating callback 'PostLoadFcn' for sldemo_clutch
Callback: sldemo_clutchplot
Evaluating callback 'StartFcn' for sldemo_clutch
Callback: sldemo_clutchplot Start
Evaluating callback 'CloseFcn' for sldemo_clutch
Callback: sldemo_clutchplot Close


模型回调函数:
| 参数 | 执行时间及用途 |
| PreLoadFcn |
在模型加载前调用。 在PreLoadFcn回调函数中,命令get_param不能返回模型中模块的参数值,因为此时模型还没有加载完成。 在PreLoadFcn回调函数中,get_param可以返回:
|
| PostLoadFcn | 模型加载后调用。在改回调函数中可以获取模型中模块的参数值,因为此时模型已经加载完成。 |
| InitFcn | 在模型仿真开始时调用 |
| StartFcn | 在仿真开始前调用 |
| PauseFcn | 在仿真暂停后调用 |
| ContinueFcn | 在仿真继续时调用 |
| StopFcn | 在仿真结束后调用,如果需要在StopFcn中写代码,则对己被写入Workspace中的变量或对文件里的数据进行操作,或者进行绘图等动作 |
| PreSaveFcn | 在模型被保存前调用 |
| PostSaveFcn | 在模型被保存后调用 |
| CloseFcn | 在模型被关闭之前调用 |
注意被其他模型引用的模型中可能存在回调函数的冲突。
7.4 模块回调函数
右击模块,打开属性对话框,在第三个标签页可以设置回调函数。

或者通过代码进行设置。
set_param(gcbh,'DeleteFcn','msgbox("This block is being deleted!")');

模块回调函数:
| 回调函数 | 何时执行 |
| ClipboardFcn | 当模块被拷贝或剪切到系统剪贴板时调用 |
| CloseFcn | 当使用close_system命令关闭模块时调用 |
| ContinueFcn | 在仿真继续时调用 |
| CopyFcn | 在模块被拷贝时调用 |
| DeleteChildFcn |
当子系统中一个模块或信号线被删除后调用 只有子系统含有此回调函数 |
| DeleteFcn | 在一个模块图标被删除后调用 |
| DestroyFcn | 当模块已经在内存中销毁时调用 |
| InitFcn | 模块被编译前及模块参数被求值之前调用 |
| ErrorFcn |
当子系统出现错误时调用 只有子系统含有此回调函数 |
| LoadFcn | 在模块框图加载之后调用 |
| ModelCloseFcn | 在模型关闭之前调用 |
| MoveFcn | 在模块被移动或改变大小时调用 |
| NameChangeFcn | 在模块的名字或路径改变后调用 |
| OpenFcn | 当模块被打开时调用 |
| ParentCloseFcn | 在关闭一个含有模块的子系统前调用 |
| PauseFcn | 在仿真暂停后调用 |
| PostSaveFcn | 在模型被保存后调用 |
| PreCopy | 在模块被拷贝前调用 |
| PreDeleteFcn | 在模块删除图标前被调用 |
| PreSaveFcn | 在模型被保存前调用 |
| StartFcn | 在模型编译开始和仿真开始前调用 |
| StopFcn | 在仿真终止时调用 |
| UndoDeleteFcn | 当模块的删除动作被取消时调用 |
7.5 端口回调函数
模块输入和输出端口的回调函数称为连接回调函数,在任何时刻端口信号连接发生改变时都会触发此回调函数。变化情况包括:
- 从端口连接信号线到其他端口
- 从端口删除信号线连接
- 删除、切断或增加连接到端口的分支或信号线等
端口的回调函数必须使用set_param设置。
phs=get_param(gcb,'PortHandles');
set_param(phs.Inport,'ConnectionCallback','foo'); function foo(portHandle)
...
7.6 参数回调函数
右击模块Mask→Create/Edit Mask→Callbacks
模块参数回调函数的触发条件:
| 控件类型 | 何时执行 |
| Edit | 当被选中的编辑框内容被编辑之后失去焦点时 |
| Check-box | 当勾选框被选中或取消 |
| Popup | 当从下拉框中选择某个值时 |
| RadioButton | 当从RadioButton的选择项目中选中一项或更改选择时 |
| Hyperlink | 当单击超链接时 |
| Pushbutton | 当按下按钮时 |
7.7 回调函数使用例程
7.7.1 打开模型时自动加载变量
建立模型,增益为K。

设置回调函数。
set_param('mymodel','PreLoadFcn','loadvar');

打开模型,即可在工作去自动加载变量K。

7.7.2 双击模块时执行MATLAB脚本
set_param('mymodelname/mysubsystem','OpenFcn','myfunction');
7.7.3 开始仿真前执行命令
在运行仿真时将模型中所包含的所有示波器模块打开并显示在最前端。
%open_scope.m
blocks = find_system (bdroot, 'BlockType', 'Scope');%bdroot指当前系统的顶层模型
for ii = 1: length (blocks)
set_param (blocks {ii}, 'Open', 'on');
end
set_param(gcs,'StartFcn','open_scope');
7.7.4提示模块端口的连线情况
function connect_msg(port_handle)
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');
phs=get_param(gcb,'PortHandles');%选中模块In1
set_param(phs.Outport,'ConnectionCallback','connect_msg');



7.7.5 统计模型中所有模块信息


%listblock_callback
function listblock_callback(action)
switch action
case 'g_list'
block_h = find_system(gcs, 'findall', 'on','Type', 'block');
len = length(block_h);
block_name = get_param(block_h(1), 'Name');
for ii = 2:len
block_name = [block_name, '|', get_param(block_h(ii), 'Name')];
end
mask_styles = get_param(gcbh, 'MaskStyles');
mask_styles{2} = ['radiobutton(' ,block_name, ')'];
set_param(gcbh, 'MaskStyles', mask_styles);
case 'g_enable'
val = get_param(gcbh, 'g_enable');
if strcmp(val, 'on')
mask_visibility = {'on','on'};
else
mask_visibility = {'on','off'};
end
set_param(gcbh, 'maskvisibilities', mask_visibility);
otherwise
errordlg('Not defined operation!');
end

Simulink仿真入门到精通(七) Simulink的回调函数的更多相关文章
- Simulink仿真入门到精通(十) S函数
10.1 S函数概述 S函数也称为Simulink中的系统函数,是用来描述模块的Simulink宏函数,支持M.C等多种语言.当Simulink默认的模块不能满足用户的需求时,用户可以通过S函数自己打 ...
- Simulink仿真入门到精通(十九) 总结回顾&自我练习
从2019年12月27到2020年2月12日,学习了Simulink仿真及代码生成技术入门到精通,历时17天. 学习的比较粗糙,有一些地方还没理解透彻,全书梳理总结: Simulink的基础模块已基本 ...
- Simulink仿真入门到精通(十八) TLC语言
TLC(Target Language Compiler)是一种为转换为目标语言而存在的额解释性语言,其目的就是将模型中编译出来的rtw文件转换为目标代码(C/C++等).与M语言类似,既可以写成脚本 ...
- Simulink仿真入门到精通(十七) Simulink代码生成技术详解
17.1 基于模型的设计 基于模型设计是一种流程,较之传统软件开发流程而言,使开发者能够更快捷.更高效地进行开发.适用范围包括汽车电子信号处理.控制系统.通信行业和半导体行业. V字模型开发流程整体描 ...
- Simulink仿真入门到精通(十四) Simulink自定义环境
14.1 Simulink环境自定义功能 sl_sustomization.m函数是Simulink提供给用户使用MATLAB语言自定义Simulink标准人机界面的函数机制.若sl_sustomiz ...
- Simulink仿真入门到精通(十一) 模块的封装
当用户编写了自定义的S函数或者使用Simulink标准库中的模块搭建子系统后,可以通过封装为其设计显示外观,追加参数对话框. 封装是构建一个以对话框为接口的交互界面的过程,它将复杂的模块逻辑关系隐藏起 ...
- Simulink仿真入门到精通(八) M语言对Simulink模型的自动化操作及配置
8.1 M语言控制模型的仿真 M语言与Simulink结合的方式: 在Simulink模型或模块中使用回调函数 在M语言中调用与模型相关的命令,控制模型的建立,设置模块的属性,增删信号线,以及运行模型 ...
- Simulink仿真入门到精通(五) Simulink模型的仿真
5.1 模型的配置仿真 由各种模块所构建的可视化逻辑连接,只是模型的外在表现,模型仿真的核心驱动器是被称作解算器(Solver)的组件,相当于Simulink仿真过程的心脏,驱动着模型仿真,它在每一个 ...
- Simulink仿真入门到精通(三) Simulink信号
3.1 Simulink信号概述 所谓信号,表示一种随着时间而变化的量,在时间轴上的采样时刻都对应有数值. 信号在Simulink中是相当重要的组成部分,有线(line)表示,在模型中穿针引线地将各模 ...
随机推荐
- 10X genomics|cell base|in-vivo based|model organisms|SBI|
生命组学-药物基因组学 精准医学的内容有个人全基因组测序,移动可穿戴设备,它可以实时监测,深度学习模型预测疾病,对疾病预测做到有效.安全和可控. 药物基因组学就是研究疾病.化合物和靶点之间的关系,关键 ...
- Yii2创建管理员登录
1. 创建管理员表 进入项目根目录,在根目录执行命令: 1 $ ./yii migrate 2. 创建管理的控制器 1 $ cd console/controllers/ 编写代码如下: 123456 ...
- jenkins使用(3)-设置定时任务
配置时间如果错误,代码不会运行 *表示任意时刻
- byte的取值范围是-128~127,那么包含-128和127吗?
本帖最后由 王德升老师 于 2019-12-27 17:56 编辑 byte的取值范围为什么是-128~127?如果面试官问你取值范围包含127吗?1. 首先我们知道Java中byte类型是1个字节占 ...
- CIA Hive Beacon Infrastructure复现1——使用Apache mod_rewrite实现http流量分发
0x00 前言 2017年11月9日维基解密公布一个代号为Vault8的文档,包含服务器远程控制工具Hive的源代码和开发文档.开发文档中的框架图显示Hive支持流量分发功能,若流量有效,转发至Hon ...
- BufferedReader中文乱码解决
做一个从windows cmd截获命令返回值的java程序,结果截回来的文字中所有的中文都是乱码 Microsoft Windows [�汾 6.1.7260] ��Ȩ���� (c) 2009 Mi ...
- Proto3:C++ API概览
包名 说明 google::protobuf Protocol Buffer运行时库核心组件. google::protobuf::io I/O操作辅助类. google::protobuf::uti ...
- iPhone8的十面埋伏
不知不觉,iPhone已经走到了第十个年头,也正因如此,业界最普遍的预测就是:iPhone8会出现颠覆性创新,让人眼前一亮的同时,给苹果再度续命.平心而论,苹果早就青史留名,创造了大量的奇迹,科技 ...
- Microsoft Translator发布粤语文本翻译
今天,Microsoft Translator发布了粤语的文本翻译,新的语言增加将继续丰富微软翻译产品的生态系统*,让更多组织和个人能够快速且高效地实现翻译应用.在中国,大有约5500万人使用粤语(语 ...
- 如何在自己的CSDN博客中增添【高大上】的博客栏目?
前几天看到过一位博主的博客界面,向下看 ☟ (博主对不起啊!把你的公众号给抹了~~~),感觉做这个东西挺好玩的,而且我竟然找不到在哪个地方可以设置!在百度上也没有搜到教程,最后问了一下贺老师知道了入口 ...