主要内容

将数据加载到根级输入端口

R2026b

您可以将数据从工作区加载到使用以下模块之一建模的根级输入端口:

  • Inport 模块

  • Enable 模块

  • 具有基于边沿(上升或下降)触发类型的 Trigger 模块

这些模块根据配置参数 > 数据导入/导出 > 输入参数的值从工作区中导入数据。

提示

要将多个信号导入到根级输入端口中,请考虑使用根输入端口映射器工具。有关详细信息,请参阅映射根输入端口信号数据。

您也可以使用 From Workspace 模块从工作区中导入数据。有关详细信息,请参阅 From Workspace 文档和为基本测试用例加载输入数据。

指定输入数据

您可以使用输入配置参数手动指定输入数据。要将多个信号加载到根级输入端口,请考虑使用根输入端口映射工具,该工具可以在输入参数中自动指定您用它映射的数据。有关详细信息,请参阅使用根输入端口映射器工具映射数据。

  1. 选择配置参数 > 数据导入/导出 > 输入参数。

    注意

    输入配置参数的使用独立于用于保存记录数据的格式配置参数的设置。

  2. 在相邻编辑框中输入外部输入设定,然后点击应用。有关您可以指定的数据形式的列表,请参阅输入数据的形式。

在输入框中,可使用以下方法之一指定信号输入:

  • 对 MATLAB® 函数(表示为字符串)或 MATLAB 表达式使用输入 u = UT(t),在运行时为每个仿真时间步创建数据。

  • 使用输入数据的形式中描述的输入数据形式直接指定数据。

逗号分隔的列表

如果您指定 Dataset 数据,请为输入参数仅指定一个 Dataset 对象。不要将其包含在逗号分隔列表中。

每个变量或表达式都必须计算为与模型中特定根级输入端口对应的适当对象。列表中的每个变量或表达式的计算结果必须为与模型的一个根级输入端口对应的适当对象。第一项对应于第一个根级输入端口,第二项对应于第二个根级输入端口,以此类推。每个数据样本的维度必须与输入模块参数中指定的数据的维度相匹配。

对于 Enable 或 Trigger 模块,驱动使能或触发端口的信号必须是逗号分隔列表中的最后一项。如果同时具有使能和触发端口,则指定:

  • 使能端口作为列表中的倒数第二项

  • 触发端口作为最后一项

使用空矩阵来指定端口的接地值。例如,要为输入端口 in1 和 in3 加载数据,并对端口 in2 使用接地值,请在输入参数中输入以下内容:

in1, [], in3

输入数据的形式

您可以使用以下格式提供输入数据:

注意

当您指定要加载的 timetable 数据时,timetable 只能包含一个信号的数据。

有关导入总线数据的信息,请参阅Load Bus Data to Root-Level Input Ports。

输入参数的时间值

您在输入参数中指定的时间值不控制求解器使用的时间。求解器具有自己的传播时间逻辑,可能需要任意时间点的输入数据。根级输入模块(例如根级 Inport 模块)的插值参数设置指定如何处理不存在对应的工作区数据的时间步的输出。

输入参数中指定的时间值不能是稀疏值,也不能包含 NAN 或 Inf 值。

数据加载

如果您为对应的 Inport、Enable 或 Trigger 模块选择了数据插值选项,Simulink® 将根据需要对输入值进行线性内插或外插。

Simulink 按照符号解析中所述解析外部输入设定中使用的符号。sim 命令提供了一些仅可用于编程仿真的数据导入功能。

如果您使用 Simulink.SimulationData.Dataset 对象,而它又包含 matlab.io.datastore.SimulationDatastore 对象作为元素,则存储在持久存储中的数据将从文件中流式传入。有关详细信息,请参阅Load Big Data for Simulations。

将数据集数据加载到根级输入

您可以使用 Dataset 对象作为配置参数 > 数据导入/导出 > 输入参数的值。仅指定一个 Dataset 对象,且不要将其包含在以逗号分隔的列表中。Dataset 中的元素数必须与根级输入端口的数量相匹配。

数据集元素

一个 Dataset 对象可以包含具有不同数据类型的元素。

对于单个非总线信号数据,您可以为 Dataset 元素指定以下类型的数据:

  • timeseries

  • timetable

  • matlab.io.datastore.SimulationDatastore

  • double 向量或 double 数据的结构体

  • Simulink.SimulationData.Signal、Simulink.SimulationData.State 或 Simulink.SimulationData.DataStoreMemory 对象

  • 满足以下要求之一的数组:

    • 数组的第一列是时间,其余每一列对应一个输入端口。请参阅将数据数组加载到根级输入。

    • 驱动函数调用子系统的根输入端口的 n×1 数组。

  • 结构体 - 请参阅将数据结构体加载到根级输入。

对于总线,可以使用以下格式之一的结构体,其中的每个数据元素对应一个叶信号:

  • MATLAB timeseries 对象

  • MATLAB timetable 对象

  • matlab.io.datastore.SimulationDatastore 对象

  • 空矩阵

  • 另一个结构体,其中各信号对应的数据元素满足上述适用于总线数据结构体的要求

注意

当您指定要加载的 timetable 数据时,timetable 只能包含一个信号的数据。

为 Inport 模块创建数据集对象

要从模型中的根级 Inport 模块生成 Simulink.SimulationData.Dataset 对象,可以使用 createInputDataset 函数。生成的数据集中的信号具有 Inport 模块的属性和模型始和停止时间的对应的接地值。对于要加载的信号的时间和值,您可以为其创建 timeseries 和 timetable 对象。其他信号使用接地值。每个 timetable 对象只能包含一个信号的数据。

您可以加载到在工作区中驻留的 MATLAB timeseries 对象指定的根级输入端口数据。

注意

有关导入 MATLAB 时间序列数据的文档包含根 Inport 模块的示例。除非另外特别说明,否则这些示例适用于根级 Enable、Trigger 和 From Workspace 模块。

将 MATLAB 时间序列数据加载到根级输入

时间维度

在创建 MATLAB timeseries 对象以将数据导入 Simulink 时,时间维度(时间采样数)取决于信号数据的维度和类型。

信号数据维度或类型时间维度对齐timeseries 构造函数的示例

标量或一维向量

第一个

标量信号的构造函数。时间与第一个维度对齐。

t = (0:10)';
ts = timeseries(sin(t), t);

二维(包括行和列向量)或更高

最后一个

矩阵信号的构造函数。时间与最后一个维度对齐。

t = 0;
ts = timeseries([1 2; 3 4], t);

二维行向量,并且只有一个时间步

最后一个

'InterpretSingleRowDataAs3D', true
例如:
t = 0;
ts = timeseries([1 2], t, 'InterpretSingleRowDataAs3D', true);

枚举数据

如果在 timetable 数据中指定 enum,请清除对应 Inport 模块的数据插值参数。

将 MATLAB 时间表数据加载到根级输入

一般情况下,您可以像加载 MATLAB timeseries 数据一样加载 MATLAB timetable 数据。每个 timetable 只能包含一个信号的数据。

将数据结构体加载到根级输入

数据结构体

您可以以结构体形式从工作区加载到根级输入端口数据,结构体的名称在配置参数 > 数据导入/导出 > 输入参数中指定。有关定义 MATLAB 结构体的信息,请参阅结构体数组。

您可以整体指定模型的结构体或基于每个端口来指定结构体。有关为输入参数指定每个端口的结构体的信息,请参阅针对所有端口或每个端口的结构体。

该结构体始终包括信号子结构体,其中又包含值字段和维度字段。根据您要执行的建模任务,结构体还可以包含时间字段。您使用的结构体形式取决于您要导入数据的信号的类型:

  • 离散信号(按等间距时间值定义的信号)- 使用具有空时间向量的结构体。指定 signals 字段,此字段包含一个子结构体数组,其中的每个子结构体对应一个模型输入端口。

  • 连续信号(定义了所有时间值的信号)- 使用的方法取决于数据是表示平滑曲线(连续)还是在其范围内具有不连续点(跳跃)的曲线(离散)。指定 signals 字段,此字段包含一个子结构体数组,其中的每个子结构体对应一个模型输入端口。您可以指定包含时间向量的 time 字段。请参阅指定时间数据。

有关导入离散和连续信号的数据的示例,请参阅Control How Models Load Input Data。

针对所有端口或每个端口的结构体

您可以指定一个结构体来为模型中的所有根级输入端口提供输入,也可以为每个端口指定一个单独的结构体。

在一个端口对应一个结构体的格式中,每个端口都对应一个带时间或不带时间的单独结构体。每个端口的输入数据结构体只有一个 signals 字段。要指定此选项,请在输入文本字段中以逗号分隔列表 in1, in2,..., inN 形式输入结构体的名称。值 in1 是模型中第一个输入端口的数据,in2 是第二个输入端口的数据,依此类推。

要针对所有端口指定一个结构体,请遵守下列规则:

  • values 字段必须包含与输入端口对应的输入值数组。如果您指定时间向量,则每个输入值必须对应 time 字段中指定的一个时间值。

    如果端口的输入值是标量或向量,则 values 字段必须是一个 M-by-N 数组。如果您指定时间向量,则 M 必须是 time 字段指定的时间点数,N 必须是每个向量值的长度。

    如果端口的输入值是矩阵(二维数组),则 values 字段必须是一个 M-by-N-by-T 数组。M 和 N 是每个矩阵输入值的维度,T 是时间点数。例如,假设您要将 4×5 矩阵信号的 51 个时间采样输入到模型中的一个输入端口。那么,工作区结构体的对应 dimensions 字段必须等于 [4 5],values 数组的维度必须为 4×5×51。

  • dimensions 字段指定输入的维度。如果每个输入值都是标量或向量(一维数组),则 dimensions 字段必须是指定向量长度的标量值(1 表示标量)。如果每个输入值都是矩阵(二维数组),则 dimensions 字段必须是二元素向量,其中:

    • 第一个元素指定矩阵的行数

    • 第二个元素指定列数

    注意

    将 Inport 或 Trigger 模块的端口维度参数设置为与对应的输入结构体的 dimensions 字段相同的值。如果值不同,则在尝试仿真模型时会看到错误消息。

指定时间数据

您可以将双精度时间向量指定为要导入的数据结构体的一部分。例如,在导入信号数据时指定时间向量以表示连续被控对象或创建测试用例。要测试离散算法,请使用具有空时间向量的结构体。下表根据要加载的信号数据类型提供了指定时间值的其他建议。

信号数据时间数据建议

具有离散采样时间的 Inport 或 Trigger 模块

不要指定时间向量。Simulink 在每个时间步加载一个信号值。

等间距离散信号

使用以下形式的表达式:

timeVector = startTime + sampleTime*(0:numSteps-1)'; 

使用冒号运算符从 0 开始计数,以 1 为增量,直到所需的时间步数减 1,第一个点为 0。然后,按所需的采样时间缩放结果向量,使向量中元素之间的增量现在等于采样时间。向量经过转置,因为支持加载的大多数数据格式都需要列时间向量。要创建开始时间不为零的时间向量,请将所需的开始时间添加到向量中。

例如,使用以下代码创建一个等间距时间向量,该向量从 1 开始,包括 101 个时间点,采样时间为 0.2。

T1 = 1 + 0.2*(0:100)' 

注意

不要使用以下形式的表达式:

timeVector = [startTime:timeStep:endTime]' 

例如,不要使用:

T2 = [0:0.2:10]' 

由于双精度舍入,时间向量 T2 不等于时间向量 T1。像 T2 这样的时间向量中的双精度舍入会导致输入时间向量和求解器计算的时间步之间存在差异,从而导致意外的仿真结果。

非等间距值

使用任何有效的 MATLAB 数组表达式;例如 [1:5 5:10] 或 (1 6 10 15)。

From Workspace、From File 和 Signal Editor 模块支持过零检测。如果根级输入端口连接到这些模块之一,则您可以使用重复的时间条目指定过零时间点。

指定信号和时间数据的示例

第一个示例是具有单个输入端口的模型:

  1. 创建一个输入结构体,用于将类型为 int8 的二元素信号向量的 11 个时间采样加载到该模型中:

    N = 10
    Ts = 0.1
    a.time = Ts*[0:N]';
    c1 = int8([0:1:10]');
    c2 = int8([0:10:100]');
    a.signals(1).values = [c1 c2];
    a.signals(1).dimensions = 2;
    
  2. 在配置参数 > 数据导入/导出 > 输入参数编辑框中,指定变量 a。

  3. 在 Inport 模块对话框的信号属性选项卡中,将端口维度设置为 2,将数据类型设置为 int8。

另一个示例是具有两个输入的模型。

假设您要将正弦波输入第一个端口,将余弦波输入第二个端口。在 MATLAB 工作区中定义结构体 a,如下所示:

a.time = 0.1*[0:1]';
a.signals(1).values = sin(a.time);
a.signals(1).dimensions = 1;
a.signals(2).values = cos(a.time);
a.signals(2).dimensions = 1;

在配置参数 > 数据导入/导出 > 输入参数编辑框中输入结构体名称 (a)。

注意

在此模型中,您无需指定维度和数据类型,因为默认值为 1 和 double。

将数据数组加载到根级输入

您可以以数据数组形式从工作区加载到根级输入端口数据,数组数据的名称在配置参数 > 数据导入/导出 > 输入参数中指定。

此导入格式由数据类型 double 的实数(非复数)矩阵组成。矩阵的第一列必须是按升序排列的时间向量。其余列用于指定输入值。

  • 每列表示不同 Inport 或 Trigger 模块信号的输入(按顺序)。

  • 每行是对应时间点的输入值。

对于 Trigger 模块,驱动触发端口的信号必须是最后一个数据项。

输入矩阵的总列数必须等于 n + 1,其中 n 是进入模型输入端口的信号总数。

指定输入表达式

模型的默认输入表达式为 [t,u],默认输入格式为 Array。如果在 MATLAB 工作区中定义 t 和 u,只需选择配置参数 > 数据导入/导出 > 输入参数即可从模型工作区输入数据。

假设您有具有两个 Inport 模块的模型:

  • In1 模块接受两个信号(该模块的端口维度参数设置为 2)。

  • In2 模块接受一个信号(该模块使用端口维度参数的默认值)。

您可以在 MATLAB 工作区中定义 t 和 u:

numSteps = 9;
timeStep = 0.1;
t = (timeStep*(0:numSteps))';
u = [sin(t),cos(t),4*cos(t)];

在仿真运行时,信号数据 sin(t) 和 cos(t) 赋给 In1,信号数据 4*cos(t) 赋给 In2。信号数据是 100 个时间点的输入。

注意

数组输入格式允许您仅加载 double 类型的实数(非复数)标量或向量数据。可使用结构体格式输入复数数据、矩阵(二维)数据和 double 以外的数据类型。

驱动函数调用子系统的输入端口的数组

您可以使用数组通过根级输入端口来驱动函数调用子系统。您可以直接使用数组或使用作为 Dataset 对象的元素的数组。该数组必须是 n×1 数组。对于根级 Inport 模块,请选择输出函数调用参数。

例如,以下 Dataset 对象具有数组元素 x:

ds = Simulink.SimulationData.Dataset;
x = [1 3 7 8]';
ds = ds.addElement(x,'theElementName');

此模型使用配置参数 > 数据导入/导出 > 输入参数中的 ds 数据集。

仿真模型时,函数调用子系统中记录的信号数据的时间值显示函数调用子系统仅在 ds 中存储的数组所指定的时间触发。

>> logsout{1}.Values.Time

ans =

     1
     3
     7
     8

将 MATLAB 时间表达式加载到根输入端口

指定输入表达式

您可以使用 MATLAB 时间表达式将数据从工作区加载到根级输入端口。要使用时间表达式,请在数据导入/导出窗格的输入字段中以字符串形式输入表达式(用单引号引起来)。时间表达式可以是任何 MATLAB 表达式,其计算结果为一个行向量,该向量的长度等于进入模型输入端口的信号的数量。假设模型有一个接受两个信号的向量输入端口。此外,假设 timefcn 是用户定义的函数,它返回长度为两个元素的行向量。以下是此类模型的有效输入时间表达式:

'[3*sin(t), cos(2*t)]' 

'4*timefcn(w*t)+7'

在仿真的每个时间步计算该表达式,将结果值应用于模型的输入端口。Simulink 在运行仿真时定义变量 t。此外,对于一个变量的函数,您可以在表达式中省略时间变量。例如,表达式 sin 会解释为 sin(t)。

另请参阅

模块

类

主题