将数据加载到根级输入端口
您可以将数据从工作区加载到使用以下模块之一建模的根级输入端口:
这些模块根据配置参数 > 数据导入/导出 > 输入参数的值从工作区中导入数据。
提示
要将多个信号导入到根级输入端口中,请考虑使用根输入端口映射器工具。有关详细信息,请参阅Map Root Inport Signal Data。
您也可以使用 From Workspace 模块从工作区中导入数据。有关详细信息,请参阅 From Workspace 文档和为基本测试用例加载输入数据。
指定输入数据
您可以使用输入配置参数手动指定输入数据。要将多个信号加载到根级输入端口,请考虑使用根输入端口映射工具,该工具可以在输入参数中自动指定您用它映射的数据。有关详细信息,请参阅使用根输入端口映射器工具映射数据。
选择配置参数 > 数据导入/导出 > 输入参数。
注意
输入配置参数的使用独立于用于保存记录数据的格式配置参数的设置。
在相邻编辑框中输入外部输入设定,然后点击应用。有关您可以指定的数据形式的列表,请参阅输入数据的形式。
在输入框中,可使用以下方法之一指定信号输入:
对 MATLAB® 函数(表示为字符串)或 MATLAB 表达式使用输入
u = UT(t)
,在运行时为每个仿真时间步创建数据。使用输入数据的形式中描述的输入数据形式直接指定数据。
逗号分隔的列表
如果您指定 Dataset
数据,请为输入参数仅指定一个 Dataset
对象。不要将其包含在逗号分隔列表中。
每个变量或表达式都必须计算为与模型中特定根级输入端口对应的适当对象。列表中的每个变量或表达式的计算结果必须为与模型的一个根级输入端口对应的适当对象。第一项对应于第一个根级输入端口,第二项对应于第二个根级输入端口,以此类推。每个数据样本的维度必须与输入模块参数中指定的数据的维度相匹配。
对于 Enable 或 Trigger 模块,驱动使能或触发端口的信号必须是逗号分隔列表中的最后一项。如果同时具有使能和触发端口,则指定:
使能端口作为列表中的倒数第二项
触发端口作为最后一项
使用空矩阵来指定端口的接地值。例如,要为输入端口 in1
和 in3
加载数据,并对端口 in2
使用接地值,请在输入参数中输入以下内容:
in1, [], in3
输入数据的形式
您可以使用以下格式提供输入数据:
Simulink.SimulationData.Dataset
- 以 MATLABtimeseries
格式记录的数据的集合。有关详细信息,请参阅将数据集数据加载到根级输入。MATLAB
timeseries
- 有关详细信息,请参阅:Simulink.SimulationData.DatasetRef
- 有关详细信息,请参阅Load Big Data for Simulations。MATLAB
timetable
- 有关详细信息,请参阅将 MATLAB 时间表数据加载到根级输入。数组 - 请参阅将数据数组加载到根级输入。
Simulink.SimulationData.Signal
- 有关详细信息,请参阅Load Data Logged in Another Simulation。matlab.io.datastore.SimulationDatastore
- 有关详细信息,请参阅Work with Big Data for Simulations。结构体 - 为了简化外部输入数据的设定,您可以为一部分根级输入端口模块加载数据。这种方法可避免为要使用接地值的端口创建数据结构体。有关接地值的信息,请参阅初始化信号和离散状态。有关加载结构体数据的详细信息,请参阅将数据结构体加载到根级输入。
包含所有输入端口数据的结构体数组。
空矩阵 - 对要使用接地值的端口使用空矩阵,而不必创建数据值。
时间表达式 - 有关详细信息,请参阅将 MATLAB 时间表达式加载到根输入端口。
注意
当您指定要加载的 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
对象满足以下要求之一的数组:
数组的第一列是时间,其余每一列对应一个输入端口。请参阅将数据数组加载到根级输入。
驱动函数调用子系统的根输入端口的
nx1
数组。
结构体 - 请参阅将数据结构体加载到根级输入。
对于总线,可以使用以下格式之一的结构体,其中的每个数据元素对应一个叶信号:
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); |
二维行向量,并且只有一个时间步 | 最后一个 |
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-by-5-by-51
。dimensions
字段指定输入的维度。如果每个输入值都是标量或向量(一维数组),则dimensions
字段必须是指定向量长度的标量值(1 表示标量)。如果每个输入值都是矩阵(二维数组),则dimensions
字段必须是二元素向量,其中:第一个元素指定矩阵的行数
第二个元素指定列数
指定时间数据
您可以将双精度时间向量指定为要导入的数据结构体的一部分。例如,在导入信号数据时指定时间向量以表示连续被控对象或创建测试用例。要测试离散算法,请使用具有空时间向量的结构体。下表根据要加载的信号数据类型提供了指定时间值的其他建议。
信号数据 | 时间数据建议 |
---|---|
具有离散采样时间的 Inport 或 Trigger 模块 | 不要指定时间向量。Simulink 在每个时间步加载一个信号值。 |
等间距离散信号 | 使用以下形式的表达式: timeVector = startTime + sampleTime*(0:numSteps-1)'; 使用冒号运算符从 0 开始计数,以 1 为增量,直到所需的时间步数减 1,第一个点为 例如,使用以下代码创建一个等间距时间向量,该向量从 T1 = 1 + 0.2*(0:100)' 注意 不要使用以下形式的表达式: timeVector = [startTime:timeStep:endTime]' 例如,不要使用: T2 = [0:0.2:10]' 由于双精度舍入,时间向量 |
非等间距值 | 使用任何有效的 MATLAB 数组表达式;例如 From Workspace、From File 和 Signal Editor 模块支持过零检测。如果根级输入端口连接到这些模块之一,则您可以使用重复的时间条目指定过零时间点。 |
指定信号和时间数据的示例
第一个示例是具有单个输入端口的模型:
创建一个输入结构体,用于将类型为
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;
在配置参数 > 数据导入/导出 > 输入参数编辑框中,指定变量
a
。在 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
对象的元素的数组。该数组必须是 nx1
数组。对于根级 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)
。
另请参阅
模块
类
相关示例
- Load Bus Data to Root-Level Input Ports
- 将 MATLAB 时间序列数据加载到根级输入
- 将数据数组加载到根级输入
- 将 MATLAB 时间表达式加载到根输入端口
- 将数据结构体加载到根级输入
- Comparison of Signal Loading Techniques