联合仿真:MATLAB与Simulink如何通过回调函数实时交互数据

絕刀狂花

絕刀狂花

2026-05-22

900人浏览

原创

matlab与simulink实时交互可通过五种方法实现:一、全局变量+sim()传参;二、from/to workspace动态读写;三、runtimeobject事件监听实时绘图;四、set_param/get_param在线调参;五、app designer事件驱动架构协同。

联合仿真:matlab与simulink如何通过回调函数实时交互数据

如果您在MATLAB GUI或App Designer中启动Simulink模型,但无法实现实时数据更新与响应,则可能是由于回调函数未正确配置或数据访问路径不一致。以下是实现MATLAB与Simulink通过回调函数实时交互数据的具体方法:

一、利用全局变量与sim()命令触发仿真并传参

该方法适用于GUI中按钮点击后启动一次完整仿真,并将用户输入参数传递至Simulink模型。全局变量确保回调函数间共享模型名与参数值,sim()命令以指定时间与选项运行模型。

1、在GUI主界面的OpeningFcn或startupFcn中初始化全局变量:
global ModelName Kp Ki Kd

2、在按钮回调函数中获取用户输入并赋值:
Kp = str2num(get(handles.edit_Kp,'String'));
Ki = str2num(get(handles.edit_Ki,'String'));
Kd = str2num(get(handles.edit_Kd,'String'));
ModelName = 'my_controller';

3、调用sim命令执行仿真:
options = simset('SrcWorkspace','current');
sim(ModelName, [], options);

4、在Simulink模型中,PID控制器参数直接填写变量名KpKiKd,而非数值。

二、使用From/To Workspace模块配合回调函数动态读写

该方法支持仿真运行过程中持续交换数据,To Workspace模块将信号实时写入MATLAB工作区,From Workspace模块则从工作区读取随时间变化的控制指令,适合闭环调节类应用。

1、在Simulink模型中添加To Workspace模块,连接待监测信号(如输出y):
设置Variable name为simout_y,Save format为Timeseries,Limit data points取消勾选。

2、添加From Workspace模块,用于接收GUI更新的参考信号r_ref:
Variable name设为r_ref,Data设为timeseries格式(需在GUI中预构造)。

3、在GUI按钮回调中构造参考信号timeseries:
t = (0:0.01:10)';
r = sin(t);
r_ref = timeseries(r, t);

4、启动仿真前刷新工作区:
assignin('base', 'r_ref', r_ref);
sim('my_controller');

5、仿真结束后读取结果:
y_data = simout_y.Time;
plot(y_data, simout_y.Data);

三、基于RuntimeObject与事件监听实现实时波形绘制

该方法绕过To Workspace模块的采样延迟,直接通过Simulink运行时对象(RuntimeObject)在每个仿真步长中提取端口数据,配合eventlistener实现毫秒级响应,适用于GUI中实时绘图场景。

1、在Simulink模型中,右键空白处→模型属性→Callbacks→StartFcn,填入:
add_exec_event_listener('my_model/Out1','PostOutputs',@PlotOnApp);

2、在MATLAB路径下新建PlotOnApp.m函数:
function PlotOnApp(block, ~)
  rto = get_param([gcs '/Out1'],'RuntimeObject');
  y = rto.InputPort(1).Data;
  t = get_param(gcs,'SimulationTime');
  app = guidata(0);
  plot(app.UIAxes, t, y, '.','Color','b');
  drawnow limitrate;

支持回调函数的es5倒计时插件
支持回调函数的es5倒计时插件

支持回调函数的es5倒计时插件

下载

3、在GUI startupFcn中设置控件Tag:
app.Out1.Tag = 'Out1';
app.UIAxes.Tag = 'UIAxes';

4、确保GUI中坐标区UIAxes已存在且可见,且模型中Out1模块输出端口连接目标信号。

5、启动仿真后,PlotOnApp函数将在每个输出步长自动触发,无需手动轮询或定时器。

四、通过set_param/get_param动态修改运行中模型参数

该方法允许在仿真进行中修改模块参数(如Gain值、PID限幅),无需停止仿真,适用于参数在线整定或自适应控制验证。

1、在GUI中添加滑块或编辑框控件,绑定回调函数update_gain_callback。

2、在回调函数中获取当前值并写入模型:
gain_val = str2double(get(handles.gain_slider,'Value'));
set_param('my_model/Gain','Gain','num2str(gain_val)');

3、强制刷新模型结构以使参数生效:
refreshdata('my_model');

4、验证参数是否已更新:
current_gain = get_param('my_model/Gain','Gain');
disp(['Current Gain = ', current_gain]);

5、关键提示:必须确保模型处于仿真暂停或运行状态,且Gain模块名称与路径完全匹配

五、采用App Designer与Simulink事件驱动架构协同

该方法依托App Designer的面向对象特性与Simulink事件机制,避免全局变量污染,提升代码可维护性,适用于中大型交互式应用开发。

1、在App Designer的Properties段定义私有属性:
properties (Access = private)
  SimModelName = 'quadcopter';
  SimRunning = false;
end

2、在RunButton回调中启动仿真:
if ~app.SimRunning
  set_param(app.SimModelName, 'SimulationCommand', 'start');
  app.SimRunning = true;
end

3、在StopButton回调中停止仿真:
if app.SimRunning
  set_param(app.SimModelName, 'SimulationCommand', 'stop');
  app.SimRunning = false;
end

4、在模型StartFcn中注册事件监听器:
add_exec_event_listener('quadcopter/ScopeData','PostOutputs',@(~,~)app.updatePlot());

5、在App Designer中定义updatePlot函数:
function updatePlot(app)
  rto = get_param('quadcopter/ScopeData','RuntimeObject');
  y = rto.InputPort(1).Data;
  t = get_param('quadcopter','SimulationTime');
  plot(app.UIAxes, t, y);
  drawnow limitrate;
end

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

回调函数 mathworks

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
fprintf在matlab中的用法
fprintf在matlab中的用法

fprintf是MATLAB中用于格式化输出的函数。fprintf的基本语法为“fprintf(fileID, format, A)”,其中,fileID是一个标识符,用于指定要写入的文件,如果要将数据写入到命令窗口中,则可以使用1作为fileID的值,format是一个字符串,用于指定输出的格式,A是要输出的数据。

2023.09.28

636

5

数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

2451

8

Matlab中length函数的用法
Matlab中length函数的用法

在Matlab中,length函数用于返回向量、数组或字符串中的元素个数。想了解更多length函数的相关内容,可以阅读本专题下面的文章。

2023.11.22

475

5

Matlab中axis函数用法
Matlab中axis函数用法

在Matlab中,axis函数用于控制坐标轴的范围和比例。想了解更多axis函数的相关内容,可以阅读本专题下面的文章。

2023.11.23

868

5

subplot在matlab中的用法
subplot在matlab中的用法

subplot在matlab中用于在同一个图窗中创建多个子图。通过指定子图的行数、列数和当前绘图位置,可以在每个子图中绘制不同的图形。想了解更多subplot在matlab中的用法,可以访问下面的文章。

2023.11.27

233

3

scilab和matlab的区别
scilab和matlab的区别

scilab和matlab的区别:1、注释符号;2、预设变量的表示;3、操作符的用法;4、矩阵的定义与调用;5、程序的编辑与执行;6、数据类型;7、函数库;8、图形界面;9、社区支持与生态系统;10、跨平台兼容性;11、价格。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.12.11

247

5

Matlab如何四舍五入
Matlab如何四舍五入

Matlab可以通过round函数和格式化输出函数来对数值来进行四舍五入操作。更多关于Matlab相关的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.12.12

664

11

Matlab中axis函数用法介绍
Matlab中axis函数用法介绍

在Matlab中,axis函数用于设置当前坐标轴的范围和刻度。想了解更多axis函数的相关内容,可以阅读本专题下面的文章。

2023.12.13

243

6

matlab griddata函数用法
matlab griddata函数用法

matlab中函数用于在给定的(X,Y)坐标上插值相应的Z值,从而将一组三维数据(x,y,z)网格化。想了解更多matlab的相关内容,可以阅读本专题下面的文章。

2023.12.15

1377

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP进阶篇-函数(玉女心经版)
PHP进阶篇-函数(玉女心经版)

共12课时 | 2万人学习

最好理解的Promise教程
最好理解的Promise教程

共10课时 | 1.1万人学习