主要内容

使用总线数组组合非虚拟总线

总线数组是指以同一 Simulink.Bus 对象定义的非虚拟总线为元素的数组。总线数组相当于 MATLAB® 结构体数组。

使用总线数组可以:

  • 通过将处理多个总线所使用的算法集中起来减少维护工作。

  • 简化对相同类型的多个总线的迭代处理,例如,通过对总线数组使用 For Each 子系统。

  • 在不重新构建使用总线数组的模型部分的情况下更改正在处理的总线的数量。

  • 使用内置模块(例如 AssignmentSelector 模块)操作总线数组,就像操作任何其他类型的数组一样。使用总线数组时,不需要创建自定义 S-Function 来管理结构体信号的打包和解包。

  • 生成具有 C 结构体数组的代码,以便与使用结构体数组的已有 C 代码集成。此方法对索引的结构体使用 for 循环,可简化为进行 Simulink® 计算而对数组进行索引的过程。

例如,您可以将多通道系统(如通信系统)建模为总线数组。虽然所有通道都具有相同的属性,但每个通道可能具有不同值。

提示

要为总线数组创建可重用的设定,请定义一个 Simulink.ValueType 对象,将 DataType 设置为 Simulink.Bus 对象,并将 Dimensions 设置为数组的维度。

有关演示多种总线数组使用方式的模型,请参阅总线数组建模

支持具有可变大小信号的总线数组,但有一定的限制。请参阅可变大小信号限制

总线数组的要求

合并为一个总线数组的所有总线必须:

  • 是非虚拟总线

  • 指定相同的 Simulink.Bus 对象数据类型(即,相同的名称、层次结构和总线元素属性)

有关创建非虚拟总线的信息,请参阅Create Nonvirtual Buses

有关哪些模块支持总线数组的信息,请参阅Bus-Capable Blocks

从非虚拟总线创建总线数组

您可以使用 Vector Concatenate 或 Matrix Concatenate 模块将非虚拟总线组合为一个总线数组。Simulink 将非虚拟总线视为标量。因此,无论总线元素数据类型如何,您都可以使用上述任一模块。

要使用上述模块之一创建总线数组,请执行下列步骤:

  1. 为要在总线数组中组合的所有非虚拟总线定义一个 Simulink.Bus 对象数据类型。

  2. 在 Vector Concatenate 或 Matrix Concatenate 模块的“模块参数”对话框中,将输入数目设置为总线数组中所需的总线数量。模块图标将显示您指定的输入端口数。

  3. 将非虚拟总线连接到模块输入。

模块输出是总线数组。

打开并仿真名为 ArrayOfBuses 的示例模型。

ArrayOfBuses model

为了说明如何从非虚拟总线创建总线数组:

  • 两个 Bus Creator 模块创建具有相同 Bus 对象数据类型 (Bus: BusObject) 的非虚拟总线。

  • 输入数目设置为 2 的一个 Vector Concatenate 模块,用于组合总线数组中的两个非虚拟总线。

为了说明如何从总线数组中选择元素:

  • Selector 模块根据在对话框中指定的索引从总线数组中提取总线之一。由于总线数组是串联信号,这些信号提供对其元素的基于索引的访问,因此 Selector 模块对索引选项使用 Index vector (dialog)

  • Bus Selector 模块通过基于名称的访问提取非虚拟总线的元素。

信号维度信息叠加显示总线数组包含两条总线。要启用信号维度叠加,请在 Simulink 工具条的调试选项卡上,选择叠加信息 > 信号维度

从 MATLAB 结构体创建总线数组

您可以使用 Constant 模块简洁地表示具有常值总线元素的总线数组。这种方法可以减少模型中的信号线数目和模型使用的变量数目,特别是在模型用不同的参数值重复一种算法的情况下。

要创建一个总线数组,请在 Constant 模块上执行以下操作:

  • 常量值设置为 MATLAB® 结构体数组或指定 MATLAB 结构体数组的 Simulink.Parameter 对象。

  • 输出数据类型设置为 Simulink.Bus 对象。

仅当输出数据类型为总线对象时,Constant 模块才支持 MATLAB 结构体。

打开并编译包含创建非虚拟总线的 Constant 模块的示例模型。编译模型会更新线型,您可以使用线型来直观地标识总线数组。要编译模型,请在 Simulink 工具条的建模选项卡上,点击更新模型运行。或者,在 MATLAB 命令行窗口中,输入以下命令。

mdl = "ArrayOfBusesFromStructure";
open_system(mdl)
set_param(mdl,SimulationCommand="Update");

ArrayOfBusesFromStructure model

PreLoadFcn 模型回调定义名为 busval 的结构体数组。每个结构体由名为 offsetgainthreshold 的元素组成。然后,模型回调使用 Simulink.Bus.createObject 函数从结构体创建一个 Simulink.Bus 对象。总线对象使用默认名称 slBus1

要查看模型回调,请在 Simulink 工具条的建模选项卡的设计库中,选择属性检查器。当在模型顶层未选择任何内容时,模型回调会显示在属性检查器中。或者,要以编程方式获取模型回调,请使用 get_param 函数。

cb = get_param(mdl,"PreLoadFcn")
cb = 
    '% Define an array of structures named busval. Compose each
     % structure of elements named offset, gain, and threshold.
     
     busval(1).offset = 197;
     busval(1).gain = 4.32;
     busval(1).threshold = 795.68;
     
     busval(2).offset = 158;
     busval(2).gain = 3.83;
     busval(2).threshold = 1039.77;
     
     % Define the corresponding Simulink.Bus object.
     
     Simulink.Bus.createObject(busval)'

要为包含许多元素的总线层次结构创建结构体数组,请考虑使用 Simulink.Bus.createMATLABStruct 函数。

要创建一个总线数组,请将 Constant 模块的常量值设置为 busval,并将输出数据类型设置为 Bus: slBus1

For Each Subsystem 模块迭代处理数组中每个非虚拟总线的常量值。子系统内容显示非虚拟总线,而不是连接到端口的总线数组。

For-each subsystem contents

另请参阅

模块

主题