Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

Simulink.sdi.Signal

访问信号数据和元数据

说明

Simulink.sdi.Signal 对象包含仿真数据检查器中信号的数据和元数据。您可以使用 Signal 对象属性检查信号元数据,在时间图上可视化信号,并使用 Simulink.sdi.compareSignals 函数比较信号。

创建对象

Simulink.sdi.Signal 对象是为您在模型仿真中记录或导入仿真数据检查器中的每个信号创建的。您可以通过几种方式访问仿真数据检查器中的 Signal 对象。通常,要访问 Signal 对象,您首先需要获取包含信号的 Simulink.sdi.Run 对象。

  • Simulink.sdi.getSignal 函数返回与您提供的信号 ID 对应的 Signal 对象。

  • getSignal 函数返回指定的 Run 对象内具有指定信号 ID 的 Signal 对象。

  • getSignalByIndex 函数返回指定的 Run 对象内的指定索引处的 Signal 对象。

属性

全部展开

信号属性

此属性为只读

标识信号的唯一编号,以整数形式返回。仿真数据检查器为每个运行和信号分配唯一的数值 ID。

此属性为只读

包含信号的运行的运行标识符,以整数形式返回。仿真数据检查器为每个运行和信号分配唯一的数值 ID。

信号的名称,指定为字符向量或字符串。当 Signal 对象包含从仿真记录的数据时,该名称与为模型中信号指定的名称相匹配。如果模型未指定名称,则信号名称是产生该信号的模块的模块路径。

示例: 'fuel'

信号类型,指定为以下选项之一:

  • 'Signals' - 信号记录数据。

  • 'Outports' - 输出记录数据。

  • 'States' - 状态记录数据。

  • 'Data Store Memory' - 数据存储内存记录数据。

  • 'Parametrs' - 记录的参数数据。

  • 'Stateflow' - Stateflow® 数据。

  • 'Simscape' - Simscape™ 数据。

  • 'Assessments' - Simulink® Test™ 评估数据。

  • 'Profiling' - 执行探查数据。

对于不是通过记录仿真数据创建的数据,Domain 属性为空。

信号的说明,指定为字符向量或字符串。您可以使用 Description 属性来注释信号或标识 Name 以外的信号内容。当您将 Simscape 数据记录到仿真数据检查器时,系统会自动为每个节点填充 Description 属性。

此属性为只读

存储在磁盘上的信号数据的单位,指定为字符向量或字符串。对于通过仿真模型生成的信号,Signal 对象的存储单位使用在模型中指定的单位。为没有单位的信号指定显示单位时,存储单位也会设置为相同单位。要并排分析使用不同单位的信号,请修改信号的显示单位。仿真数据检查器执行转换以使用显示单位绘制数据。

您可以使用 convertUnits 函数转换信号的存储单位。存储单位转换不支持撤消,且可能会导致精度损失。

示例: 'g/s'

用于在仿真数据检查器中显示信号数据的单位,指定为字符向量或字符串。信号的显示单位可能不同于反映存储在磁盘上的数据的存储单位。修改信号显示单位以在仿真数据检查器中分析数据。仿真数据检查器中的单位预设项可以更改所记录和导入的信号数据的显示单位。有关详细信息,请参阅 Signal Display Units

示例: 'm/s'

此属性为只读

信号数据的数据类型,以字符向量或字符串形式返回。

示例: 'double'

此属性为只读

信号数据的复/实性,以 "real""complex" 形式返回。

示例: "real"

此属性为只读

信号采样时间,以字符向量或标量形式返回。'Continuous' 的值表示可变步长仿真。

示例: 'Continuous'

示例: '0.1'

此属性为只读

产生信号的模型的名称,以字符向量形式返回。对于包含并非通过仿真模型生成的数据的 Signal 对象,Model 属性为空。

示例: 'sldemo_fuelsys'

此属性为只读

产生信号的模块的模块路径,以字符数组形式返回。BlockPath 属性是不包括模型层次结构的相对路径。对于包含并非通过仿真模型生成的数据的 Signal 对象,BlockPath 属性为空。

示例: 'sldemo_fuelsys/Engine Gas Dynamics'

此属性为只读

产生信号的模块的完整模块路径(包括完整模型层次结构),以字符向量形式返回。对于引用模型中的信号,FullBlockPath 是包含完整路径的元胞数组。对于其他信号,FullBlockPathBlockPath 相同。对于包含并非通过仿真模型生成的数据的 Signal 对象,FullBlockPath 属性为空。

此属性为只读

产生信号的模块的名称,以字符向量形式返回。对于包含并非通过仿真模型生成的数据的 Signal 对象,BlockName 属性为空。

示例: 'Engine Gas Dynamics'

此属性为只读

与产生信号的模块上的信号相连的输出端口的索引。对于包含并非通过仿真模型生成的数据的 Signal 对象,PortIndex 属性为空。

示例: 1

此属性为只读

信号维数,以整数或整数数组形式返回。

示例: [1 2]

此属性为只读

矩阵中信号的索引,以整数数组形式返回。

此属性为只读

信号中的采样数,以整数形式返回。

信号的时间和数据值,对于非总线信号,以 timeseries 对象形式返回;对于总线信号,以与总线层次结构匹配的结构体形式返回。

此属性为只读

包含信号的高级结构体的名称,以字符向量形式返回。仅当信号是导入的信号时,RootSource 属性才有值

示例: 当您导入包含结构体 xoutSimulink.SimulationOutput 对象 simOut 时,RootSource'simOut.get('xout')'

此属性为只读

信号时间数据的路径,以字符向量形式返回。仅当信号是导入的信号时,TimeSource 属性才有值

示例: 当您导入包含结构体 xoutSimulink.SimulationOutput 对象 simOut 时,TimeSource'simOut.get('xout').time'

此属性为只读

信号采样值的路径,以字符数组形式返回。仅当信号是导入的信号时,DataSource 属性才有值

示例: 当您导入包含结构体 xoutSimulink.SimulationOutput 对象 simOut 时,DataSource'simOut.get('xout').signals(1).values'

此属性为只读

合成信号包含的信号,以 Simulink.sdi.Signal 对象形式返回。对于标量信号,Children 属性为空。

可视化属性

用于在仿真数据检查器中显示复信号数据的复信号格式,指定为下列值之一。您可以修改 Signal 对象的 ComplexFormat 属性,以更改当对象包含复信号的数据时仿真数据检查器显示信号数据的方式。

  • "real-imaginary" - 绘制信号时,信号的实部和虚部会一起显示。信号的虚部用另一种 Line Color 颜色绘制。

  • "magnitude" - 绘制信号时显示信号的幅值。

  • "magnitude-phase" - 绘制信号时,信号的幅值和相位一起显示。

  • "phase" - 绘制信号时显示信号的相位。相位用另一种 Line Color 颜色绘制。

数据类型: char | string

是否绘制信号,指定为逻辑值。将 Checked 设置为 false 可将信号从所有子图中清除。将 Checked 设置为 true 可在活动子图上绘制信号。

数据类型: logical

图中信号的颜色,指定为 1×3 RGB 向量,其值在 01 之间。

示例: [0 0.5 0.5]

数据类型: double

在仿真数据检查器中绘制信号时使用的信号线线型,指定为以下选项之一:

  • '-' - 实线

  • '--' - 虚线

  • ':' - 点线

  • '-.' - 点划线

在仿真数据检查器中绘制信号时使用的信号线宽度,指定为介于 120 之间(包括二者)的整数。

在数据可视化中和在比较中同步信号时使用的插值方法,指定为下列值之一:

  • 'zoh' - 零阶保持插值

  • 'linear' - 线性插值

  • 'none' - 无插值

有关插值选项的详细信息,请参阅How the Simulation Data Inspector Compares Data

比较属性

信号比较中使用的绝对容差,指定为正值标量。

OverrideGlobalTol 属性设置为 1true 时,仿真数据检查器使用在基线信号的信号属性中指定的容差。有关仿真数据检查器中容差的详细信息,请参阅How the Simulation Data Inspector Compares Data

示例: 0.1

数据类型: double

信号比较中使用的相对容差,指定为正值标量。相对容差表示为小数乘数。例如,0.1 指定 10% 的容差。

OverrideGlobalTol 属性设置为 1true 时,仿真数据检查器使用在基线信号的信号属性中指定的容差。有关仿真数据检查器中容差的详细信息,请参阅How the Simulation Data Inspector Compares Data

示例: 0.05

数据类型: double

信号比较中使用的信号的时间容差,指定为正值标量。指定时间容差,以秒为单位。

OverrideGlobalTol 属性设置为 1true 时,仿真数据检查器使用在基线信号的信号属性中指定的容差。有关仿真数据检查器中容差的详细信息,请参阅How the Simulation Data Inspector Compares Data

示例: 0.1

数据类型: double

比较是否使用信号容差值代替全局容差值,指定为逻辑值。将 OverrideGlobalTol 属性设置为 1true,以使用 Signal 对象属性中定义的容差值。将属性设置为 0false,以使用全局容差值。

有关仿真数据检查器中容差的详细信息,请参阅How the Simulation Data Inspector Compares Data

数据类型: logical

用于在比较中同步信号的方法,指定为 'union''intersection'。有关同步选项的详细信息,请参阅How the Simulation Data Inspector Compares Data

对象函数

convertUnits Convert units of Simulink.sdi.Signal object
export Export Simulink.sdi.Signal object to workspace or file
getAsTall Create tall timetable from Simulink.sdi.Signal object
plotOnSubPlot Plot Simulink.sdi.Signal object on Simulation Data Inspector subplot

示例

全部折叠

您可以通过编程方式指定信号容差值,以便在使用仿真数据检查器进行比较时使用。在此示例中,您将比较通过仿真飞机纵向飞行控制系统模型收集的数据。每次仿真使用不同的输入滤波器时间常量值,并记录输入和输出信号。通过使用仿真数据检查器和信号容差比较结果,可以分析时间常量变化的影响。

首先,加载包含仿真数据的会话文件。

Simulink.sdi.load('AircraftExample.mldatx');

该会话文件包含四次运行。在此示例中,您将比较文件中前两次运行的数据。访问从文件加载的前两次运行的 Simulink.sdi.Run 对象。

runIDs = Simulink.sdi.getAllRunIDs;
runIDTs1 = runIDs(end-3);
runIDTs2 = runIDs(end-2);

现在,在不指定任何容差的情况下比较这两次运行。

noTolDiffResult = Simulink.sdi.compareRuns(runIDTs1,runIDTs2);

使用 getResultByIndex 函数访问 qalpha 信号的比较结果。

qResult = getResultByIndex(noTolDiffResult,1);
alphaResult = getResultByIndex(noTolDiffResult,2);

检查每个信号结果的 Status,查看比较结果是否在我们的容差范围内。

qResult.Status
ans = 
OutOfTolerance
alphaResult.Status
ans = 
OutOfTolerance

该比较对所有容差使用值 0,因此 OutOfTolerance 结果意味着信号不同。

通过为信号指定容差值,可以进一步分析时间常量的影响。通过设置与所比较信号对应的 Simulink.sdi.Signal 对象的属性来指定容差。这些比较使用为基线信号指定的容差。此示例指定时间容差和绝对容差。

要指定容差,首先请访问来自基线运行的 Signal 对象。

runTs1 = Simulink.sdi.getRun(runIDTs1);
qSig = getSignalsByName(runTs1,'q, rad/sec');
alphaSig = getSignalsByName(runTs1,'alpha, rad');

使用 AbsTolTimeTol 属性,为 q 信号指定绝对容差 0.1 和时间容差 0.6

qSig.AbsTol = 0.1;
qSig.TimeTol = 0.6;

alpha 信号指定绝对容差 0.2 和时间容差 0.8

alphaSig.AbsTol = 0.2;
alphaSig.TimeTol = 0.8;

再次比较结果。访问比较结果,并检查每个信号的 Status 属性。

tolDiffResult = Simulink.sdi.compareRuns(runIDTs1,runIDTs2);
qResult2 = getResultByIndex(tolDiffResult,1);
alphaResult2 = getResultByIndex(tolDiffResult,2);

qResult2.Status
ans = 
WithinTolerance
alphaResult2.Status
ans = 
WithinTolerance

此示例说明如何使用仿真数据检查器编程接口获取 Simulink.sdi.Signal 对象并修改其属性。

在仿真数据检查器中创建数据

当您对记录数据的模型进行仿真时,在仿真数据检查器中会创建一次运行来包含记录的数据。您还可以通过导入数据在仿真数据检查器中创建一次运行。此示例对 slexAircraftExample 模型进行仿真,并以 Dataset 格式记录数据。

simOut = sim('slexAircraftExample','SaveFormat','Dataset');

获取 Simulink.sdi.Signal 对象

程序化仿真在工作区变量 simOut 中返回所记录的数据。您可以在该变量中访问所记录的数据。但是,要使用仿真数据检查器编程接口,您需要在 Simulink.sdi.RunSimulink.sdi.Signal 对象中访问所记录的数据。

首先,使用 Simulink.sdi.getCurrentSimulationRun 获取 Run 对象,该对象是在您对 slexAircraftExample 模型进行仿真时创建的。

aircraftRun = Simulink.sdi.getCurrentSimulationRun('slexAircraftExample');

您可以使用 getAllSignals 函数访问运行中所有信号的 Signal 对象。从返回的 Signal 对象数组中,选择第一个信号。

signals = getAllSignals(aircraftRun);
sig = signals(1);

修改信号属性

Simulink.sdi.Signal 对象具有指定用于比较和可视化信号的选项的属性。为信号指定线型和颜色。然后,使用 Simulink.sdi.setSubPlotLayout 配置仿真数据检查器显示单个子图,并使用 plotOnSubPlot 函数绘制信号。

sig.LineColor = [1 0.4 0.6];
sig.LineDashed = '-';

Simulink.sdi.setSubPlotLayout(1,1)
plotOnSubPlot(sig,1,1,true)

使用 Simulink.sdi.view 函数打开仿真数据检查器并查看绘制的信号。

您可以使用仿真数据检查器编程接口比较一次运行中的信号。此示例比较飞机纵向控制器的输入和输出信号。

首先,加载包含数据的会话。

Simulink.sdi.load('AircraftExample.mldatx');

使用 Simulink.sdi.Run.getLatest 函数访问最后一次运行的数据。

aircraftRun = Simulink.sdi.Run.getLatest;

然后,您可以使用 Simulink.sdi.getSignalsByName 函数访问表示控制器输入的 Stick 信号和表示输出的 alpha, rad 信号。

stick = getSignalsByName(aircraftRun,'Stick');
alpha = getSignalsByName(aircraftRun,'alpha, rad');

在比较信号之前,您可以指定用于比较的容差值。比较使用在比较中为基线信号指定的容差值,因此请在 Stick 信号上设置绝对容差值 0.1

stick.AbsTol = 0.1;

现在,使用 Simulink.sdi.compareSignals 函数比较信号。Stick 信号是基线,alpha, rad 信号是要与基线进行比较的信号。

comparisonResults = Simulink.sdi.compareSignals(stick.ID,alpha.ID);
match = comparisonResults.Status
match = 
OutOfTolerance

比较结果超出容差范围。您可以使用 Simulink.sdi.view 函数打开仿真数据检查器来查看和分析比较结果。

此示例演示如何访问通过记录信号而创建的仿真数据检查器运行的 Simulink.sdi.Run 对象。从 Simulink.sdi.Run 对象中,您可以获得包含所记录的信号数据和元数据的 Simulink.sdi.Signal 对象。您可以使用 Signal 对象和 plotOnSubPlot 函数在仿真数据检查器中绘制数据。

创建仿真运行并访问 Run 对象

ex_vdp 模型记录两个信号。要创建包含所记录数据的仿真运行,请对模型进行仿真。

sim('ex_vdp');

仿真数据检查器为通过仿真,导入数据或打开会话而创建的每个运行分配唯一数值 ID,从而跟踪这些运行。要访问您刚刚执行的仿真的运行对象,请使用 Simulink.sdi.getAllRunIDs 函数,并获取返回的向量中的最后一个运行 ID。

runIDs = Simulink.sdi.getAllRunIDs;
runID = runIDs(end);

一旦您获得了该运行的运行 ID,您就可以使用 Simulink.sdi.getRun 函数来获得与该运行对应的 Simulink.sdi.Run 对象。您可以使用 Run 对象来检查与运行相关联的元数据,包括运行中的信号数量。

vdpRun = Simulink.sdi.getRun(runID);

vdpRun.SignalCount
ans = int32
    2

使用 Signal 对象绘制数据

使用 getSignalByIndex 函数从 Run 对象 fuelRun 访问信号。

signal1 = getSignalByIndex(vdpRun,1);
signal2 = getSignalByIndex(vdpRun,2);

使用 Simulink.sdi.setSubPlotLayout 函数指定 3×1 布局。

Simulink.sdi.setSubPlotLayout(2,1)

在绘制数据之前,使用 Simulink.sdi.clearAllSubPlots 函数清除任何已绘制的数据。

Simulink.sdi.clearAllSubPlots

在每个子图上绘制一个信号。要在第一个子图上绘制信号,您可以设置信号的 checked 属性。要在第一个子图以外的子图上绘制信号,请使用 plotOnSubPlot 函数。

signal1.Checked = true;
plotOnSubPlot(signal2,2,1,true);

查看绘制的数据

要查看您刚刚创建的绘图,请使用 Simulink.sdi.view 函数打开仿真数据检查器。

在 R2012b 中推出