simulink模型、模块、端口、GUI回调函数

本文深入探讨了Simulink中的回调函数概念及其应用,包括model、block、端口及GUI回调函数的设置与功能。通过实例展示了如何利用回调函数响应特定事件,如模型关闭、模块属性变化等,为读者提供了实用的编程技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

回调函数的概念及作用

回调是当某些事件发生时被调用的方法,例如在玩游戏时,键盘上键可以控制方向向上,是因为按下上键时,此事件被调用且被识别,让电脑知道你要向上走。

model的回调函数,为什么只显示CloseFcn

1.新建model,找到model explorer
在这里插入图片描述
2.在edit下找到properties

Alt
3.点击callback,并在CloseFcn下用disp函数写出对应函数名,最后点击ok,在关闭model前需要保存,不然callback里的设置会消失
Alt

当关闭model时,matlab命令行会显示CloseFcn

Alt
4.InitFcn的用法
Constant value设为A变量
在这里插入图片描述
Alt
Scope中就显示10

5.更多用法可用help文档搜索Model Callbacks,找到Model Callback Parameter,(中文文档链接链接: link.找到模型回调参数)
在这里插入图片描述

block的回调函数

1.对模块进行回调,例如以下两个模块
注意这里只是对一个模块(constant)使用回调函数
在这里插入图片描述
2.在constant模块下点击右键,选择properties/属性
Alt
3.同model回调函数,通过添加disp函数,可执行相应动作触发事件,了解回调函数
Alt

模块端口的回调函数

当对信号线进行处理时发生的事件
这里只对红色处的端口进行回调函数
在这里插入图片描述
1.选中subsystem模块,在命令行或脚本输入以下

%得到所选模块的属性
get(gcbh);
%得到属性PortHandles的参数
port_h = get_param(gcb,'PortHandles');
%查看Inport属性
get(port_h.Inport);
%设置inport的ConnectionCallback
%my_callback是设置的一个函数
set_param(port_h.Inport,'ConnectionCallback','my_callback');

2.my_callback函数

function my_callback(~)
disp('ConnectionCallback called');
end

3.当这条线连接或断开时,在命令行会出现ConnectionCallback called
在这里插入图片描述

自定义控件GUI的回调函数

1.model插入subsystem模块

在这里插入图片描述

2.右键mask

Alt

3.icon/图标&port可以设置属性

Alt
在这里插入图片描述

4.创建简单GUI

在这里插入图片描述
2.
在这里插入图片描述
3.
在这里插入图片描述
4.效果:
在这里插入图片描述
5.使用callback控制Parameter,要求User不勾选时,不显示Mode和Pullup,Mode为Output时不显示Pullup,先对Use Pin
进行callback
在这里插入图片描述
代码

usepin = get_param(gcbh,'g_use');
mode = get_param(gcbh,'g_mode');
mask_v = get_param(gcbh,'MaskVisibilities');
if strcmp('on',usepin)
    mask_v{2} = 'on';
    if strcmp('Input',mode)
        mask_v{3} = 'on';
    else
        mask_v{3} = 'off';
    end
else 
    mask_v{2} = 'off';
    mask_v{3} = 'off';
end
set_param(gcbh,'MaskVisibilities',mask_v)

6.对Mode进行callback,其代码为

mode= get_param(gcbh,'g_mode');
mask_v = get_param(gcbh,'MaskVisibilities');
if strcmp('Input',mode)
    mask_v{3} = 'on';
else
    mask_v{3} = 'off';
end
set_param(gcbh,'MaskVisibilities',mask_v)
在MatlabGUI里面启动或者暂停Simulink模型-start_and_stop_gui.m 针对这个问题:https://www.ilovematlab.cn/thread-23233-1-1.html 现在我做一个集中解答,从mathworks那里学习了一下。 第一步:创建你自己的Simulink模型,这个不用我讲吧,我们使用以下模型做演示: start_and_stop.mdl 第二步:创建自己的GUI, 这个论坛里也有例子,我们使用以下文件。 start_and_stop_gui.fig start_and_stop_gui.m Figure12.jpg 在start simulation里面,直接用sim函数,这个大家好像都会: % --- Executes on button press in startsim. function startsim_Callback % hObject handle to startsim % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data modelname = get; stoptime = str2num); sim复制代码 在stop simulation,里面,callback这样写: % --- Executes on button press in stopsim. function stopsim_Callback % hObject handle to stopsim % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data global GUIStopFlag; GUIStopFlag = 1; 复制代码第三步:写一个s函数,不停地检测这个GUIStopFlag参数,发送命令给STOP按钮,告诉他,可以结束了,简单吧? sysstop_new.m 第四步:在simulink模型里面,加上这个S函数 Figure13.jpg 好了,大功告成了,现在你就可以在GUI里随意控制Simulink模型了。 注:文中所用的模型GUI文件,由mathworks公司提供。
通过GUI来控制Simulink进行系统仿真-GUI控制钟摆动画.rar 通过GUI来控制Simulink进行系统仿真,仿真的对象是动态地钟摆系统.别看题目是GUISimulink,其实最重要的中心内容在于S-function.Math大哥说过,S-function的本质就是系统状态的更新,这话总结了一切,系统的更新也就是采样点的刷新,计算当前采样点的全部输出或者包含其微分积分信息,然后到下一个时间点,再刷新.而区分其工作阶段的标志flag的值分别对应各个工作状态:初始化,连续状态微分更新,离散状态更新,输出更新,采样时刻更新,仿真结束这六种状态.其调用格式就不详细介绍了,大家自己调用模版文件出来瞧瞧就很明白了(edit sfintempl.m或者open sfintempl.m或者type sfintempl.m).   大概的原理就讲这么多,下面进入到我的作品,<>.在这个作品中,我使用了两个S-function,一个是来描述钟摆本身的运动学特性,一个是模仿硬件(单片机的外部中断)来控制整个仿真的进行与终止.制作过程比较麻烦,程序大概四五百行,我大致说说核心的东西就应付过去吧.核心:S-function早软件中实现硬件支持的中断功能,通过刷新系统状态和检测全局变量stopf来确定是继续执行仿真还是终止动画进行.它的每次更新都把stopf变为0,但控制器的按钮按下把stopf变成1,在S-function每次计算输出时会对stopf检测,若为1,那么动画会静止.先给大家看看控制版面,带有仿真时间的输入,如果想保持仿真,那么可以输入inf. 1.jpg 2.jpg 打开模型按钮可以打开.mdl的单摆系统结构图,下面的就是检测停止状态stopf的S-function结构图,需要与系统本身放在一个.mdl文件中,否则只程序的编写是不足够的. 摆过去之后还回循环往复: 3.jpg 4.jpg 按照这种语法介绍有没有什么理解上的误会,希望大家留下宝贵意见,帮助我提高,感谢拉! GUI控制钟摆动画.rar
<think>好的,我现在需要帮助用户了解如何在Simulink中使用Function模块读取数据。首先,用户提到了Function模块,可能指的是Matlab Function模块或者S-function。根据提供的引用,特别是引用[1]和[3],用户更可能是在询问Matlab Function模块的使用方法。 首先,我得回顾一下引用内容。引用[1]提到Matlab Function模块是自定义模块,可以通过输入端口u获取外部信号,或者通过工作区变量导入数据。不过需要注意,模块本身无法直接读取工作区变量,需要配合From Workspace模块。引用[3]则提到某些函数可能需要使用coder.extrinsic声明,或者使用其他模块如Interpreted MATLAB Function。 接下来,我需要分步骤说明如何读取外部和内部数据。对于外部数据,比如MATLAB工作区的变量,可能需要使用From Workspace模块连接到Matlab Function的输入端口。而内部数据可能指的是Simulink模型中其他模块的输出,这可以通过直接连接信号线来实现。 另外,引用[2]提到使用Data Store Memory实现全局变量,这可能是在需要共享数据时的一种方法。用户如果想在多个Matlab Function模块之间共享数据,可以考虑使用Data Store Read/Write模块。 然后,我需要考虑用户可能遇到的问题,比如如何正确声明外部函数或者处理不支持的情况。引用[3]中提到的coder.extrinsic可能在这里有用,如果用户需要调用自定义的MATLAB函数,可能需要这样的声明。 最后,生成相关问题时要围绕用户可能进一步想了解的内容,比如性能优化、错误处理或者实时数据读取,引用[4]提到了S-function实时读取参数,这可能也是一个相关的问题方向。 需要确保回答结构清晰,分点说明,并正确引用提供的资料。同时,注意使用中文,避免使用Markdown格式,但用户示例中允许使用代码块,所以可能需要保留代码示例部分。</think>### 逐步说明:在 Simulink 中使用 Function 模块读取数据 #### 一、通过输入端口读取内部数据 1. **模块信号连接** - 在 Simulink 模型中,将其他模块(如传感器模块、常量模块或作用域模块)的输出信号线直接连接到 **Matlab Function 模块的输入端口**。 - 输入信号在模块内通过变量 `u` 访问,支持多输入时使用 `u(1)`, `u(2)` 等索引形式[^1]。 ```matlab function y = fcn(u1, u2) y = u1 + u2; % 直接使用输入信号进行计算 ``` #### 二、从 MATLAB 工作区读取外部数据 1. **通过 From Workspace 模块** - 添加 `From Workspace` 模块,设置变量名为工作区中的变量(如 `simin`),格式需为包含时间序列的结构体(例如 `simin = struct('time',[], 'signals',struct('values',[]))`)。 - 将该模块的输出连接到 Matlab Function 模块的输入端口。 2. **直接读取全局变量(需配置)** - 在模型中添加 **Data Store Memory** 模块,定义全局变量名称(如 `global_var`)。 - 在 Matlab Function 模块中通过 `coder.extrinsic('evalin')` 声明外部函数,并使用 `evalin('base', 'global_var')` 读取工作区变量[^2]。 #### 三、实时参数读取(结合 S-function) 1. **使用 S-function 与 GUI 交互** - 创建自定义 S-function 模块,通过 `mdlOutputs` 函数调用 `get_param` 获取模型运行时的参数。 - 结合 GUI 按钮回调函数(如 `pushbutton1_Callback`),动态更新 S-function 的输入[^4]。 ```matlab % S-function 示例代码片段 function sys=mdlOutputs(t,x,u) current_param = get_param('model_name', 'RuntimeParameter'); sys = u * current_param; ``` #### 四、注意事项 1. **函数支持性** - 若遇到不支持的 MATLAB 函数,需在 Matlab Function 模块顶部添加 `coder.extrinsic('函数名')` 声明[^3]。 2. **数据类型匹配** - 确保输入信号的数据类型与模块内代码处理的类型一致,避免隐式转换错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值