模型引用基础知识
您可以通过使用 Model 模块在一个模型中包含另一个模型。每个 Model 模块都是一个模型引用,或对另一个模型的引用。您可以多次引用同一模型而不必生成冗余副本,而且多个模型可以引用同一模型。这些引用会创建一个模型层次结构。
模型既可作为引用模型,也可作为独立模型,无需更改模型本身或从其派生的任何实体。要将引用模型用作独立模型,引用模型不能依赖于只能从更高级别模型获得的数据。
每个引用模型均独立编译。这种独立行为可以提高模型层次结构的性能,并帮助您实现建模目标。
模型引用的好处
和子系统一样,模型引用允许您按层次结构组织大型模型。和库一样,模型引用允许您一次定义一组模块并重用该模块组。与子系统和库不同,模型引用由于支持独立编译各个引用模型而具有优势。实现模型组件的理想方式取决于您的需求。
当您的组件在模型层次结构中多次重用并且包含许多模块时,将该组件实现为模型引用可以加速仿真和代码生成。例如,使用模型引用时,您可以受益于:
增量加载
软件在需要模型时才会加载引用模型,这样可以加快模型的加载速度。
加速仿真
当引用模型在加速模式下仿真时,软件会将该引用模型转换为代码。然后,软件通过运行代码对模型进行仿真,这比运行普通模式仿真更快。
增量编译
仅当引用模型自上次生成代码以来发生变化时,软件才会为该模型生成代码。当您的团队成员或持续集成系统为引用模型生成代码时,Simulink® 缓存文件会将这些代码打包以供重用。这些文件的本地副本可以加速仿真和代码生成。
局部求解器 (自 R2022a 起)
在引用模型中使用局部求解器时,软件将模型引用作为一组单独的微分方程求解。局部求解器可以使用不同的、更小 (自 R2024a 起)或更大的步长。在选择求解器和求解器设置时,需要在仿真的速度和准确性之间进行权衡。有关详细信息,请参阅Use Local Solvers in Referenced Models。
并行计算(需要 Parallel Computing Toolbox™ 许可证)
对于大型模型引用层次结构,您可以通过并行编译模型引用目标来提高图更新速度。对于要并行编译的引用模型,您必须将其配置为在加速模式下运行。有关详细信息,请参阅Reduce Update Time for Referenced Models by Using Parallel Builds。
模型引用支持与团队成员和第三方的协作。例如,模型引用可以帮助您满足下列需求:
模块化开发
您可以独立地开发引用模型,而不用考虑使用它的模型。例如,您可以打开一个没有模型层次结构上下文的引用模型。然后,对该引用模型进行仿真并生成代码。一个引用模型是一个独立的组件,既可以在程序集中使用,也可以与其他组件集成。
知识产权保护(需要 Simulink Coder™ 或 HDL Coder™ 许可证)
您可以隐藏引用模型的内容,从而在将模型作为受保护模型分发时,免于泄露其中包含的知识产权。您可以为受保护模型的接收者授予查看模型、对模型进行仿真和为模型生成代码的权限。有关详细信息,请参阅保护模型以隐藏内容 (Simulink Coder)或Create Protected Models to Conceal Contents and Generate HDL Code (HDL Coder)。
模型引用通过提供隔离环境来帮助您验证组件的行为。例如,模型引用通过以下方式支持您的测试和认证需求:
单元测试
通过将引用模型作为顶层模型进行仿真来隔离其行为,可以独立测试引用模型。您还可以创建一个测试框架,在具有各种测试场景的测试环境中运行引用模型。单元测试可以避免重复测试没有变化的组件,降低验证成本。有关详细信息,请参阅Component Verification。有关验证模型是否符合行业标准和规范的帮助,请参阅使用模型顾问检查您的模型。
SIL/PIL 测试(需要 Embedded Coder® 许可证)
要在模拟目标环境的环境中验证引用模型,您可以在软件在环 (SIL) 或处理器在环 (PIL) 模式下仿真引用模型。通过这些仿真,您可以生成并测试为主机平台上的 SIL 仿真以及目标平台上的 PIL 仿真而编译和执行的生产代码。有关详细信息,请参阅 SIL 和 PIL 仿真 (Embedded Coder)。
单一来源的生成代码
每个引用模型都只有一组源代码,而不管模型层次结构包含该引用模型多少次。单一来源的代码可以降低验证成本。
生成代码的独立可追溯性
您可以独立追溯引用模型的生成代码,而不受其他模型的影响。假设您使用基线等效性测试和针对 100% 代码覆盖率的额外测试向量确认生成代码可以追溯到引用模型。对父模型的更改不影响这种验证测试,从而降低验证成本。
使用 Simulink Code Inspector™ 许可证,您可以为每个引用模型创建一个可追溯性矩阵。可追溯性矩阵提供了模型对象、生成代码和模型需求之间的可追溯性。有关详细信息,请参阅Generate Traceability Matrices (Simulink Code Inspector)。
要比较模型引用、子系统引用和库,请参阅Explore Types of Model Components。
模型引用层次结构
一个模型层次结构可以使用多个组件化方法。例如,一个模型可以使用子系统、引用模型和 Stateflow® 图的组合来创建层次结构。
当模型层次结构包含引用模型时,顶层模型是 Simulink 窗口中处于最上层的模型。例如,假设您打开 sldemo_mdlref_basic
模型。然后,通过名为 CounterA
的 Model 模块导航到一个引用模型。
窗口标题包括两个元素。
sldemo_mdlref_basic
- 顶层模型的名称CounterA
- Model 模块的名称
资源管理器栏包括三个元素。
sldemo_mdlref_basic
- 顶层模型的名称CounterA
- Model 模块的名称sldemo_mdlref_counter
- 引用模型的名称
模型浏览器显示顶层模型、引用模型和其他模型组件的层次结构。
每个引用模型都可以引用其他模型。为了防止循环继承,Model 模块不能引用模型层次结构中高于它的模型。例如,模型不能引用其父模型,即引用该模型的模型。
模型中可以包含引用同一个模型的多个 Model 模块,只要引用模型没有定义全局数据即可。例如,sldemo_mdlref_basic
模型包含三个引用 sldemo_mdlref_counter
模型的 Model 模块。
该引用模型还可以显示在其他模型的任何级别中。
要将引用模型作为顶层模型打开,请在 Model 模块图标上,点击 。引用模型将在当前模型层次结构的上下文之外打开。
编辑模型时,无论模型是作为引用模型还是顶层模型打开,更改都会影响同一模型文件。
模型引用接口
Model 模块上的端口对应于引用模型的上层模块。端口可以是输入、输出或控制端口。
例如,在 sldemo_mdlref_basic
模型中,每个 Model 模块都引用 sldemo_mdlref_counter
模型并且具有:
三个输入端口,分别命名为 upper、input 和 lower
一个输出端口,名为 output
sldemo_mdlref_counter
引用模型具有:
三个 Inport 模块,分别命名为
upper
、lower
和input
一个 Outport 模块,名为
output
当您将一个信号连接到一个 Model 模块端口时,您会将该信号连接到引用模型的对应端口。尽管引用模型相同,但 Model 模块的输出可能不同。
例如,在 sldemo_mdlref_basic
中,每个名为 input 的 Model 模块端口都接收一个来自唯一 Pulse Generator 模块的信号。由于每个 Pulse Generator 模块的输入信号使用不同的采样时间,来自每个 Model 模块的输出信号也不同,尽管引用模型相同。
要查看每个 Model 模块的输出信号有何不同,您可以使用仿真数据检查器。
引用模型中的信号属性独立于 Model 模块的上下文。例如,信号维度和数据类型不会跨 Model 模块边界传播。要在引用模型中定义信号属性,请使用根级 Inport 和 In Bus Element 模块的模块参数。
模型工作区和数据字典
每个模型都有自己的工作区,用于存储变量值。在模型层次结构中,每个模型工作区相当于一个唯一的命名空间。因此,您可以在多个模型工作区中使用同一个变量名称。
要在模型之间共享数据,请使用数据字典。
在以下情况下,模型引用层次结构中可能存在重复的数据定义:
层次结构中的每个模型只能看到一个定义。
定义在层次结构中的各模型之间必须相同。
有关变量和对象的存储位置的详细信息,请参阅确定在何处存储 Simulink 模型的变量和对象。
模型引用行为和执行
在仿真和代码生成期间,Model 模块的行为类似单一模块,或原子单元。当 Model 模块执行时,引用模型中的模块会执行当前任务,而不会被父级系统中的模块中断。
要修改引用模型的行为方式及其执行时间,请考虑使用以下功能:
独立配置集
引用模型使用的配置集可与父模型或其他引用模型使用的配置集不同。有关详细信息,请参阅设置模型层次结构的配置参数。
实例参数
默认情况下,一个模块参数的值在可重用的引用模型的每个 Model 模块实例中是相同的。要为可重用的引用模型的每个实例指定不同的模块参数值,需创建模型参量。例如,如果将 Gain 模块添加到模型
sldemo_mdlref_counter
,则模型参量允许此模型的三个实例中的每个实例使用不同增益值。请参阅参数化可重用引用模型的实例。模型封装
通过模型封装,您可以控制 Model 模块的外观,并自定义模块显示模型参量的方式。有关模型封装的要求,请参阅模型封装。
条件执行
外部信号可以控制是否在仿真期间 Model 模块。有关详细信息,请参阅Conditionally Execute Referenced Models。
动态启动和关闭行为
要对 Model 模块的动态启动和关闭行为建模,请将自定义例程添加到 Model 模块的默认初始化和终止例程中。有关详细信息,请参阅使用初始化、重新初始化、重置和终止函数。
变体
您可以使用多个 Model 模块来表示一个系统组件的多个设计变体。由条件表达式确定活动变体。有关详细信息,请参阅什么是变体以及何时使用变体。
模型引用仿真和代码生成
在仿真模型层次结构时,会对顶层模型进行仿真。例如,假设您打开 sldemo_mdlref_basic
模型。然后,通过名为 CounterA
的 Model 模块导航到一个引用模型。
sldemo_mdlref_basic
模型是顶层模型。当您点击运行时,会对 sldemo_mdlref_basic
模型进行仿真。
再如,假设您在新窗口中将 sldemo_mdlref_counter
模型作为顶层模型打开。
在新窗口中,sldemo_mdlref_counter
模型是顶层模型。当您点击运行时,会对 sldemo_mdlref_counter
模型进行仿真。
要将引用模型作为独立的顶层模型进行仿真,该引用模型必须具有在独立上下文中执行所需的数据。例如,引用模型必须具有定义参数和信号的变量和数据类型。
您可以以解释方式(在普通模式下)或通过将引用模型编译为代码并执行该代码(在加速模式下),对引用模型进行仿真。有关详细信息,请参阅为模型层次结构选择仿真模式。
有关如何为模型引用层次结构生成代码的详细信息,请参阅Generate Code for Model Reference Hierarchy (Simulink Coder)。
提示
为了加快仿真和增量代码生成,请考虑使用 Simulink 缓存文件。Simulink 缓存文件包含可以加速仿真和代码生成的编译工件。有关详细信息,请参阅共享 Simulink 缓存文件以加快仿真速度和Simulink Cache Files for Incremental Code Generation (Simulink Coder)。