使用总线数组组合非虚拟总线
总线数组是指以同一 Simulink.Bus
对象定义的非虚拟总线为元素的数组。总线数组相当于 MATLAB® 中的结构体数组。
使用总线数组可以:
通过将处理多个总线所使用的算法集中起来减少维护工作。
简化对相同类型的多个总线的迭代处理,例如,通过对总线数组使用 For Each 子系统。
在不重新构建使用总线数组的模型部分的情况下更改正在处理的总线的数量。
使用内置模块(例如 Assignment 或 Selector 模块)操作总线数组,就像操作任何其他类型的数组一样。使用总线数组时,不需要创建自定义 S-Function 来管理结构体信号的打包和解包。
生成具有 C 结构体数组的代码,以便与使用结构体数组的已有 C 代码集成。此方法对索引的结构体使用
for
循环,可简化为进行 Simulink® 计算而对数组进行索引的过程。
例如,您可以将多通道系统(如通信系统)建模为总线数组。虽然所有通道都具有相同的属性,但每个通道可能具有不同值。
有关演示多种总线数组使用方式的模型,请参阅Model Arrays of Buses。
支持具有可变大小信号的总线数组,但有一定的限制。请参阅可变大小信号限制。
总线数组的要求
合并为一个总线数组的所有总线必须:
是非虚拟总线
指定相同的
Simulink.Bus
对象数据类型(即,相同的名称、层次结构和总线元素属性)
有关创建非虚拟总线的信息,请参阅Create Nonvirtual Buses。
有关哪些模块支持总线数组的信息,请参阅Bus-Capable Blocks。
从非虚拟总线创建总线数组
您可以使用 Vector Concatenate 或 Matrix Concatenate 模块将非虚拟总线组合为一个总线数组。Simulink 将非虚拟总线视为标量。因此,无论总线元素数据类型如何,您都可以使用上述任一模块。
要使用上述模块之一创建总线数组,请执行下列步骤:
为要在总线数组中组合的所有非虚拟总线定义一个
Simulink.Bus
对象数据类型。在 Vector Concatenate 或 Matrix Concatenate 模块的“模块参数”对话框中,将输入的数目设置为总线数组中所需的总线数量。模块图标将显示您指定的输入端口数。
将非虚拟总线连接到模块输入。
模块输出是总线数组。
打开并编译示例模型。要编译模型,请在 Simulink 工具条的建模选项卡上,点击更新模型或运行。编译模型会更新线型,您可以使用线型来直观地标识总线数组。
为了说明如何从非虚拟总线创建总线数组,该模型使用:
两个 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
对象
当输出数据类型为 Bus
对象时,Constant 模块仅支持 MATLAB® 结构体。
定义名为 const_struct_array
的结构体数组。让每个结构体均为以下元素组成:Offset
、Gain
和 Threshold
。
const_struct_array(1).Offset = 197; const_struct_array(1).Gain = 4.32; const_struct_array(1).Threshold = 795.68; const_struct_array(2).Offset = 158; const_struct_array(2).Gain = 3.83; const_struct_array(2).Threshold = 1039.77;
要为包含许多元素的总线层次结构创建结构体数组,请考虑使用 Simulink.Bus.createMATLABStruct
函数。
定义对应的 Bus
对象数据类型。
Simulink.Bus.createObject(const_struct_array)
新的 Bus
对象使用默认名称 slBus1
。
打开并仿真示例模型,其中包含常量值设置为 const_struct_array
且输出数据类型设置为 Bus: slBus1
的 Constant 模块。
open_system('ArrayOfBusesFromStructModel') sim('ArrayOfBusesFromStructModel');
Constant 模块的输出是一个总线数组。
For Each Subsystem 模块迭代处理数组中每个非虚拟总线的常量值。子系统内容显示非虚拟总线,而不是连接到端口的总线数组。