Main Content

从封装初始化和回调代码开始

封装初始化使您能够定义或修改封装模块的参数。这些参数可以在模块图中用于配置底层子系统的行为。在初始化阶段,执行与封装相关联的任何代码或脚本。这可能包括设置变量、运行 MATLAB 代码或初始化子系统正常运行所必需的状态。

封装初始化可以包括检查以确保用户提供的参数有效。这有助于防止仿真错误,并确保子系统在预期参数内运行。

封装初始化可用于根据其他参数值动态显示或隐藏参数。这可以通过仅向用户呈现相关选项来简化界面。

当您有在多个模型中使用的封装模块时,封装初始化可确保该模块的所有实例都以相同的配置开始,从而提高一致性并降低出错几率。

何时编写封装初始化代码?

当您要执行以下操作时,编写封装初始化代码:

  • 根据封装对话框参数的值创建新参数或更新封装中的现有参数。此新参数可以用作子模块参数的值。

  • 修改封装对话框参数的值。

  • 从结构上更改子系统内容,或根据封装对话框参数的值更改子模块参数的值。使用 set_param 命令来执行此操作。

封装初始化代码何时执行?

模型中所有封装模块的初始化命令旨在使模块保持在正确状态。如果模块参数值发生变化,为保持模块及其嵌套模块的正确状态,初始化命令将执行。初始化代码在以下情况下执行:

  • 更改封装参数值并更新图,或者仿真或生成代码。

  • 更改该参数的值,然后点击封装对话框上的应用

  • 使用 set_param 更改参数值,从而更改封装对话框中的参数。当 Simulink® 检测到参数值发生任何变化时,封装初始化代码将执行。

  • 使用封装编辑器中的保存封装保存封装。

  • 在图标绘制依赖初始化代码的情况下,旋转或翻转封装模块,或者绘制或重绘模块图标。仅当设置封装编辑器图标窗格中的运行初始化属性时,初始化代码才会执行。

当您打开模型时,Simulink 会查找驻留在模型顶层或已打开的子系统中的可见封装模块。

Simulink 仅在这些可见封装模块及其父模块满足以下任一条件时执行其初始化命令:

  • 封装模块具有图标绘制命令。

    注意

    在模型加载期间,Simulink 不会初始化不包含图标绘制命令的封装模块,即使它们具有初始化命令也是如此。

  • 封装子系统属于一个库,并且已启用允许库模块修改其内容参数。

当您将模型加载到内存中而没有以图形方式显示该模型时,初始化命令不会对封装模块运行,但具有可自修改封装的库模块除外。有关加载模型但不显示模型的信息,请参阅加载模型load_system

初始化代码的执行顺序是模型 InitFcn、模块 InitFcn,然后是封装初始化。

注意

如果模型已编译(初始化),则不计算封装模块的不可调参数。

封装初始化最佳做法

封装初始化命令必须遵守以下规则:

  • 不要使用初始化代码来创建动态封装对话框(其外观或控件设置会随其他控件设置的更改而更改的对话框)。改用封装回调。有关详细信息,请参阅 动态封装对话框

  • 在加载模型期间,不要使用初始化代码来添加或删除模块。

  • 对于嵌套封装子系统,不要对子模块的父模块使用 set_param。子模块封装和父模块封装可能都会对模块的同一个参数进行初始化,从而产生不可预知的行为。有关详细信息,请参阅Unsafe Mask Callback Error

  • 不要对驻留在另一个封装子系统中、您正在初始化的模块使用 set_param 命令。如果子级封装子系统引用父级封装子系统定义的符号,则尝试在子级封装子系统中设置模块参数会触发未解析的符号错误。

    例如,假设封装子系统 A 包含封装子系统 B,后者包含 Gain 模块 C,该模块的 Gain 参数引用 B 定义的变量。还假设子系统 A 具有包含此命令的初始化代码:

    set_param([gcb '/B/C'], 'SampleTime', '-1');

    对包含 A 的模型进行仿真或更新将导致未解析的符号错误。

  • 不要使用封装初始化代码来创建数据对象。数据对象是以下类的对象:

    • Simulink.Parameter 和子类

    • Simulink.Signal 和子类

  • 不要添加初始化代码来删除同一封装模块。

  • 当您引用模块或将模块复制到模型中时,封装对话框将显示指定的默认值。请勿使用封装初始化代码来更改库模块或任何其他模块中的封装参数默认值。

  • 不要使用封装初始化代码来注释或取消注释模块。

  • 避免从封装初始化代码中无条件修改子系统的内容。使用模型引用时,这种无条件修改不能正常工作。

  • 避免使用 clear 命令清除封装初始化代码中的变量。

  • 不要在模型级别修改参数,例如封装初始化代码节中的 StartTimeSolverJacobianMethodControl,因为一旦仿真开始,这些参数将无法修改。

封装回调代码

在 Simulink 中,封装回调是一个函数,或者一个与封装模块相关联的脚本,用于响应某些动作或事件。

封装回调可用于根据对一个参数的更改动态更新其他参数。这有助于维护参数关系和依存关系。

回调可以控制封装对话框中参数的可见性、是否启用和交互性,从而实现更具响应性的用户友好界面。封装回调可以在参数更改时自动执行更新显示标签、设置模块属性或初始化状态等任务。

回调提供一种与 MATLAB 工作区交互的方式,允许您在封装参数中读取和写入变量。封装回调可用于在仿真过程中的特定点执行代码,例如在仿真开始之前或结束后设置或清洗资源。

封装回调代码什么时候执行?

封装参数回调代码在临时工作区中执行,而不是在基础工作区中执行。如果您需要在回调中创建的变量在以后(不是在回调处理期间)可用,您必须显式地将这些变量分配给基础工作区。

Simulink 在参数值发生变化时执行回调命令。参数回调在以下情况下执行:

  • 打开封装对话框,回调命令将从顶部封装对话框开始按顺序执行。

  • 在封装对话框中修改参数值,然后更改鼠标或光标位置,或按应用。例如,更改参数值后按 Tab 键,或者点击进入对话框中的另一个字段。

  • 使用 set_param 命令修改参数值。

  • 在启用了诊断中的编辑时间警告和错误的情况下打开模型。

  • 当您关闭封装对话框而不保存所做更改时,将按顺序执行参数的回调命令。

  • 如果回调一次都没有运行,则它们将作为模型更新的一部分运行。

注意

  • 当与封装对话框上的按钮关联的回调代码正在执行时,这些按钮将被禁用。

  • 如果出现模块工具提示时封装对话框处于打开状态,回调命令将不会执行。

相关主题