在仿真期间访问模块数据
关于模块运行时对象
Simulink® 提供了一个称为模块运行时接口的应用程序编程接口,该接口支持在仿真运行过程中以编程方式访问模块数据,例如模块输入和输出、参数、状态以及工作向量。您可以使用此接口从 MATLAB® 命令行、Simulink 调试器、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
命令的文档。如需使用方法执行事件的示例,请打开sldemo_msfcn_lms
。此 Simulink 模型包含 S-Function adapt_lms.m
,它执行系统辨识以确定 FIR 滤波器的系数。S-Function 的 PostPropagationSetup
方法初始化模块运行时对象的 DWork 向量,以使第二个向量存储在每个时间步计算的滤波器系数。
在 Simulink 模型中,双击 S-Function 模块下的注释会执行其 OpenFcn
。此函数先打开一个用于绘制 FIR 滤波器系数的图窗。然后,它使用以下代码行执行函数以将 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
字段包含正确的模块输出,请打开“配置参数”对话框,然后清除信号存储重用复选框(请参阅信号存储重用 (Simulink Coder))。