Main Content

将信号或消息组合到虚拟总线中

为了减少模块图中信号线的复杂度和杂乱无章,并使接口的增量更改更容易,可以使用虚拟总线。虚拟总线信号类似于用束线带绑在一起的一捆电线。同样,非虚拟总线类似于 C 代码中的结构体。您可以将总线作为一个整体来访问,也可以从总线中选择特定元素。

当您创建虚拟总线时,可以根据信号线的功能对其进行分组。通过将信号或消息组织到逻辑分组中,可以降低进行重大重构的可能性。

不是所有模块都可以接受总线,一些模块会将总线隐式转换为向量。要了解哪些模块支持哪种类型的总线,请参阅Bus-Capable Blocks。要标识总线转换,请参阅Identify Automatic Bus Conversions

创建虚拟总线的方式因要组合的信号或消息的位置而异。

  • 在组件内 - 使用 Bus Creator 模块。

  • 在组件的输出接口处 - 使用 Out Bus Element 模块。

  • 在组件的输入接口处 - 使用 In Bus Element 模块。

为了重点讲述基本步骤,这些示例很简单。不过,如果您有许多信号或消息要组合,总线将非常有用。

提示

当您打开模型或创建总线时,Simulink® 编辑器不会显示总线线型。要更新线型,请编译模型。在 Simulink 工具条的建模选项卡上,点击更新模型运行

要使用函数在组件的输入或输出接口上创建总线,请参阅Programmatically Create Bus Element Ports

将组件内的信号线组合起来

您可以使用 Bus Creator 模块将信号组合到一个组件内的一个虚拟总线中。

打开名为 VirtualBusCreation 的模型,其中包含三个模块。

Model with three source blocks

要创建一个包含来自多个模块的输出的总线,请点击并拖动以选择这些模块。对于此示例,请选择 Chirp Signal 和 Sine Wave 模块。在出现的操作栏中,点击创建总线

Pointer paused on Create Bus button in action bar

软件会添加 Bus Creator 模块,并将输入连接到该模块。Bus Creator 模块的输出是虚拟总线。

First two source blocks connected to a Bus Creator block

为了更容易识别总线的元素,请对 Bus Creator 模块的输入加标签。双击 Chirp Signal 模块和 Bus Creator 模块之间的信号线。然后,输入 Chirp。双击 Sine Wave 模块和 Bus Creator 模块之间的信号线。然后,输入 Sine

要创建包含第一条总线和 Step 模块输出的第二条总线,请点击并拖动以选择 Bus Creator 和 Step 模块。在出现的操作栏中,点击创建总线。由于 SineChirp 信号是输入总线的元素,因此无论您的选择是否包括 Sine Wave 和 Chirp Signal 模块,软件都会创建相同的总线。

软件会添加另一个 Bus Creator 模块,并将输入连接到该模块。Bus Creator 模块的输出是包含嵌套总线的虚拟总线。

First Bus Creator block and third source block connected to another Bus Creator block

您可以将总线嵌套至任意深度。如果 Bus Creator 模块的输入之一是总线,则其输出是包含至少一个嵌套总线的总线层次结构。

标记新 Bus Creator 模块的输入。双击 Step 模块和 Bus Creator 模块之间的信号线。然后,输入 Step。双击 Bus Creator 模块之间的信号线。然后,输入 NestedBus。或者,排列模块以提高模型的可读性。

将第二个 Bus Creator 模块的输出连接到 Scope 模块,并对输出加标签 TopBus。要直观地识别总线,请通过点击 Simulink 工具条的建模选项卡上的更新模型运行来编译模型。编译模型会更新线型。

Compiled model with bus line style at output of Bus Creator blocks

将多个输出信号连接到一个端口

此示例说明如何使用 Out Bus Element 模块将子系统或模型的输出信号组合到一个虚拟总线中。

打开名为 VirtualBusOutputCreation 的模型,其中包含三个源模块。

Model with three source blocks

向模型中添加一个 Out Bus Element 模块。然后,将 Chirp Signal 模块连接到 Out Bus Element 模块。

First source block connected to an Out Bus Element block labeled OutBus.signal1

要复制两个模块,请按下 Ctrl 并拖动 Out Bus Element 模块两次。以这种方式复制模块时,请指定是创建新端口还是使用现有端口。要创建一条包含所有信号的输出总线,请在每次复制模块时选择新元素

Menu with pointer on New Element

将 Sine Wave 和 Step 模块连接到 Out Bus Element 模块。

Each source block connected to a default Out Bus Element block

每个 Out Bus Element 模块旁边的标签有两个部分。标签的第一部分描述端口并使用默认名称 OutBus。标签的第二部分描述总线元素并使用默认名称 signal1

为了更容易识别端口的元素,请对这些元素进行重命名。(可选)通过在其他总线中嵌套总线元素来创建层次结构。请在每个总线名称后添加点。例如:

  • 双击 signal1。然后,输入 NestedBus.Chirp

  • 双击 signal2。然后,输入 NestedBus.Sine

  • 双击 signal3。然后,输入 Step

Out Bus Element blocks labeled OutBus.NestedBus.Chirp, OutBus.NestedBus.Sine, and OutBus.Step with cursor after Step

要检查端口的总线层次结构,双击任一 Out Bus Element 模块。对话框显示一个名为 OutBus 的顶层总线,其中包含名为 NestedBusStep 的元素。NestedBus 是嵌套总线,包含名为 ChirpSine 的元素。

Bus hierarchy with NestedBus and Step under OutBus and Chirp and Sine under NestedBus

虽然此示例将一个信号连接到每个 Out Bus Element 模块,但您也可以将一个总线连接到一个 Out Bus Element 模块。

三个 Out Bus Element 模块在模型的输出端口创建一个虚拟总线。要查看该虚拟总线,请在另一个模型中引用该模型,或将这些 Out Bus Element 模块移至一个子系统中。当您编译模型时,线型会更新。要编译模型,请在 Simulink 工具条的建模选项卡上,点击更新模型运行

Bus output from a Model block that references the example model

指定一个端口的多个元素

当模型或子系统文件在某个端口需要总线时,请使用 In Bus ElementOut Bus Element 模块定义该端口。

要在一个接口上指定总线元素端口的元素,您可以:

  • 向该接口添加元素,向模块图添加或不添加模块。

  • 使用 Simulink.Bus 对象定义总线层次结构。

注意

要将 Simulink.Bus 对象指定为总线元素端口上总线的数据类型,则 In Bus ElementOut Bus Element 模块必须表示总线或总线元素。

此示例说明如何在具有一个模块且没有 Simulink.Bus 对象的接口上定义输入总线元素端口。

假设该端口需要一条总线,该总线包含名为 NestedBus 的嵌套总线和名为 Step 的信号。嵌套总线包含名为 ChirpSine 的信号。您的模型或子系统当前仅使用名为 Step 的信号。

在空白模型或子系统中,添加一个 In Bus Element 模块。此模块创建一个输入端口。

Default In Bus Element block with block label that says InBus.signal1

要重命名模块表示的元素,请在模块标签中双击 signal1。然后,将 signal1 替换为 Step

In Bus Element block with block label that says InBus.Step. The part of the label that says Step is in edit mode.

打开属性检查器。然后,选择 In Bus Element 模块。或者,双击该模块打开对话框。

在属性检查器或对话框中,选择名为 InBus 的顶层总线。然后,点击 Add element 按钮箭头,并选择添加元素(不带模块)

Pointer paused on Add element without block button

新元素嵌套在先前所选元素下。模块图没有变化。

InBus with new element named signal1

新元素名称以灰色和斜体显示,表示 In Bus Element 模块不直接表示该元素。

双击新元素名称。然后,输入 NestedBus

Bus hierarchy with NestedBus in edit mode

要向嵌套总线添加元素,请选择 NestedBus。然后,点击 Add element 按钮箭头,并选择添加元素(不带模块)

NestedBus selected and pointer paused on Add element without block button

要添加另一个总线元素,请选择 NestedBus。然后,点击 Add element 按钮箭头,并选择添加元素(不带模块)

NestedBus selected and pointer paused on Add element without block button

要将总线元素分别从 signalsignal2 重命名为 ChirpSine,请双击每个新元素名称并输入新名称。

Bus hierarchy with Chirp and Sine under NestedBus

通过添加元素而不添加模块,您可以定义只有一个 In Bus Element 模块(而没有 Simulink.Bus 对象)的整个总线层次结构。

提示

当您要添加许多不带模块的元素时,使用 Simulink.Bus.addElementToPort 函数可能比使用对话框更快。有关示例,请参阅Programmatically Create Bus Element Ports

要指定元素的属性,请将鼠标暂停在元素名称上。然后,点击出现的铅笔按钮 Specify attributes

Pencil button next to element name

非默认属性出现在元素名称旁边。要进一步编辑属性,请点击元素名称旁边的属性摘要。

Bus hierarchy that has elements with nondefault properties

当您创建要重用的文件时,在接口上定义元素的属性非常有用。接口定义确定引用子系统或模型支持的输入。输入总线的层次结构和属性必须与对应端口的定义匹配。

假设您最初添加了不带模块的元素,后来决定需要通过 In Bus Element 模块来选择它们。要为输入元素添加模块,请点击一个元素名称,或在按住 Ctrl 键的同时点击多个元素名称。然后,点击 Add blocks for selected elements。例如,为 ChirpSine 添加模块。

Pointer paused on Add blocks for selected signals button

对应的 In Bus Element 模块出现在模块图中。

In Bus Element blocks labeled InBus.NestedBus.Chirp and InBus.NestedBus.Sine

在模块标签中,每个圆点表示一个新的层次结构级别。

对于输出总线元素端口,为元素添加模块的方式略有不同。要为输出总线元素端口添加模块,请选择现有 Out Bus Element 模块未表示的元素。然后,通过点击 Add block for selected element 添加 Out Bus Element 模块。要防止多个 Out Bus Element 模块表示同一元素时发生冲突,一次只能添加一个 Out Bus Element 模块。

有关更多示例和信息,请参阅 In Bus ElementOut Bus Element

访问总线的元素

您可以将总线作为一个整体来访问,也可以从总线中选择特定的信号、消息或嵌套总线。

如何从总线中提取元素取决于总线的位置。

另请参阅

| | |

相关主题