目录
确定信号维度
Simulink® 模块可以输出一维、二维或多维信号。Simulink 用户界面和文档中通常将一维信号称为向量,将二维或多维信号称为矩阵。包含一个元素的数组通常称为标量。行向量是指包含一行的二维数组。列向量是指包含一列的二维数组。
-
一维 (1-D) 信号包含一系列按照每个仿真时间步一个数组(向量)的频率输出的一维数组。
-
二维 (2-D) 信号包含一系列按照每个模块采样时间一个二维数组(矩阵)的频率输出的二维数组。
-
多维信号包含一系列按照每个模块采样时间一个数组的频率输出的多维(二维或更多维)数组。可以使用任何有效的 MATLAB® 多维表达式(例如 [4 3])指定多维数组。
Simulink 模块可以接受或输出的信号维度因模块而异。有些模块可以接受或输出任意维度的信号。有些只能接受或输出标量或向量信号。
注意:Simulink 在仿真过程中不支持动态信号维度。也就是说,信号的维度在执行仿真时必须保持不变。但是,可以在仿真过程中更改信号的大小。参考可变大小信号基础知识。
如果一个模块可以发出非标量信号,假如是源模块,则其输出信号的维度取决于模块参数;否则,输出信号的维度取决于模块输入信号的维度和模块参数。要确定信号最终用于仿真的维度,请首先更新模块图(例如,按 Ctrl+D)。然后,选择以下方法之一:
-
在模块图上直接显示维度。使用此方法沿着模块的路径跟踪信号维度。在模型中,在 Debug 选项卡上,选择 Information Overlays > Signal Dimensions。
-
检查 Model Data Editor 中的维度,它将信息显示在一个可搜索、可排序的表中。在该表中,Dimensions 列中每个单元格的右侧显示模型中相应信号线的真实维度。
支持多维信号的 Simulink 模块
Simulink Block Data Type Support 表中有一列标识了哪些模块支持多维信号。
-
在 MATLAB 命令行中,输入 showblockdatatypetable。
此时将打开一个单独的窗口,显示 Simulink Block Data Type Support 表。
-
在 Block 列中,找到 Simulink 模块的名称。右侧的列是该模块的数据类型或功能。如果一列中包含 X 标记,即说明支持该功能。
Simulink 支持最多具有 32 个维度的信号。不要使用超过 32 个维度的信号。
确定源模块的输出维度
源模块是指没有输入信号的模块。源模块的示例包括Constant模块和Sine Wave模块。有关 Simulink 源模块的完整列表,参考Sources。如果源模块 Interpret vector parameters as 1-D 参数处于禁用状态(即未在模块参数对话框中选中),则输出维度与其输出值参数的维度相同。如果 Interpret vector parameters as 1-D 参数处于启用状态,则输出维度等于输出值参数维度,除非参数维度为 Nx1 或 1xN。如果是后一种情况,模块将输出宽度为 N 的向量信号。
这里我们以Constant模块为例,了解源模块的输出值参数和Interpret vector parameters as 1-D 参数如何决定其输出维度。此模块输出等于其 Constant value 参数的常量信号。下表说明 Constant value 参数的维度和 Interpret vector parameters as 1-D 参数的设置如何决定模块输出维度。
Constant Value | Interpret vector parameters as 1-D | 输出 |
---|---|---|
标量 | off | 一元素数组 |
标量 | on | 一元素数组 |
1×N 矩阵 | off | 1×N 矩阵 |
1×N 矩阵 | on | N 元素向量 |
N×1 矩阵 | off | N×1 矩阵 |
N×1 矩阵 | on | N 元素向量 |
M×N 矩阵 | off | M×N 矩阵 |
M×N 矩阵 | on | M×N 矩阵 |
Simulink 源模块允许您指定输出信号的维度,或指定 Simulink 可从中推断出维度的值。因此,可以使用源模块在您的模型中引入各种维度的信号。
确定非源模块的输出维度
如果一个模块有输入,则其输出维度在标量扩展之后与输入维度相同。(所有输入必须具有相同的维度,如信号和参数维度规则中所述)。
信号和参数维度规则
创建 Simulink 模型时,必须遵循有关信号和参数维度的以下规则。
输入信号维度规则
一个模块的所有非标量输入必须具有相同的维度。一个模块可以具有混合的标量和非标量输入,但所有非标量输入必须具有相同的维度。Simulink 会对标量输入进行扩展,使其具有与非标量输入相同的维度。
模块参数维度规则
一般而言,模块参数必须与模块输入具有相同的维度。Simulink 会执行一些处理,在一般规则的基础上增添一些灵活性。
-
模块可以具有与非标量输入对应的标量参数。在这种情况下,Simulink 会对标量参数进行扩展,使其与对应的输入具有相同的维度。
-
如果输入是向量,对应的参数可以是 N×1 或 1×N 矩阵。在这种情况下,Simulink 会将 N 个矩阵元素应用于输入向量的对应元素。这一例外允许使用 MATLAB 行或列向量(实际上分别是 1×N 或 N×1 矩阵)指定应用于向量输入的参数。
向量或矩阵输入转换规则
在以下情况下,Simulink 会将向量转换为行或列矩阵,或者将行或列矩阵转换为向量:
-
如果一个向量信号连接的输入端口需要矩阵,Simulink 则将该向量转换为单行或单列矩阵。
-
如果一个单列或单行矩阵连接的输入端口需要向量,Simulink 则将矩阵转换为向量。
-
如果一个模块的输入信号混合了向量和矩阵,而且矩阵输入全都为单列或单行矩阵,Simulink 则将向量分别转换为单列或单行矩阵。
注意:可以配置 Simulink,使其在仿真过程中发生向量或矩阵转换时显示警告或错误消息。
输入信号和参数的标量扩展
标量扩展是指将标量值转换为非标量数组。许多 Simulink 模块支持对输入信号和参数进行标量扩展。模块特定的说明会指明 Simulink 是否会对该模块的输入信号和参数进行标量扩展。
输入信号的标量扩展是指对标量输入进行扩展,使其与其他非标量输入或非标量参数的维度相匹配。如果模块输入混合了标量和非标量信号,Simulink 会将标量输入扩展为与其他非标量输入具有相同维度的非标量信号。例如,如果关联的非标量信号的维度为 3,标量 4 会扩展为向量 [4 4 4]。
参数的标量扩展是指对标量模块参数进行扩展,使其与非标量输入的维度相匹配。
输入 | 关联的模块参数 | 标量扩展 |
---|---|---|
标量 | 非标量 | 扩展输入以匹配参数维度。 可以参考标量输入和非标量参数。 |
非标量 | 标量 | 扩展标量参数,以匹配输入中的元素数。 可以参考标量输入和非标量参数。 |
混合标量和非标量 | 无对应参数 | 扩展标量输入,以匹配最大非标量输入的维度。 可以参考标量输入和非标量参数。 |
标量输入和非标量参数
在此示例中,从 Constant模块到Gain模块的输入为标量。Gain模块的Gain参数为非标量。Simulink对标量输入进行扩展,使其与非标量Gain参数的维度相匹配,这一点反映在Display模块的仿真结果中。
非标量输入和标量参数
在此示例中,从 Constant 模块到 Gain 模块的输入为非标量。Gain模块的Gain参数为标量。Simulink 对标量参数进行扩展,使其与来自 Constant 模块的非标量输入的维度相匹配,这一点反映在 Display 模块的仿真结果中。
标量和非标量输入,无关联参数
在此示例中,从Constant1模块到Sum模块的输入为非标量,来自Constant2模块的输入为标量。Sum模块没有关联的参数。Simulink将来自Constant2模块的标量输入进行扩展,以匹配来自Constant1模块的非标量输入的维度。输入扩展为向量 [3 3 3]
。
获取编译的端口维度
要获取端口信号的维度,请使用 Step Forward 按钮暂停仿真。选择一个模块并使用PortHandles参数。然后使用 GetCompiledPortDimensions参数。例如,如果在此模型中向前步进并选择Constant模块:
ph = get_param(gcb,'PortHandles');
dim = get_param(ph.Outport,'CompiledPortDimensions')
dim =
2 2 3
对于非总线端口,结果为一个数组,数组中的第一个元素是维数(在本例中为 2
),接下来的两个元素(对应于维数)是维度的值。对于总线信号,结果包括一些额外的元素。假设在具有总线的模型中向前步进,并选择包含嵌套总线的 Bus Creator 模块:
ph = get_param(gcb,'PortHandles');
dim = get_param(ph.Outport,'CompiledPortDimensions')
dim = -2 4 1 2 1 1 3 4 5 6 5 2 3 4 5 6
第一个元素是 -2
,它表示信号是总线。第二个元素是叶节点的数量。随后的元素遵循与非总线信号相同的模式。在此示例中,第三个元素表示总线中第一个信号的维数(在本例中为 1
),下一个数字是该维度的值 (2
)。