创建子系统
随着模型的大小和复杂度的增加,您可以通过将模块组合为子系统来简化它。子系统是组合为一个 Subsystem 模块的一组模块。
使用子系统,您可以:
建立一个分层模块图,其中一个 Subsystem 模块位于一个层中,而构成该子系统的模块位于另一个层中。
将功能相关的模块放在一起。
帮助减少您的模型窗口中显示的模块数目。
建立一个带输入和输出的界面。
当您创建子系统的副本时,该副本将独立于源子系统。要在一个模型范围内或跨多个模型重用子系统的内容,请考虑引用子系统、引用模型或链接到自定义库中某个模块的子系统。有关详细信息,请参阅 Choose Among Types of Model Components。
子系统的类型
子系统可以是虚拟的,也可以是非虚拟的。虚拟子系统提供模型中的图形层次结构。非虚拟子系统提供模型的图形层次结构并作为单个单元来执行。
提示
对于控制器和其他独立组件,使用非虚拟子系统或引用模型在相关模块周围定义硬边界。当您要为组件生成代码时,预先定义硬边界可以避免代价高昂的重构。
Simulink® 将非虚拟子系统分为以下类型:
子系统的类型 | 描述 |
---|---|
Atomic Subsystem | 作为单一单元执行的子系统。 |
Enabled Subsystem | 由外部输入使能执行的子系统。 |
Triggered Subsystem | 由外部输入触发执行的子系统。 |
Function-Call Subsystem | 由外部函数调用输入控制执行的子系统。 |
Enabled and Triggered Subsystem | 由外部输入使能和触发执行的子系统。 |
Message Triggered Subsystem 和 Message Polling Subsystem | 由消息输入触发执行的子系统。 |
Resettable Subsystem | 通过外部触发器重置模块状态的系统。 |
If Action Subsystem | 其执行由 If 模块使能的子系统。 |
Switch Case Action Subsystem | 由 Switch Case 模块控制执行的子系统。 |
While Iterator Subsystem | 当逻辑条件为 true 时,在仿真时间步重复执行的子系统。 |
For Iterator Subsystem | 在仿真时间步内重复执行指定迭代次数的子系统。 |
For Each Subsystem | 对输入信号的每个元素或子数组都执行一遍运算,再将运算结果串联起来的子系统。 |
创建子系统
要创建子系统,您可以:
在 Simulink 编辑器中,双击并开始键入子系统类型,然后从菜单中选择对应的模块。
在 Simulink 编辑器中,拖动以形成一个选择框来容纳要创建的子系统,然后选择子系统类型。
从库浏览器中拖动一个 Subsystem 模块。
从模型中复制并粘贴一个 Subsystem 模块。
从选择框创建子系统时,所选内容可以为空,也可以在模型的一个区域中包含多个模块。
从操作栏中,选择要创建的子系统的类型。
当所选内容包含对应于输入和输出端口的模块时,新子系统包括这些模块的副本。新子系统不包含对应于控制端口的模块的副本。
您可以在创建后更改子系统的类型。
要使一个子系统作为一个单元执行,请点击 Subsystem 模块。在子系统选项卡上,选择是原子子系统。
要使子系统有条件地执行,请添加对应于一个控制端口的模块。
要使子系统无条件执行,请删除对应于控制端口的模块。
注意
如果您不想再使用某个子系统,可以用其内容替换该子系统。有关详细信息,请参阅Expand Subsystem Contents。
向子系统添加端口
Subsystem 模块上的端口对应于子系统内部的模块。
例如,以下 Subsystem 模块有两个输入端口和一个输出端口。
该子系统包含两个 Inport 模块 In1
和 In2
,以及一个 Outport 模块 Out1
,它们对应于 Subsystem 模块上的端口。
要自动向 Subsystem 模块添加端口,请执行以下操作:
点击 Subsystem 模块的边,然后选择要创建的端口的类型。
将一条线拖到 Subsystem 模块的边。
对应的端口模块会添加到子系统内部。
提示
在自动创建端口后,将启用 Subsystem 模块上的端口标签以便快速编辑。请参阅编辑子系统模块上的端口标签。
要手动添加端口,请双击 Subsystem 模块打开子系统,然后将对应的模块添加到该子系统中。
端口的类型 | 对应的模块 |
---|---|
信号端口、输入 | Inport 模块 |
信号端口、输出 | Outport 模块 |
总线端口、输入 | In Bus Element 模块 |
总线端口、输出 | Out Bus Element 模块 |
控制端口、使能 | Enable 模块 |
控制端口、触发 | Trigger 模块 |
控制端口、函数调用 | 触发器类型设置为“函数调用 ”的 Trigger 模块 |
控制端口、重置 | Reset 模块 |
控制端口、操作 | Action Port 模块 |
连接端口 | Connection Port (Simscape) 模块 |
要更改 Subsystem 模块上端口的位置,请将该端口拖到 Subsystem 模块任意一侧的新位置。
默认情况下,Simulink 为 Subsystem 模块上的端口添加标签。要指定 Simulink 如何为子系统的端口添加标签,请执行下列步骤:
选择 Subsystem 模块。
在 Simulink 工具条的格式选项卡上,从端口标签菜单中选择一个标签选项。有关详细信息,请参阅显示端口标签。
编辑子系统模块上的端口标签
您可以直接编辑以下类型的子系统模块上的端口标签:
常规子系统
带封装的子系统
可变子系统
图子系统
要编辑当前模型中子系统模块的端口标签,请执行下列步骤:
指向端口标签。出现一个交互式端口标签提示(端口标签周围的蓝色框)。点击该提示。
或者,选择端口并按 F2。该提示进入编辑模式。
使用自动端口创建在 Subsystem 模块上创建新端口还会启用端口标签提示以进行快速编辑。
端口选择提示出现在端口标签提示上方,以指示正在编辑的端口标签信息(端口模块名称、信号名称、总线端口或连接端口)。对于信号端口,您可以从端口标签中编辑端口模块名称和端口信号名称。要在这些值之间切换,请点击选择提示中的对应图标,或使用键盘快捷方式 Ctrl+1、2 键。
在端口标签提示中输入值,然后按 Enter 键或 Esc 键,或点击其他地方。
编辑端口标签后,Simulink 自动更新子系统内相关端口或信号的名称。
提示
要连续对子系统模块进行端口标签编辑,请执行以下操作:
选择模块上的一个端口。
编辑端口标签,然后按 Enter 键。此操作支持用键盘选择端口。
您可以使用向上箭头或向下箭头键选择相邻端口并按 F2 键以便快速编辑。
下表根据子系统模块上定义的端口标签类型列出更新操作。
端口标签类型 动作 无 不支持编辑。 端口图标 根据端口的图标显示参数更新子系统中元素的名称。
例如,如果端口的图标显示参数值为“
信号名称
”,则端口模块上的图标和链接信号的名称都会更新。注意
对于这种类型的端口标签,编辑后端口标签上显示的信息取决于使用选择提示对标签执行的最后一个编辑:
如果初始端口标签显示端口模块名称,且最后一个编辑在信号名称上,则基础端口模块的图标显示参数会自动更新为“
信号名称
”。因此,在编辑后,端口标签默认显示信号名称。如果初始端口标签显示端口信号名称,且最后一个编辑在端口模块名称上,则基础端口模块的图标显示参数会自动更新为“
端口号
”。因此,在编辑后,端口标签默认显示模块名称。
端口模块名称 更新子系统中端口的模块名称。对于这种类型的端口标签,您只能使用端口选择提示编辑端口模块名称。 信号名称 更新链接到端口的信号的名称。
注意
Simulink 不显示 Chart 模块的端口选择提示。
不支持使用封装图标编辑 Subsystem 模块上的端口标签。
不支持从端口标签编辑端口号。您仍可以使用端口标签提示编辑端口模块名称和信号名称。
不支持从端口标签编辑传播信号的名称。您仍可以使用端口标签提示编辑端口模块名称和内部信号名称。点击提示时,端口信号名称字段为空,因为内部信号没有名称。
当所有以下条件都成立时,子系统端口标签显示传播信号的名称:
基础端口模块的图标显示参数值为“
信号名称
”。子系统内的内部信号已连接,但没有名称。
传播的信号有名称。
配置子系统
您可以更改 Subsystem 模块的名称并修改该模块,就像您处理任何其他模块一样。例如,您可以:
限制子系统访问
Subsystem 模块的读/写权限参数控制对子系统允许的访问级别。
注意
限制读取或写入访问并不阻止更改访问限制。要隐藏专有信息,请考虑使用受保护模型。有关详细信息,请参阅 了解受保护模型的功能。
当子系统存储在自定义库中时,可以使用父库模块上的读/写权限参数来控制对该模块的链接实例的访问。只要库链接保持不变,受限访问就可以防止人们查看或修改子系统的内容,同时仍然允许他们在模型中使用它。有关详细信息,请参阅 链接模块。
另请参阅
Simulink.BlockDiagram.copyContentsToSubsystem