百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

Simulink的回调函数(一)

bigegpt 2024-09-10 11:21 4 浏览

为了使用户在数据初始化,模块拖曳和仿真结果绘图操作等过程中能够更加便利,表现力更加丰富,Simulink为用户提供了一系列的回调函数,使得模型和模块的动作,甚至跟模块端口相连接的信号的动作都能够由用户自定义,用户可以建立使用便利,具有个性化的模型执行过程。


1.回调函数的定义

Callback functions(回调函数)是因某种操作而触发对其调用的函数,如按下按钮或双击操作等。对于模型来说,回调函数在Simulink中起着举足轻重的作用。当执行一系列动作,如选中某个模块或仿真开始时,回调函数便被触发执行。使用回调功能可用来执行一个MATLAB脚本或调用MATLAB函数。Simulink 中回调函数的触发可通过模块、端口或模块的参数设置来实现。

常用的Simulink回调函数可应用在以下场合:

打开Simulink模型时自动加载变量到工作空间;
双击模块时执行MATLAB脚本;
仿真开始前进行模型参数的初始化;
仿真结束后将仿真出来的数据绘制图像;
关闭模型时清除相关变量或关闭图像。

2.回调跟踪

当打开模型或对某个模型进行仿真时,回调跟踪功能可以清楚显示 Simulink如何调用回调函数以及以何种顺序调用它们。在Preferences对话框中选择Callback tracing选项或者在Command Window中执行set_param(0,'CallbackTracing', 'on') ,即可打开回调跟踪功能。回调函数被调用时,在MATLAB命令窗口中将显示回调列表。这个选项对所有Simulink 软件都适用,而不仅仅对于当前打开的模型。如单击 MATLAB工具栏Simulink Library按钮打开Simulink Library Browser时会显示回调函数过程。

>> set_param(0,'CallbackTracing','on')
Evaluating callback 'PostLoadFcn' for simulink
Callback: setsysloc_simulink(bdroot)
Evaluating callback 'LoadFcn' for simulink/Sources/Waveform Generator
Callback: set_param(gcb,'LoadFlag','1');
Evaluating MaskInitialization for 'simulink/Sources/Waveform Generator': 'if (isequal(LoadFlag,'1'))     derivedSignals.DSMaskLoad(gcbh); end  if (isequal(ApplyFlag,'1'))    ...'.
Evaluating callback 'LoadFcn' for simulink/Sources/Signal Builder
Callback: sigbuilder_block('load');
Evaluating MaskInitialization for 'simulink/Sources/Signal Builder': 'if ~strcmp(get_param(bdroot(gcbh),'SimulationStatus'),'stopped') tuvar = sigbuilder_block('maskInit'...'.
Evaluating callback 'LoadFcn' for simulink/Sinks/XY Graph
Callback: sfunxy([],[],[],'LoadBlock')
Evaluating callback 'LoadFcn' for simulink/Model-Wide Utilities/Model Info
Callback: slcm LoadBlock;
Evaluating callback 'LoadFcn' for simulink/Math Operations/Slider Gain
Callback: sliderGain_cb(gcbh, 'load');

开启了回调函数追踪功能之后,可以显示任何类型的回调函数执行过程。Simulink中回调函数分为模型回调函数、模块回调函数、端口回调函数和参数回调函数。


3.模型回调函数

可以通过手动或程序⒉种方式创建模型回调函数。在模型菜单中选择MODELING→Model Properties可以打开模型属性对话框,如图所示。

回调函数说明

在对话框中选择Callbacks选项卡可手动创建模型的回调功能。上图左侧的Modelcallbacks区域显示各个回调函数的名字,表征了被调用的时刻,从上到下按照时间先后排序。选中其中任意一个,右侧则变为所选回调函数的内容编辑框。如在左侧选中PreLoadFcn 时右侧编辑框上面变为Model preload function,这时可在编辑框中编写函数内容。

在 Command Window或M脚本文件中可以通过M代码设置模型的回调函数。使用set_param命令指定一个MATLAB表达式,这个表达式表示回调函数的内容。举例说明set _ param设置回调函数的方法:当双击test28.slx打开它时,同时会启动一个消息框显示“欢迎来到微信公众号云龙派 !”的字符串,如图所示。

set_param('test28','PreLoadFcn','msgbox("欢迎来到微信公众号云龙派","information")');

注:set_param的参数均以字符串形式输入;最后一个参数为回调函数的MATLAB代码内容;作为字符串形式传递给 set_param的第三个参数要以单引号括起来。由于msgbox函数中也需要单引号括起来的字符串,因此就出现了字符串中嵌套字符串的情况,这时最外层的字符串使用单引号括起来,内部的单引号全部改用双单引号。

通过MATLAB提供的demo模型clutch系统(sldemo_clutch. mdl)可查看同时使用多个回调功能的情况。这个模型定义的回调函数包括:PreLoadFcn、PostLoadFcn , StartFcn,StopFcn和 CloseFcn。

在Command Window中输入sldemo_clutch并按下回车,可打开下图的离合器锁止模型:

>> sldemo_clutch
Evaluating callback 'PostLoadFcn' for sldemo_clutch
Callback: sldemo_clutchplot
>> 

运行此模型的仿真会出现一个GUI面板,勾选输入/输出则会将相应的变量显示到图形界面,如图所示。绘制出的图形和弹出的GUI控制面板是通过StartFcn和 StopFcn回调函数实现的。


4.模块回调函数

可以通过手动或者M代码创建模块回调函数。手动创建模块的回调函数时通过模块回调函数的对话框实现。右击模块,在右键菜单里选择properties打开模块属性对话框,其第三个页面是Callbacks列表和回调函数内容编辑框,如图所示。

回调函数说明

注意:如果一个 Simulink模型已经通过MATLAB函数或脚本内部加载,并执行编译或仿真,则不要在模型内回调函数或模块回调函数中调用run命令,这样做会带来意想不到的后果(如产生错误或不正确的结果)。

图中左侧罗列了21个回调函数,可选中其中一个,在右侧填人回调函数的代码内容。或者使用set_param指定一个 MATLAB表达式作为某个回调函数的内容。如设定某模块被删除时显示字符串“This block is being deleted.” ,在命令窗口中输入下面的代码并按回车执行:

>> get_param(gcbh,'Name')


ans =


    'Gain'


>> set_param(gcbh,'DeleteFcn','msgbox("This block is being deleted")')
>> 

命令执行之后,在保证选中该模块的情况下按下Delete键,模块会被删除,并弹出如图所示的消息框。

注意:一个封装子系统的回调函数不能直接引用封装子系统的参数。因为Simulink 在Base Workspace计算模块回调函数的值,而封装的参数存在于封装子系统的私有MaskWorkspace 中,必须使用get_param来获取封装的参数值。例如, get_param(gcb, 'g_gain'),在这里参数gain是该子系统封装之后的封装参数名。


5.参考内容

[1] 孙忠潇.Simulink仿真及代码生成技术入门到精通[M].北京:北京航空航天大学出版社,2015.


本文内容来源于网络,仅供参考学习,如内容、图片有任何版权问题,请联系处理,24小时内删除。


作 者 | 郭志龙
编 辑 | 郭志龙
校 对 | 郭志龙

相关推荐

Go语言泛型-泛型约束与实践(go1.7泛型)

来源:械说在Go语言中,Go泛型-泛型约束与实践部分主要探讨如何定义和使用泛型约束(Constraints),以及如何在实际开发中利用泛型进行更灵活的编程。以下是详细内容:一、什么是泛型约束?**泛型...

golang总结(golang实战教程)

基础部分Go语言有哪些优势?1简单易学:语法简洁,减少了代码的冗余。高效并发:内置强大的goroutine和channel,使并发编程更加高效且易于管理。内存管理:拥有自动垃圾回收机制,减少内...

Go 官宣:新版 Protobuf API(go pro版本)

原文作者:JoeTsai,DamienNeil和HerbieOng原文链接:https://blog.golang.org/a-new-go-api-for-protocol-buffer...

Golang开发的一些注意事项(一)(golang入门项目)

1.channel关闭后读的问题当channel关闭之后再去读取它,虽然不会引发panic,但会直接得到零值,而且ok的值为false。packagemainimport"...

golang 托盘菜单应用及打开系统默认浏览器

之前看到一个应用,用go语言编写,说是某某程序的windows图形化客户端,体验一下发现只是一个托盘,然后托盘菜单的控制面板功能直接打开本地浏览器访问程序启动的webserver网页完成gui相关功...

golang标准库每日一库之 io/ioutil

一、核心函数概览函数作用描述替代方案(Go1.16+)ioutil.ReadFile(filename)一次性读取整个文件内容(返回[]byte)os.ReadFileioutil.WriteFi...

文件类型更改器——GoLang 中的 CLI 工具

我是如何为一项琐碎的工作任务创建一个简单的工具的,你也可以上周我开始玩GoLang,它是一种由Google制作的类C编译语言,非常轻量和快速,事实上它经常在Techempower的基准测...

Go (Golang) 中的 Channels 简介(golang channel长度和容量)

这篇文章重点介绍Channels(通道)在Go中的工作方式,以及如何在代码中使用它们。在Go中,Channels是一种编程结构,它允许我们在代码的不同部分之间移动数据,通常来自不同的goro...

Golang引入泛型:Go将Interface「」替换为“Any”

现在Go将拥有泛型:Go将Interface{}替换为“Any”,这是一个类型别名:typeany=interface{}这会引入了泛型作好准备,实际上,带有泛型的Go1.18Beta...

一文带你看懂Golang最新特性(golang2.0特性)

作者:腾讯PCG代码委员会经过十余年的迭代,Go语言逐渐成为云计算时代主流的编程语言。下到云计算基础设施,上到微服务,越来越多的流行产品使用Go语言编写。可见其影响力已经非常强大。一、Go语言发展历史...

Go 每日一库之 java 转 go 遇到 Apollo?让 agollo 来平滑迁移

以下文章来源于GoOfficialBlog,作者GoOfficialBlogIntroductionagollo是Apollo的Golang客户端Apollo(阿波罗)是携程框架部门研...

Golang使用grpc详解(golang gcc)

gRPC是Google开源的一种高性能、跨语言的远程过程调用(RPC)框架,它使用ProtocolBuffers作为序列化工具,支持多种编程语言,如C++,Java,Python,Go等。gR...

Etcd服务注册与发现封装实现--golang

服务注册register.gopackageregisterimport("fmt""time"etcd3"github.com/cor...

Golang:将日志以Json格式输出到Kafka

在上一篇文章中我实现了一个支持Debug、Info、Error等多个级别的日志库,并将日志写到了磁盘文件中,代码比较简单,适合练手。有兴趣的可以通过这个链接前往:https://github.com/...

如何从 PHP 过渡到 Golang?(php转golang)

我是PHP开发者,转Go两个月了吧,记录一下使用Golang怎么一步步开发新项目。本着有坑填坑,有错改错的宗旨,从零开始,开始学习。因为我司没有专门的Golang大牛,所以我也只能一步步自己去...