将子系统转换为引用模型
模型引用提供了诸多优势,可用于大型复杂系统的建模和基于团队的开发。许多大型模型都使用了子系统和引用模型的组合。要决定是否将子系统转换为引用模型,请参阅探索模型组件的类型。
您转换的子系统必须具有在功能上对模块进行组合的原子行为。当父模型执行时,子系统中的模块必须连续执行,并且行为类似于单个模块(即原子单元)。有关详细信息,请参阅指定子系统是否为原子子系统。原子行为会导致人为代数环。有关详细信息,请参阅代数环概念。
准备转换子系统
为转换准备子系统可以消除或减少转换过程中发现的问题数量。在转换之前解决这些问题的效率可能高于在诊断消息和 Simulink® 编辑器之间反复切换。
软件可以自动修复转换过程中的一些问题。为了遵守最初的设计意图,相对于手动清理,采用自动修复的解决方案可能更简洁。例如,软件可能将 Model 模块放在一个子系统中,使用额外的模块,或在信号名称后追加一个括号。
要准备子系统进行转换,请执行以下操作:
要确保子系统具有原子行为,请选择 Subsystem 模块。在 Simulink 工具条中的子系统模块选项卡上,选择设为原子子系统。
为了尽量减少原子行为可能产生的人为代数环,请选择 Subsystem 模块。在属性检查器中,选择尽量减少出现代数环。
注意
要打开属性检查器,请在 Simulink 工具条的建模选项卡上,在设计库中选择属性检查器。或者,按 Ctrl+Shift+I
要避免对
Simulink.Signal
对象的隐式信号解析,请配置父模型设置。将信号解析配置参数设置为仅显式(默认)或无。注意
要打开“配置参数”对话框,请在 Simulink 编辑器的建模选项卡上,执行以下操作之一:
如果父模型是顶层模型,请点击模型设置。
如果父模型是引用模型,请点击模型设置按钮箭头。然后,在引用模型部分中,点击模型设置。
如果适用,请修复下表中的转换问题。
转换问题 手动修复 Function-Call Generator 模块向不是导出函数子系统的子系统提供输入。
将 Function-Call Generator 模块移至该子系统中。
宽(非标量)函数调用信号是子系统的函数调用输入端口的输入。
改为用标量函数调用信号触发子系统。
函数调用信号是子系统的输出。
将函数调用输出更改为数据触发器。
Merge 模块合并来自子系统输入端口的信号。
配置子系统以避免 Merge 模块。
总线元素有重复的名称。
为元素分配唯一名称。
Goto 模块将输入传递给子系统外部的 From 模块。
用 Outport 模块替换每个存在问题的 Goto 模块。然后,将新子系统输出端口连接到父级系统中的模块。
From 模块从子系统外部的 Goto 模块接收输入。
用 Inport 模块替换每个存在问题的 From 模块。当 From 模块具有相同的标签时,复制 Inport 模块以替换 From 模块中的第一个模块,而不是为每个 From 模块添加唯一 Inport 模块。有关详细信息,请参阅创建重复 Inport 模块。然后,将新子系统输入端口连接到父级系统中的模块。
该子系统使用在一个对话框中指定的全局可调参数(当您点击默认参数行为 (Simulink Coder)配置参数旁边的配置按钮时,该对话框将打开)。
要为每个可调参数创建一个
Simulink.Parameter
对象,请使用tunablevars2parameterobjects
。每个Simulink.Parameter
对象必须具有Auto
之外的存储类。有关详细信息,请参阅为引用模型中的模块参数配置特定于实例的值和Tunable Parameters。Parameter Writer 模块写入:
子系统外部的模块
子系统外部使用的基础工作区变量
模型工作区变量
将 Parameter Writer 模块移到子系统之外。
为了支持转换:
Parameter Writer 模块必须与其参数所有者模块位于子系统边界的同一侧。
写入模型工作区变量的 Parameter Writer 模块必须位于子系统之外。转换为新模型引入了新的模型工作区。
表示输入端口的模块和驱动输入端口的模块之间的采样时间不同。
更改两个采样时间之一以匹配另一个,或插入 Rate Transition 模块。
输入端口上的采样时间是固定采样时间。
将每个具有固定采样时间的源模块移入子系统。例如,将 Constant 模块移入子系统中。
编译模型并解决错误。
为了使转换成功,包含子系统的模型必须成功编译。
将子系统转换为引用模型
要将子系统转换为引用模型,请执行以下操作:
要加快转换过程,请关闭 Scope 模块窗口。
选择要转换的 Subsystem 模块。
在 Simulink 工具条中的 Subsystem 模块选项卡上,点击转换 > 引用模型。
要自动修复某些转换问题,请在模型引用转换顾问中选择自动修复错误(如果可能)。您不能控制自动修复。
要将 Subsystem 模块替换为引用新模型的 Model 模块,请检查是否已选中将子系统的内容替换为 Model 模块。
要比较转换前后的顶层模型仿真结果,请执行以下操作:
为关注的输出信号启用信号记录。
选择转换后检查仿真结果和用 Model 模块替换子系统的内容。
设置停止时间、绝对容差和相对容差。
在顾问中将 Model 模块仿真模式选项设置为与原始模型相同的仿真模式。
也可以配置其他转换参数。有关详细信息,请参阅模型引用转换顾问。
点击转换。
解决已发现的问题。
或者,在 MATLAB® 命令行窗口中,使用 Simulink.SubSystem.convertToModelReference
函数。您可以使用一个 Simulink.SubSystem.convertToModelReference
命令转换多个 Subsystem 模块。但是,您不能同时转换父级子系统和该子系统的子级。
转换结果
转换检查通过后,软件将:
从子系统创建新模型。
创建新模型所需的
Simulink.Bus
对象、Simulink.Signal
对象和可调参数。默认情况下,用引用新模型的 Model 模块替换 Subsystem 模块。
如果自动修复将端口添加到了 Model 模块接口,则在 Subsystem 模块中插入 Model 模块。
在
slprj
文件夹中创建 HTML 转换摘要报告。此报告摘要显示了转换过程的结果,包括 Advisor 执行的修复的结果。此报告还说明它复制的元素。(可选)检查转换前后仿真结果的一致性。
软件将这些元素从父模型复制到新模型。
配置集 - 如果父模型引用独立配置集,则新模型通常引用相同的配置集。否则,顾问会将父模型的配置集复制到新模型。为了支持使用新模型作为参考模型,转换会更改复制的配置集中不兼容的参数值。
例如,假设父模型将信号分辨率设置为显式和隐式或显式并警告隐式。为了避免在新模型中对
Simulink.Signal
对象进行隐式信号解析,新模型将信号解析设置为仅显式。 (自 R2025a 起)变量 - 顾问仅将子系统在父模型中使用的模型工作区变量复制到新模型的模型工作区。如果父模型使用数据字典,那么新模型也使用相同的数据字典。
需求链接 - 顾问将使用 Requirements Toolbox™ 软件创建的需求链接从原始 Subsystem 模块复制到 Model 模块。
比较转换之前和之后的仿真结果
在成功完成转换后,请使用点击此处查看比较结果链接。结果显示在仿真数据检查器中。绿色对勾表示包含新引用模型的模型和基线模型的仿真结果差异在容差范围内。
有关详细信息,请参阅 Compare Simulation Data。
恢复转换
如果您对转换结果不满意,可以将模型恢复为其初始状态。使用以下方法之一:
在转换过程中的任何时间点,选择文件 > 加载还原点。
在成功运行完全转换检查后,使用点击此处还原原始模型链接。
将引用模型集成到父模型中
转换完成后,如有必要,可更新模型以满足您的建模要求。例如,您可以使用引用新模型的 Model 模块手动替换 Subsystem 模块。
如果您想利用外部数据对模型进行仿真,请确认新模型中的根级 Inport 模块具有适当的数据插值参数设置。有关详细信息,请参阅数据插值。