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可以返回:

  • 标准模型参数的默认值,如solver;
  • 模型参数的错误信息;
  • 使用add_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的回调函数的更多相关文章

  1. Simulink仿真入门到精通(十) S函数

    10.1 S函数概述 S函数也称为Simulink中的系统函数,是用来描述模块的Simulink宏函数,支持M.C等多种语言.当Simulink默认的模块不能满足用户的需求时,用户可以通过S函数自己打 ...

  2. Simulink仿真入门到精通(十九) 总结回顾&自我练习

    从2019年12月27到2020年2月12日,学习了Simulink仿真及代码生成技术入门到精通,历时17天. 学习的比较粗糙,有一些地方还没理解透彻,全书梳理总结: Simulink的基础模块已基本 ...

  3. Simulink仿真入门到精通(十八) TLC语言

    TLC(Target Language Compiler)是一种为转换为目标语言而存在的额解释性语言,其目的就是将模型中编译出来的rtw文件转换为目标代码(C/C++等).与M语言类似,既可以写成脚本 ...

  4. Simulink仿真入门到精通(十七) Simulink代码生成技术详解

    17.1 基于模型的设计 基于模型设计是一种流程,较之传统软件开发流程而言,使开发者能够更快捷.更高效地进行开发.适用范围包括汽车电子信号处理.控制系统.通信行业和半导体行业. V字模型开发流程整体描 ...

  5. Simulink仿真入门到精通(十四) Simulink自定义环境

    14.1 Simulink环境自定义功能 sl_sustomization.m函数是Simulink提供给用户使用MATLAB语言自定义Simulink标准人机界面的函数机制.若sl_sustomiz ...

  6. Simulink仿真入门到精通(十一) 模块的封装

    当用户编写了自定义的S函数或者使用Simulink标准库中的模块搭建子系统后,可以通过封装为其设计显示外观,追加参数对话框. 封装是构建一个以对话框为接口的交互界面的过程,它将复杂的模块逻辑关系隐藏起 ...

  7. Simulink仿真入门到精通(八) M语言对Simulink模型的自动化操作及配置

    8.1 M语言控制模型的仿真 M语言与Simulink结合的方式: 在Simulink模型或模块中使用回调函数 在M语言中调用与模型相关的命令,控制模型的建立,设置模块的属性,增删信号线,以及运行模型 ...

  8. Simulink仿真入门到精通(五) Simulink模型的仿真

    5.1 模型的配置仿真 由各种模块所构建的可视化逻辑连接,只是模型的外在表现,模型仿真的核心驱动器是被称作解算器(Solver)的组件,相当于Simulink仿真过程的心脏,驱动着模型仿真,它在每一个 ...

  9. Simulink仿真入门到精通(三) Simulink信号

    3.1 Simulink信号概述 所谓信号,表示一种随着时间而变化的量,在时间轴上的采样时刻都对应有数值. 信号在Simulink中是相当重要的组成部分,有线(line)表示,在模型中穿针引线地将各模 ...

随机推荐

  1. logstash output kafka ip 设置的坑

    原设置 output { kafka { acks => " enable_metric => false codec => "json" topic_ ...

  2. 蓝桥杯-PREV3-带分数

    有人管蓝桥杯叫暴力杯,现在感觉还是挺贴切的.看到这题首先想到让i从1到n循环,首先判断i中无重复数字,再怎样判断能否用剩下的数构成n - i的假分数.之后看了题解.发现思路错了. 总结两点: 1.蓝桥 ...

  3. Listary快速查找文件

    快速查找文件 https://www.listary.com/

  4. 全文检索ElasticSearch的简单使用笔记

    工具:kibana GET _search { "query": { "match_all": {} } } #创建索引结构 PUT sku { "m ...

  5. unittest(7)-作业- 全局变量传递cookie

    全局变量存储cookie 测试类中有多个测试函数 # 1.http_requset.py import requests class HttpRequest: def http_request(sel ...

  6. mybatis的通用mapper小结

    import tk.mybatis.mapper.entity.Example; //此包是tk下的1.定义一个dao层接口不需要任何方法 需要继承Mapper<类型> 2.在servic ...

  7. maven工程根项目运行ok但是子项目就报错的解决办法

    正常启动没错 项目出现问题 maven工程根项目运行ok但是子项目就报错 报错信息是xxxx没有创建 解决办法 原来是子项目的依赖少了  没有配置1.8  所以会出现莫明其妙的bug

  8. 使用 Hexo 在 GitHub 上建立博客 · Utopia's Daily Note

    使用 Hexo 在 GitHub 上建立博客 # 写在前面 其实我在一月份的就开始写了三篇博客文章,你没有看错,只是写了三篇,然后,就没有然后了.我还在其中一篇文章中写着,不知道自己能够坚持多久.事实 ...

  9. IBM Developer:Java 9 新特性概述

    Author: 成富 Date: Dec 28, 2017 Category: IBM-Developer (20) Tags: Java (27) 原文地址:https://www.ibm.com/ ...

  10. GIT 使用(二):创建仓库并提交代码

    基本操作 所用命令使用 windows 下安装 git-bash 运行 Table of Contents 先决条件 已经安装了 GIT 客户端 已经设置用户信息 如果没做可以看安装和配置 获取 Gi ...