Main Content

模块回调

您可以为模块事件(例如在加载、打开或编辑模块时)指定执行 MATLAB® 代码的模块回调。

  1. 建模选项卡上,在设计下,点击属性检查器

  2. 选择您要指定其回调的模块。

  3. 在属性检查器的属性选项卡上,请在回调部分中,选择您要定义的回调。

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

要以编程方式指定模块回调,请使用 set_param 为模块回调参数分配 MATLAB 代码。

如果模块回调在建模操作发生之前或之后执行,该回调将在该操作之前或之后紧接着发生。

与模块打开相关的回调参数

模块回调参数执行时间

OpenFcn

打开模块时。

一般情况下,此参数与 Subsystem 模块结合使用。

当您双击模块,或者将 open_system 作为参量与模块结合使用时,将执行回调。OpenFcn 参数将会覆盖与打开模块相关联的正常行为,即,显示模块对话框或打开子系统。可以使用 OpenFcn 来执行的任务示例包括:为模块定义变量,调用 MATLAB 来生成仿真数据绘图,或生成图形用户界面。

OpenFcn 回调添加到模块后,双击模块不会打开模块对话框。此外,选择了模块时,模块参数不会出现在属性检查器中。要设置模块参数,请从模块上下文菜单中选择模块参数

LoadFcn

加载模块图之后。

对于 Subsystem 模块,将对子系统中定义了 LoadFcn 回调的任何模块(包括其他 Subsystem 模块)执行 LoadFcn 回调。

与模块编辑相关的回调参数

模块回调参数执行时间

MoveFcn

移动或调整模块大小时。

NameChangeFcn

模块的名称或路径更改之后。

如果 Subsystem 模块路径发生变化,Subsystem 模块将先调用其后代模块的 NameChangeFcn 回调,然后调用 NameChangeFcn 回调本身。

PreCopyFcn

在复制模块之前。如果使用 add_block 复制模块,也会执行 PreCopyFcn

如果您复制的 Subsystem 模块包含的模块定义了 PreCopyFcn 回调,也会执行该回调。

在执行所有 PreCopyFcn 回调后,将调用模块 CopyFcn 回调。

CopyFcn

在复制模块之后。如果使用 add_block 复制模块,也会执行该回调。

如果您复制的 Subsystem 模块包含的模块定义了 CopyFcn 参数,也会执行该回调。

ClipboardFcn

在将模块复制或剪切到系统剪贴板时。

PreDeleteFcn

在图形意义上删除模块之前(例如,当您直接从图中删除模块或对模块调用 delete_block 时)。

当包含该模块的模型关闭时,不会调用 PreDeleteFcn。模块的 DeleteFcnPreDeleteFcn 之后调用,除非 PreDeleteFcn 显式或通过 PreDeleteFcn 中使用的命令调用 error 命令。

DeleteFcn

在图形意义上删除模块之后(例如,当您直接从图中删除模块,对模块调用 delete_block,或关闭包含模块的模型时)。

在调用 DeleteFcn 后,模块句柄仍然有效并且可以使用 get_param 进行访问。如果通过调用 delete_block 或通过关闭模型在图形意义上删除模块,在删除后,将在内存中销毁该模块,并调用模块的 DestroyFcn

对于 Subsystem 模块,将对子系统中定义了 DeleteFcn 回调的任何模块(包括其他 Subsystem 模块)执行 DeleteFcn 回调。

DestroyFcn

在内存中销毁该模块后(例如,当您对模块或包含该模块的子系统调用 delete_block 或关闭包含该模块的模型时)。

如果之前未在图形意义上删除模块,模块的 DeleteFcn 回调将在 DestroyFcn 之前调用。在调用 DestroyFcn 时,该模块句柄将不再有效。

UndoDeleteFcn

在撤消模块删除操作时。

与模块编译和仿真相关的回调参数

模块回调参数执行时间

InitFcn

编译模块图之前以及计算模块参数之前。有关 InitFcn 回调的详细信息,请参阅Initialization Function

StartFcn

编译模块图之后、仿真开始之前。

如果是 S-Function 模块,StartFcn 将在第一次执行此模块的 mdlProcessParameters 函数之前立即执行。有关详细信息,请参阅 S-Function 回调方法

ContinueFcn

在仿真继续之前。

PauseFcn

在仿真暂停之后。

StopFcn

在仿真因任何原因终止时。

如果是 S-Function 模块,StopFcn 将在模块的 mdlTerminate 函数执行之后执行。有关详细信息,请参阅 S-Function 回调方法

模块保存和关闭回调参数

模块回调参数执行时间

PreSaveFcn

保存模块图之前。

对于 Subsystem 模块,将对子系统中定义了 PreSaveFcn 回调的任何模块(包括其他 Subsystem 模块)执行 PreSaveFcn 回调。

PostSaveFcn

保存模块图之后。

对于 Subsystem 模块,将对子系统中定义了 PostSaveFcn 回调的任何模块(包括其他 Subsystem 模块)执行 PostSaveFcn 回调。

CloseFcn

使用 close_system 关闭模块时。

当您以交互方式关闭模块参数对话框、以交互方式关闭包含模块的子系统或模型,或使用 close_system 关闭包含模块的子系统或模型时,将不会调用 CloseFcn

例如,若要关闭所有打开的 MATLAB 窗口,请使用如下命令:

set_param('my_model','CloseFcn','close all')

ModelCloseFcn

模块图关闭之前。

当模型关闭时,模块的 ModelCloseFcn 在其 DeleteFcn 之前调用。

对于 Subsystem 模块,将对子系统中定义了 ModelCloseFcn 回调的任何模块(包括其他 Subsystem 模块)执行 ModelCloseFcn 回调。

Subsystem 模块回调参数

您可以对 Subsystem 模块使用其他模块回调参数,但此表中的回调参数特定于 Subsystem 模块。

注意

封装子系统的回调不能直接引用封装子系统的参数(请参阅创建模块封装)。Simulink® 在 MATLAB 基础工作区中计算模块回调,而封装参数驻留在封装子系统的私有工作区中。然而,模块回调可以使用 get_param 获取封装参数的值。例如,此处的 gain 是当前模块的封装参数的名称:

get_param(gcb, 'gain')
模块回调参数执行时间

DeleteChildFcn

在子系统中删除模块或线条后。

如果模块有 DeleteFcnDestroyFcn 回调,这些回调将在 DeleteChildFcn 回调之前执行。

ErrorFcn

当子系统中发生错误时。

ErrorFcn 参数的回调代码使用以下格式:

newException = errorHandler(subsys, ...
errorType, originalException)

其中

  • errorHandler 是函数的名称。

  • subsys 是发生错误的子系统的句柄。

  • errorType 是指示发生的错误类型的字符向量。

  • originalException 是一个 MSLException(请参阅使用 MSLException 对象处理 Simulink 中的错误)。

  • newException 是一个 MSLException,指定要向用户显示的错误消息。

如果您提供原始异常,则不需要指定子系统和错误类型。

以下命令将子系统 subsysErrorFcn 设置为调用 errorHandler 回调:

set_param(subsys,'ErrorFcn','errorHandler')
在这种 set_param 调用中,不要包含回调代码的输入参量。Simulink 显示由回调返回的错误消息。

ParentCloseFcn

在关闭包含模块的子系统之前,或者通过使用以下方式将模块纳入为新子系统的一部分时:

  • new_system 函数

  • 创建子系统图标在 Simulink 编辑器中的多个选项卡上。

当您关闭模型时,Simulink 不会调模型根级的模块的 ParentCloseFcn 回调。

相关主题