主要内容

封装初始化和参数回调代码简介

封装初始化代码和参数回调代码使您能够以编程方式控制模块封装。封装初始化代码用于配置模块,动态修改子系统的内容,并设置子系统中子模块的参数。对于每个封装模块,Simulink® 创建一个 MATLAB® 工作区的唯一实例,称为封装工作区。此封装工作区存储封装参数的计算值。Simulink 在此封装工作区的环境中执行封装初始化代码。

封装参数回调代码根据其他参数的值动态显示或隐藏参数,或动态更改弹出选项。这样,就通过仅向用户呈现相关选项简化了封装对话框。封装参数回调在临时工作区中执行。要了解如何指定封装初始化和参数回调代码,请参阅Author Mask Initialization and Callbacks

Structure of the MATLAB class file

封装初始化代码

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

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

  • 在结构上动态更改子系统内容。有关详细信息,请参阅Allow Masked Subsystems Inside a Masked Subsystem Reference to Self-Modify

  • 基于封装对话框参数的值更改子模块参数的值。在封装初始化代码中使用 set_param 函数,而不是 <parameter>.value。要在子模块中使用父模块的值,请将参数从子模块提升到父模块的封装对话框,而不是使用 set_param

  • 在封装初始化代码中定义新变量,该变量由封装中的现有参数计算得出。由于存在可调性损失,因此请避免使用封装初始化代码通过封装更新现有参数。如果您需要更新封装上的现有参数,请按照Tune Mask Enumeration Parameters - Popup and Radio Button中所述的步骤进行操作以确保保留可调性。

何时避免编写封装初始化代码

并非在所有情况下都适合使用封装初始化代码:

  • 不要使用封装初始化代码来验证和确认封装参数值。请使用封装约束。有关详细信息,请参阅约束

  • 不要使用封装初始化部分的封装绘图命令修改封装图标。请使用封装显示来更改封装图标。或者,使用图形图标编辑器为封装模块创建 SVG 图标。有关详细信息,请参阅Create and Edit Block Mask Icon

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

一个模型中所有封装模块的初始化命令旨在使模块达到所需状态。如果模块参数的值发生变化,初始化命令将执行,使模块及其嵌套模块处于所需状态。初始化代码在以下情况下执行:

  • 更新图、仿真模型或生成代码。如果封装工作区是最新的,则为了优化性能,Simulink 不执行封装初始化代码。

  • 使用 set_param 并在封装对话框中点击应用来更改参数值。

  • 对封装定义进行任何更改,包括从封装编辑器中保存封装。

  • 在图标绘制依赖初始化代码的情况下。加载模型时,对于没有图标绘图命令的封装模块,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,因为一旦仿真开始,这些参数将无法修改。

  • 避免通过检查仿真状态来决定是否运行特定代码片段。

  • 不要使用 slresolve 重新计算参数。所有参数都经过计算,并在封装工作区中可用。

  • 不要在初始化代码中设置模块的封装参数。Simulink 会在随后的封装工作区更新中获得封装参数的新值。

  • 在模型使用更新图处于编译阶段时,不要修改模型工作区。

封装参数回调代码

封装参数回调执行特定 MATLAB 代码以响应封装参数值的变化。

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

何时编写参数回调代码?

当您有以下需求时编写参数回调代码:

  • 自动更新相关参数。例如,如果您有参数 area,它依赖另一个参数 length,则当 length 更改时,请使用回调代码重新计算并设置 area

  • 基于另一个参数的值更改封装参数的外观或可见性。

  • 当参数更改时执行初始化或配置任务。

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

当参数值更改时,Simulink 执行参数的回调代码。封装参数回调代码在临时工作区中执行。嵌套子系统中的回调代码按顺序执行。当您打开封装对话框时,顶部封装对话框的回调代码先执行。

参数回调代码在以下情况下执行:

  • 在封装对话框中或通过使用 set_param 修改参数值,然后更改光标位置或点击应用。例如,当您更改参数值后按 Tab 键或点击进入对话框中的另一个字段时,回调代码执行。

  • 在“配置参数”对话框的诊断窗格中启用编辑时间警告和错误的情况下打开模型。

  • 关闭封装对话框而不保存更改。每个参数的回调代码按顺序执行以还原到其初始状态。

  • 在回调代码以前从未运行过的情况下执行模型更新。

  • 打开属性检查器并选择一个封装模块。

参数回调代码的规则

封装参数回调命令必须遵守以下规则:

  • 不要尝试使用参数回调代码修改子系统的结构。请改用封装初始化。

  • 不要更改封装参数的类型。

另请参阅

主题