主要内容

本页翻译不是最新的。点击此处可查看最新英文版本。

模型回调

模型回调在指定的操作点执行,例如在加载或保存模型后。

您可以使用模型回调来执行常见任务,例如自动初始化变量并加载数据

库和子系统引用支持大多数模型回调。但是,对于这些组件,您只能设置那些可以为库或子系统引用执行的回调。例如,您不能为库设置 InitFcn 回调(它作为仿真的一部分被调用),因为您不能对库进行仿真。同样的行为也适用于子系统引用。

创建模型回调

  1. 在 Simulink® 工具条中,在建模选项卡的设计库中,点击属性检查器

  2. 在未选择模型或引用模型顶层的任何内容的情况下,在属性选项卡上的回调部分中,选择您要设置的回调。

    注意

    模块回调不同于模型回调。不要选择 Model 模块来为引用模型设置模型回调。

  3. 在框中,输入您希望回调执行的函数。

要以编程方式创建模型回调,请使用 set_param 函数向模型回调参数分配 MATLAB® 代码。

模型回调参数

模型回调参数在回调执行时

PreLoadFcn

在模型加载之前。

不要在 PreLoadFcn 模型回调中使用模型参数,因为这些参数是在模型加载之后才加载的。应使用 PostLoadFcn 回调来处理模型加载后的模型参数。

为此参数定义回调代码对于加载该模型使用的变量很有用。

要在不打开模型的情况下从 MATLAB 脚本或函数调用模型,请使用 load_system 函数以便执行 PreLoadFcn 回调。

有关示例,请参阅自动初始化变量并加载数据

限制包括:

  • 对于 PreLoadFcn 回调,get_param 函数不会返回模型参数值,因为尚未加载模型。在这种情况下,get_param 函数返回:

    • 标准模型参数的默认值,例如 solver

    • 通过 add_param 添加的模型参数的错误消息

  • 不支持以编程方式访问 Scope。

PostLoadFcn

在模型加载之后。

为此参数定义回调代码对于生成需要加载的模型的接口非常有用。

限制包括:

  • 如果使用 PostLoadFcn 回调进行结构性更改,回调不会设置模型的 Dirty 标志来指示未保存的更改。当您关闭模型时,软件不会提示您保存。

  • 不支持以编程方式访问 Scope。

由于在此回调执行后 Simulink 编辑器会打开,因此 PostLoadFcn 回调不适用于设置模型视图,例如设置缩放因子。随模型保存缩放信息,以使用特定缩放因子打开它。

InitFcn

在计算模块参数之前的更新阶段。此回调在模型更新和仿真过程中调用。

避免用于编辑模型结构体的 InitFcn 模型回调。软件可以根据模型加载状态执行或忽略这些回调。

避免对引用模型的内容进行编辑的 InitFcn 模型回调。当您仿真 Simulink 模型时,这样做会导致意外的行为,如错误或不正确的结果。

有关 InitFcn 回调的详细信息,请参阅初始化函数

有关示例,请参阅Call MATLAB Function Files in MATLAB Function Blocks

StartFcn

在仿真阶段之前。在模型更新期间不调用此回调。

在快速重启中对每个仿真都会调用此回调。

PauseFcn

在仿真暂停之后。

ContinueFcn

在仿真继续之前。

StopFcn

在仿真停止之后。

输出将在 StopFcn 回调执行之前写入到工作区变量和文件。

仿真输出在命令行仿真的 StopFcn 回调中不可用。

在快速重启中对每个仿真都会调用此回调。

PreSaveFcn

保存模型之前。

PostSaveFcn

保存模型之后。

如果使用 PostSaveFcn 回调进行结构性更改,回调不会设置模型的 Dirty 标志来指示未保存的更改。当您关闭模型时,软件不会提示您保存。

CloseFcn

模块图关闭之前。

ModelCloseFcnDeleteFcn 模块回调在 CloseFcn 模型回调之前调用。

DestroyFcn 模块回调在 CloseFcn 模型回调之后调用。

引用模型回调

在模型层次结构中,回调的执行反映顶层模型及它引用的模型执行其回调的顺序。例如,假设:

  • 模型 A:

    • 在加速模式下引用模型 B

    • 具有在 MATLAB 工作区中创建变量的 PostLoadFcn 回调

    • 重新编译配置参数设置为始终如果检测到变化如果检测到已知依赖关系的变化

  • 模型 B:

    • 具有清空 MATLAB 工作区的 CloseFcn 回调

    • 尚未编译或已过期

对模型 A 进行仿真会触发对引用模型 B 的重新编译。当软件重新编译模型 B 时,它会打开和关闭模型 B,这会调用模型 B 的 CloseFcn 回调。CloseFcn 调用会清空 MATLAB 工作区,包括由模型 A 的 OpenFcn 回调创建的变量。

您可以使用模型 A 中的 StopFcn 回调从 MATLAB 工作区清除模型使用的变量,而不是使用模型 B 的 CloseFcn 回调。您也可以对数据使用数据字典,这样就不必在基础工作区中使用变量。

Model 模块的仿真模式影响引用模型的模型回调执行时间。

Model 模块的仿真模式行为
普通

在模型编译期间,软件加载每个引用模型,该模型配置为在普通模式下仿真,但尚未加载。

在大多数情况下,软件对每个普通模式引用模型编译一次,而不管引用它的 Model 模块的数量。

InitFcnStartFcnPauseFcnContinueFcnStopFcn 模型回调为模型编译器创建的模型的每个可执行形式执行。

在模型编译后,引用模型仍保持加载状态。

加速

在模型编译期间,软件可以打开和关闭引用模型,这些模型配置为基于其重新编译设置和仿真目标在加速模式下进行仿真。在模型编译之前打开的模型保持打开状态。

软件不执行某些回调。

  • 如果一切都是最新的,并且重新编译配置参数设置为如果检测到已知依赖关系的变化,则引用模型不会编译,其 InitFcn 回调也不会执行。

  • StartFcnStopFcn 等回调不会执行,因为在加速模式下,引用模型使用 S-Function 而不是引用模型来进行启动和停止。

有关模型引用仿真模式的详细信息,请参阅为模型层次结构选择仿真模式

另请参阅

主题