指定总线元素的初始条件
总线初始化是一种特殊形式的信号初始化。有关信号初始化的一般信息,请参阅初始化信号和离散状态。有关初始化总线数组的详细信息,请参阅初始化总线数组。
总线初始化为总线信号指定 Simulink® 第一次执行使用该总线的模块时使用的总线元素值。默认情况下,总线元素的初始值为接地值(由 0
表示)。总线初始化涉及到指定非零初始条件。
您可以使用总线初始化功能执行以下操作:
为具有不同数据类型的信号指定初始条件。
为总线中的每个元素应用不同的初始条件。
为总线中的部分元素(而不是所有元素)指定初始条件。
为多个模块、信号或模型使用相同的初始条件。
支持总线初始化的模块
如果模块同时满足下列两个条件,则您可以初始化输入到该模块的总线值:
具有初始值或初始条件模块参数
支持总线
以下模块支持总线初始化:
Data Store Memory
IC
Memory
Merge
Outport(当模块位于条件执行上下文中时)
Receive
Rate Transition
Unit Delay
例如,Unit Delay 模块支持总线。其“模块参数”对话框具有初始条件参数。
不能初始化具有以下信号的总线:
可变大小信号
基于帧的信号
设置诊断以支持总线初始化
要启用总线初始化,请在开始仿真之前,将欠定初始化检测配置参数设置为简化。
创建初始条件结构体
您可以创建非完全或完全初始条件结构体来表示总线的初始值。要创建初始条件结构体,请使用以下方法之一:
在 MATLAB® 基础工作区或 Simulink 模型工作区中定义 MATLAB 结构体。您可以手动定义该结构体,或者对于完全结构体,您可以使用
Simulink.Bus.createMATLABStruct
函数。在支持总线初始化的模块的“模块参数”对话框中,对于初始条件参数,请指定计算结果为结构体的表达式。
有关定义 MATLAB 结构体的信息,请参阅结构体数组。
您在初始条件结构体中指定的字段必须与总线元素的下列数据属性完全匹配:
名称
维度
复/实性
例如,如果将一个总线元素定义为实数 [2×2] 双精度数组,则在初始条件结构体中定义该值以将该总线元素初始化为实数 [2×2] 双精度数组。
对于具有枚举 (enum
) 数据类型的每个总线元素,需要在初始条件结构体中显式指定字段。
控制结构体字段的数据类型
如果目标总线的任何元素使用除 double
之外的数据类型,您可以使用不同的方法控制初始条件结构体字段的数据类型。您选择的方法会影响生成的代码的效率和可读性。请参阅Control Data Types of Initial Condition Structure Fields。
创建用于初始化的完全结构体
完整的初始条件结构体为总线的每个元素提供一个初始值。该初始条件结构体会镜像总线层次结构并反映总线元素的属性。
在代码生成过程中指定完全结构体有以下好处:
生成的代码更易于阅读
支持显式初始化所有信号的建模风格
使用 Simulink.Bus.createMATLABStruct
函数,可简化与总线具有相同层次结构、名称和数据属性的完整 MATLAB 初始条件结构体的创建。此函数将为您未指定的所有元素填充接地值。
您可以对该函数使用几种不同类型的输入,包括:
Simulink.Bus
对象名称端口句柄数组
您可以从类型编辑器中调用该函数。右键点击要为其创建 MATLAB 结构体的 Simulink.Bus
对象。然后,点击创建 MATLAB 结构体。或者,在独立的类型编辑器中,选择 Simulink.Bus
对象。然后,在类型编辑器工具条中,点击 MATLAB 结构体。有关示例,请参阅 Initialize Buses and Arrays of Buses Using MATLAB Structure from Type Editor。
要检测结构体参数何时与关联的总线具有不一致的形状(层次结构和名称),请使用模型顾问。
在建模选项卡上,点击模型顾问。
点击确定。
在按任务 > 使用总线对信号和参数建模下,选择检查总线信号的结构体参数的使用。
点击运行此检查按钮。
模型顾问标识非完全初始条件结构体。
创建结构体后,您可以在 MATLAB 编辑器中对其进行编辑。
创建用于初始化的非完全结构体
非完全初始条件结构体为总线的部分元素提供初始值。如果您在仿真过程中使用非完全初始条件结构体,Simulink 将创建一个完全的初始条件结构体来表示总线的所有元素。对于非完全初始条件结构体没有显式指定值的每个元素,Simulink 将为它们指定相应的接地值。
在创建模型的迭代过程中,为模块参数值指定非完全结构体可能很有用。非完全结构体使您可重点关注总线中的部分信号。当您使用非完全结构体时,Simulink 将隐式初始化未指定的信号。
在定义非完全初始条件结构体时:
只包括总线中的字段。
省略总线中的一个或多个字段。
使初始条件结构体中的字段对应于总线元素的嵌套级别。
在结构体和总线的相同嵌套级别中,可根据需要以不同于总线元素的顺序指定结构体字段。
注意
初始条件结构体的值必须位于对应的总线元素的设计最小值和最大值范围内。Simulink 会在您更新图或对模型进行仿真时执行此范围检查。
假设您有一个总线 Top
,它包含三个元素(A
、B
和 C
)并具有以下特征:
A
是一个嵌套总线,具有两个信号元素。B
是一个信号。C
是一个嵌套总线,包含总线A
作为其嵌套总线。
ex_bus_initial_conditions
模型包括 Top
总线。
下面总结了 Top
总线层次结构以及总线元素的数据类型、维度和复/实性。
Top A (sub1) A1 (double) A2 (int8, 5x1, complex) B (double) C (sub2) C1 (int16) C2 (sub1) A1 (double) A2 (int8, 5x1, complex)
在这些示例中,K
是为 Unit Delay 模块的初始值指定的初始条件结构体。初始条件结构体对应于 ex_bus_initial_conditions
模型中的 Top
总线。以下是一些有效的初始条件设定。
有效语法 | 描述 |
---|---|
K.A.A1 = 3 | 使用值 |
K = struct('C',struct('C1',int16(4))) | 总线元素 |
K = struct('B',3,'A',struct('A1',4)) | 总线元素 |
无效的非完全初始条件结构体
在下面的示例中,K
是为 Unit Delay 模块的初始值指定的初始条件结构体。初始条件结构体对应于 ex_bus_initial_conditions
模型中的 Top
总线。
以下三个初始条件指定无效:
无效语法 | 语法无效的原因 |
---|---|
K.A.A2 = 3 | 值维度和复/实性不匹配。总线元素 |
K.C.C2 = 3 | 不能使用标量值来初始化初始条件子结构体。 |
K = struct('B',3,'X',4) | 不能指定不在总线中的字段( |
使用模块参数初始化总线
通过为接收总线作为输入并且支持总线初始化(请参阅支持总线初始化的模块)的模块设置初始条件参数来初始化总线。
例如,Unit Delay 模块的“模块参数”对话框中包含一个初始条件参数。
对于支持总线初始化的模块,您可以使用以下方法之一替换默认值 0
:
这三种方法都需要您定义一个初始条件结构体(请参阅创建初始条件结构体)。您不能指定除 0
、初始条件结构体或 Simulink.Parameter
对象之外的非零标量值或任何其他类型的值来初始化总线。
将初始条件结构体定义为 MATLAB 变量,而不是直接在“模块参数”对话框中指定初始条件结构体,这种方法有几大优势,包括:
在多个模块中重用初始条件结构体
在生成的代码中将初始条件结构体作为可调参数使用
用于初始化的 MATLAB 结构体
您可以使用 MATLAB 结构体(它为总线显式定义初始条件)来初始化总线。
例如,在 Unit Delay 模块的初始条件参数中,您可以键入一个结构体。
使用 MATLAB 变量进行初始化
您可以使用 MATLAB 变量(它被定义为具有适当值的初始条件结构体)来初始化总线。
例如,您可以在基础工作区中定义以下非完全结构体:
K = struct('A', struct('A1', 3), 'B', 4);
然后,您可以指定 K
结构体作为 Unit Delay 模块的初始条件参数:
使用 Simulink.Parameter
对象进行初始化
您可以使用 Simulink.Parameter
对象(它使用初始条件结构体作为 Value
的属性值)来初始化总线。
例如,您可以在基础工作区中定义非完全结构体 P
(回想上一节讨论的 ex_bus_initial_conditions
模型):
P = Simulink.Parameter; P.DataType = 'Bus: Top'; P.Value = Simulink.Bus.createMATLABStruct('Top'); P.Value.A.A1 = 3; P.Value.B = 5;
然后,您可以指定 P
结构体作为 Unit Delay 模块的初始条件参数:
另请参阅
模块
函数
Simulink.BlockDiagram.addBusToVector
|Simulink.Bus.cellToObject
|Simulink.Bus.createMATLABStruct
|Simulink.Bus.createObject
|Simulink.Bus.objectToCell
|Simulink.Bus.save