Main Content

使用 From Workspace 模块加载数据

此示例说明如何使用 From Workspace 模块创建和格式化要从基础工作区加载的数据。要使用 From Workspace 模块加载数据,您必须在基础、模型或封装工作区中使用 From Workspace 模块支持的格式创建或保存数据。您可以通过编程方式创建您加载的数据,加载在另一个仿真中记录的数据,或加载从传感器或实验室采集的真实数据。您可以将每个格式部分的代码用作模板,以了解如何格式化您自己的仿真输入数据。

检查模型

此示例使用一个简单模型。两个 From Workspace 模块从基础工作区加载数据,创建连接到两个 Outport 模块的信号。一个 From Workspace 模块使用所有模块设置的默认值,另一个配置为加载总线数据。两个 Dashboard Scope 模块显示由每个 From Workspace 模块创建的输出信号。该模型还包含几个 Callback Button 模块,您可以将其用于使用 From Workspace 模块支持的不同格式在基础工作区中生成数据。

该模型使用 PreLoadFcn 回调来:

  • 创建存储在变量 simin 中的 timeseries 数据。

  • 创建存储在变量 busin 中的 timeseries 对象的结构体。

  • 创建 Simulink.Bus 对象,该对象为加载总线数据的 From Workspace 模块定义输出数据类型。

在仿真模型之前,使用 Callback Button 模块之一以所需格式创建数据。要创建数据,请点击以选择该 Callback Button 模块,然后再次点击以运行代码。您可以在模块对话框或属性检查器中查看每个 Callback Button 模块的代码。

创建时间和信号数据

From Workspace 模块支持的大多数数据格式基本上都由配对的时间值和信号值组成。您可以使用 Structure without time 格式仅加载没有对应时间值的输入数据值,这有时是离散仿真所必需的。(有关详细信息,请参阅Control How Models Load Input Data。)此示例创建并加载时长为 10 秒的表示正弦波的信号数据。

首先,创建一个时间向量。使用 From Workspace 模块加载包含时间值的数据时,时间值的数据类型必须为 double,并且时间值必须单调递增。

sampleTime = 0.01;
numSteps = 1001;
time = sampleTime*(0:numSteps-1);
time = time';

使用此示例中的表达式为输入信号创建一个等间距时间向量,尤其是在对离散输入信号建模时。MATLAB® 支持另外几种创建等间距时间向量的方法,但这些方法可能会在时间数据中引入双精度舍入误差,从而导致意外的仿真结果。

现在,使用 sin 函数创建信号数据。

data = sin(2*pi/3*time);

加载 timeseries 数据

Simulink® 加载和记录通常都使用 timeseries 对象将时间序列数据传入和传出仿真。标注为 Create timeseries data to load 的 Callback Button 模块的代码创建时间和信号数据,使用它来创建 timeseries 对象,并将 timeseries 对象分配给加载变量 simin

sampleTime = 0.01;
numSteps = 1001;
time = sampleTime*(0:numSteps-1);
time = time';
data = sin(2*pi/3*time);
simin = timeseries(data,time);

要加载 timeseries 数据,您可以运行代码以在 MATLAB 命令行窗口中创建 simin 加载变量,或选择然后点击 Create timeseries data to load Callback Button 模块。然后,仿真模型并查看 Dashboard Scope 模块中加载的数据。

加载 timetable 数据

您也可以在 MATLAB timetable 中存储时间序列数据。顾名思义,数据格式化为表。使用 timetable 加载数据时,timetable 必须仅在一列中包含单个信号的数据。

标注为 Create timetable data to load 的 Callback Button 模块的代码创建时间和信号数据,将数据格式化为 timetable,并将 timetable 赋给加载变量 simin。要使用 From Workspace 模块加载 timetable,输入时间必须为 duration 向量。此示例使用 seconds 函数创建持续时间向量 secs

sampleTime = 0.01;
numSteps = 1001;
time = sampleTime*(0:numSteps-1);
time = time';
data = sin(2*pi/3*time);
secs = seconds(time);
simin = timetable(secs,data);

要加载 timetable 数据,您可以运行代码以在 MATLAB 命令行窗口中创建 simin 加载变量,或选择然后点击 Create timetable data to load Callback Button 模块。然后,仿真模型并查看 Dashboard Scope 模块中加载的数据。

加载结构体数据

From Workspace 模块支持使用与 StructureStructure with time 记录格式匹配的结构体为信号加载数据。此示例说明如何创建符合 Structure with time 格式的数据。Structure 格式与 Structure with time 格式基本相同,区别在于 Structure 格式没有 time 字段。

该结构体有两个顶层字段,即 timesignals。当您使用 Structure with time 格式记录数据时,signals 字段可能是一个结构体数组,其中每个结构体包含一个不同信号的数据。当您使用 Structure with time 格式加载数据时,signals 字段只能包含一个结构体,且该结构体只包含单个信号的数据。signals 字段的结构体包含一个 values 字段,当信号不是标量时,必须包含多个 dimensions 字段。

标注为 Create structure with time data to load 的 Callback Button 模块的代码创建时间和信号数据,并使用它来构建具有所需字段和层次结构的结构体。该代码首先清除名为 simin 的任何现有变量,该变量可能是属性名称与结构体字段名称匹配的对象。

clear simin;
sampleTime = 0.01;
numSteps = 1001;
time = sampleTime*(0:numSteps-1);
time = time';
data = sin(2*pi/3*time);
simin.time = time;
simin.signals.values = data;

要加载结构体数据,您可以运行代码以在 MATLAB 命令行窗口中创建 simin 加载变量,或选择然后点击 Create structure data to load Callback Button 模块。然后,仿真模型并查看 Dashboard Scope 模块中加载的数据。

为多维信号加载数据时,请再添加一行代码,以将信号维度赋给 simin.signals.dimensions。当信号数据是标量时,如果包含维度字段,请将该字段设置为 1。当每个信号值均为行向量时,您可以将维度指定为 [1 n]n,其中 n 是行向量中的元素数。当每个信号值均为 M×|N| 矩阵时,请将维度字段值指定为 [M N]

当您要加载没有时间数据的仿真输入数据时,请使用不包含 time 字段的 Structure 格式,并使用采样时间参数指定所需的采样率。有关详细信息,请参阅Control How Models Load Input Data

加载数组数据

您可以使用 From Workspace 模块加载格式化为数组的信号数据,其中数组的第一列包含时间数据,后续列包含信号数据。当以数组格式加载数据时,采样值必须为标量或向量。

标注为 Create array data to load 的 Callback Button 模块的代码创建时间和信号数据,将两个行向量串联为一个数组,并将该数组赋给 simin 加载变量。

sampleTime = 0.01;
numSteps = 1001;
time = sampleTime*(0:numSteps-1);
time = time';
data = sin(2*pi/3*time);
simin = [time,data];

要加载数组数据,您可以运行代码以在 MATLAB 命令行窗口中创建 simin 加载变量,或选择然后点击 Create array data to load Callback Button 模块。然后,仿真模型并查看 Dashboard Scope 模块中加载的数据。

加载总线数据

From Workspace 模块支持加载包含 timeseries 对象或时间表作为总线输入数据的结构体。每个 timeseries 对象或时间表都可以包含从单个 timeseries 对象或时间表加载数据时支持的任何类型的数据。

使用 From Workspace 模块加载总线的输入数据时,必须将输出数据类型设置指定为定义总线的 Simulink.Bus 对象。包含总线数据的结构体中的层次结构和字段名称必须与定义输出数据类型的 Bus 对象的层次结构和元素名称匹配。

加载总线数据的 From Workspace 模块将其输出数据类型设置配置为 Bus: SinusoidBus。模型的 PreloadFcn 回调和 Create bus data to load 回调按钮的代码都定义 SinusoidBus 对象。

Bus 对象定义总线层次结构以及总线中元素的属性,如名称和数据类型。此示例中的 Bus 对象定义总线层次结构、总线中包含的信号名称以及嵌套总线的数据类型。总线 SinusoidBus 包含一个信号 Cosine、一个名为 SineBus 的嵌套总线,该嵌套总线包含两个信号 SineBigSine

elems(1) = Simulink.BusElement;
elems(1).Name = 'Sine';
elems(2) = Simulink.BusElement;
elems(2).Name = 'BigSine';
SineBus = Simulink.Bus;
SineBus.Elements = elems;

clear elems;
elems(1) = Simulink.BusElement;
elems(1).Name = 'SineBus';
elems(1).DataType = 'Bus: SineBus';
elems(2) = Simulink.BusElement;
elems(2).Name = 'Cosine';
SinusoidBus = Simulink.Bus;
SinusoidBus.Elements = elems;

有关使用 Simulink.Bus 对象定义总线的详细信息,请参阅使用总线对象指定总线属性

标注为 Create bus data to load 的 Callback Button 模块创建一个由 timeseries 对象组成的结构体,其层次结构和字段名称与 SinusoidBus 对象的层次结构和元素名称相匹配。

sampleTime = 0.01;
numSteps = 1001;
time = sampleTime*(0:numSteps-1);
time = time';

data = sin(2*pi/3*time);
cosdata = cos(2*pi/3*time);
ampdata = 2*data;

clear busin;
busin.Cosine = timeseries(cosdata,time);
busin.SineBus.Sine = timeseries(data,time);
busin.SineBus.BigSine = timeseries(ampdata,time);

要加载总线数据,您可以运行代码以在 MATLAB 命令行窗口中创建 busin 加载变量,或选择然后点击 Create bus data to load Callback Button 模块。然后,仿真模型并查看 Dashboard Scope 模块中加载的数据。

加载部分指定的总线数据

当使用 From Workspace 模块为总线加载输入数据时,不需要为每个总线元素提供数据。要部分指定总线的输入数据,可以省略结构体中的对应字段,或将其值指定为 []

标注为 Create partially specified bus data to load 的 Callback Button 模块创建一个由 timeseries 对象组成的结构体,其层次结构和字段名称与 SinusoidBus 对象的层次结构和元素名称相匹配。它不指定 Cosine 总线元素的数据。

sampleTime = 0.01;
numSteps = 1001;
time = sampleTime*(0:numSteps-1);
time = time';

data = sin(2*pi/3*time);
ampdata = 2*data;

clear busin;
busin.Cosine = [];
busin.SineBus.Sine = timeseries(data,time);
busin.SineBus.BigSine = timeseries(ampdata,time);

要加载部分指定的总线数据,您可以运行代码以在 MATLAB 命令行窗口中创建 busin 加载变量,或选择然后点击 Create partially specified bus data to load Callback Button 模块。然后,仿真模型并查看 Dashboard Scope 模块中加载的数据。

当您为包含嵌套总线或嵌套总线数组的总线部分指定数据时,您可以将整个嵌套总线或嵌套总线数组指定为 [],并且 From Workspace 模块为嵌套总线或总线数组的所有元素提供基值。您还可以通过省略总线数组中包含的一个或多个总线的数据来部分指定总线数组的数据。

加载总线数据的数组

当使用 From Workspace 模块加载总线数组的数据时,必须将输出数据类型参数指定为定义总线数组包含的总线的 Simulink.Bus 对象。总线数组中的所有总线必须由同一个 Simulink.Bus 对象定义。为总线数组加载数据的 From Workspace 模块将其输出数据类型设置为 Bus: SinusoidBus。有关定义 Bus 对象的详细信息,请参阅加载总线数据。

标注为 Create array of buses data to load 的 Callback Button 模块创建一个数组,该数组包含两个由 timeseries 对象组成的结构体,其层次结构和字段名称与 SinusoidBus 对象的层次结构体和元素名称相匹配。第二个结构体 bus2 使用与第一个结构体相同的数据,但会下移 1 位,以便您看到 Dashboard Scope 模块上的所有六个信号。

sampleTime = 0.01;
numSteps = 1001;
time = sampleTime*(0:numSteps-1);
time = time';

data = sin(2*pi/3*time);
cosdata = cos(2*pi/3*time);
ampdata = 2*data;

bus1.Cosine = timeseries(cosdata,time);
bus1.SineBus.Sine = timeseries(data,time);
bus1.SineBus.BigSine = timeseries(ampdata,time);

bus2.Cosine = timeseries((cosdata-1),time);
bus2.SineBus.Sine = timeseries((data-1),time);
bus2.SineBus.BigSine = timeseries((ampdata-1),time);

busin = [bus1,bus2];

要加载总线数组数据,您可以运行代码以在 MATLAB 命令行窗口中创建 busin 加载变量,或选择然后点击 Create array of buses data to load Callback Button 模块。然后,仿真模型并查看 Dashboard Scope 模块中加载的数据。

另请参阅

模块

对象

相关主题