Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

在仿真期间访问模块数据

关于模块运行时对象

Simulink® 提供了一个称为模块运行时接口的应用程序编程接口,该接口支持在仿真运行过程中以编程方式访问模块数据,例如模块输入和输出、参数、状态以及工作向量。您可以使用此接口从 MATLAB® 命令行、Simulink Debugger、2 级 MATLAB S-Function(请参阅在线 Simulink 文档中的Write Level-2 MATLAB S-Functions)访问模块运行时数据。

注意

甚至在模型暂停时,或者模型在调试器中运行或暂停时,您也可以使用此接口。

模块的运行时接口包含一组 Simulink 数据对象类(请参阅数据对象),这些类的实例提供正在运行的模型中的模块的有关数据。特别是,该接口会为正在运行的模型中的每个非虚拟模块关联一个 Simulink.RunTimeBlock(称为模块的运行时对象)实例。通过运行时对象的方法和属性可访问有关模块的 I/O 端口、参数、采样时间和状态的运行时数据。

访问运行时对象

正在运行的模型中的每个非虚拟模块都有一个 RuntimeObject 参数,该参数的值是运行仿真时模块的运行时对象的句柄。这样,您就可以使用 get_param 获得模块的运行时对象。例如,以下语句

rto = get_param(gcb,'RuntimeObject');

返回当前所选模块的运行时对象。运行时对象数据是只读的。您不能使用运行时对象更改模块的参数、输入、输出和状态数据。

注意

虚拟模块(请参阅非虚拟和虚拟模块)没有运行时对象。在模型编译过程中作为优化措施而消除的模块也没有运行时对象(请参阅Block reduction)。仅当包含模块的模型在运行或暂停时,才存在运行时对象。如果模型停止,get_param 将返回一个空句柄。停止模型时,运行时对象的所有现有句柄都变为空句柄。

侦听方法执行事件

模块运行时 API 的一种应用是在仿真过程中收集关键点处的诊断数据,例如模块在计算其输出或导数之前或之后的状态值。模块运行时 API 提供了一个事件侦听程序机制以便于此类应用。有关详细信息,请参阅 add_exec_event_listener 命令的文档。如需使用方法执行事件的示例,请输入

(在 MATLAB 命令行中输入。)此 Simulink 模型包含 S-Function adapt_lms.m,它执行系统识别以确定 FIR 滤波器的系数。S-Function 的 PostPropagationSetup 方法初始化模块运行时对象的 DWork 向量,以使第二个向量存储在每个时间步计算的滤波器系数。

在 Simulink 模型中,双击 S-Function 模块下的注释会执行其 OpenFcn。此函数先打开一个用于绘制 FIR 滤波器系数的图窗。然后,它使用以下代码行执行函数 add_adapt_coef_plot.m 以将 PostOutputs 方法执行事件添加到 S-Function 的模块运行时对象。

% Add a callback for PostOutputs event
blk = 'sldemo_msfcn_lms/LMS Adaptive';

h   = add_exec_event_listener(blk, ...
         'PostOutputs', @plot_adapt_coefs);

函数 plot_adapt_coefs.m 注册为事件侦听程序,后者在每次调用 S-Funciton 的 Outputs 方法后执行。该函数访问模块运行时对象的 DWork 向量,并绘制在 Outputs 方法中计算出的滤波器系数。在 plot_adapt_coefs.m 中使用的调用语法遵循任何侦听程序所需的标准。第一个输入参数是 S-Function 的模块运行时对象,第二个参数是事件数据的结构体,如下所示。

function plot_adapt_coefs(block, ei) %#ok<INUSD>
% 
% Callback function for plotting the current adaptive filtering
% coefficients.

stemPlot  = get_param(block.BlockHandle,'UserData');

est = block.Dwork(2).Data;
set(stemPlot(2),'YData',est);
drawnow('expose');

同步运行时对象和 Simulink 执行

您可以通过输入以下命令使用运行时对象来获取模块输出的值并在 MATLAB 命令行窗口中显示。

rto = get_param(gcb,'RuntimeObject')
rto.OutputPort(1).Data

但是,如果运行时对象并未与 Simulink 执行同步,则显示的数据可能不是真正的模块输出。Simulink 仅在运行时对象在 2 级 MATLAB S-Function 或在事件侦听程序回调中使用时,才能确保运行时对象与 Simulink 执行同步。当从 MATLAB 命令行窗口调用运行时对象时,如果允许模型中的其他模块共享内存,则运行时对象可能返回不正确的输出数据。

要确保 Data 字段包含正确的模块输出,请打开 Configuration Parameters 对话框,然后清除 Signal storage reuse 复选框(请参阅Signal storage reuse (Simulink Coder))。

相关主题