Main Content

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

模型回调

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

您可以使用模型回调来执行常见任务,例如 Automatically Initialize Variables and Load Data

您可以为库设置这些回调中的大多数回调。只有可针对库执行的回调才可针对库进行设置。例如,您不能为库设置 InitFcn 回调(它作为仿真的一部分被调用),因为您不能对库进行仿真。

创建模型回调

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

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

    注意

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

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

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

模型回调参数

模型回调参数执行时间

PreLoadFcn

在模型加载之前。

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

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

如果您想从 MATLAB 文件调用您的模型,而不打开模型,请使用 load_system 函数以便执行 PreLoadFcn

有关示例,请参阅Automatically Initialize Variables and Load Data

限制包括:

  • 对于 PreLoadFcn 回调,get_param 不会返回模型参数值,因为尚未加载模型。相反,get_param 返回以下内容:

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

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

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

PostLoadFcn

在模型加载之后。

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

限制包括:

  • 如果您使用 PostLoadFcn 进行结构性更改,该函数不会设置模型 Dirty 标志以指示未保存的更改。当您关闭模型时,Simulink 不会提示您保存。

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

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

InitFcn

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

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

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

有关 InitFcn 回调的详细信息,请参阅Initialization Function

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

StartFcn

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

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

PauseFcn

在仿真暂停之后。

ContinueFcn

在仿真继续之前。

StopFcn

在仿真停止之后。

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

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

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

PreSaveFcn

保存模型之前。

PostSaveFcn

保存模型之后。

如果您使用 PostSaveFcn 进行结构性更改,该函数不会设置模型 Dirty 标志以指示未保存的更改。当您关闭模型时,Simulink 不会提示您保存。

CloseFcn

模块图关闭之前。

在模型中的模块上设置的任何 ModelCloseFcnDeleteFcn 回调都在模型的 CloseFcn 回调之前调用。模型中任何模块的 DestroyFcn 回调在模型的 CloseFcn 回调之后调用。

引用模型回调

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

  • 模型 A:

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

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

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

  • 模型 B:

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

    • 尚未编译或已过期。

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

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

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

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

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

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

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

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

加速

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

Simulink 不执行某些回调。

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

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

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

相关主题