以编程方式比较数据
您可以从 MATLAB® 命令行以编程方式利用仿真数据检查器的功能。
仿真数据检查器对运行和信号中的数据进行组织,对每个运行和信号赋予一个唯一数值标识符。Simulink.sdi.Run 和 Simulink.sdi.Signal 对象允许您访问数据以及查看和修改运行和信号元数据。当您以编程方式与仿真数据检查器交互时,一些函数需要 Signal 或 Run 对象作为输入,而其他函数则使用信号或运行 ID。下表列出了一些访问这些对象和 ID 的方法。
| 操作 | 函数 | 所需输入 |
|---|---|---|
| 访问运行 ID | Simulink.sdi.getAllRunIDs | 无 |
Simulink.sdi.getRunIDByIndex | 仿真数据检查器存储库中运行的索引 | |
访问 Simulink.sdi.Run 对象 | Simulink.sdi.Run.getLatest | 无 |
Simulink.sdi.getCurrentSimulationRun | 模型名称 | |
Simulink.sdi.getRun | 运行 ID | |
| 访问信号 ID | getAllSignalIDs | Run 对象 |
getSignalIDByIndex | Run 对象和运行中信号的索引 | |
getSignalIDsByName | Run 对象和信号名称 | |
访问 Simulink.sdi.Signal 对象 | getAllSignals | Run 对象 |
getSignalByIndex | Run 对象和运行中信号的索引 | |
getSignalsByName | Run 对象和信号名称 | |
Simulink.sdi.getSignal | 信号 ID |
比较同一运行中的两个信号
您可以使用仿真数据检查器编程接口比较一次运行中的信号。此示例比较飞机纵向飞行控制器的输入和输出信号。
加载包含飞行控制数据的仿真数据检查器会话文件。
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");
使用 Simulink.sdi.compareSignals 函数,使用信号 ID 比较 Stick 和 alpha, rad 信号。Stick 信号是基线信号。alpha, rad 信号是与基线信号进行比较的信号。
comparisonResults = Simulink.sdi.compareSignals(stick.ID,alpha.ID); match = comparisonResults.Status
match =
ComparisonSignalStatus enumeration
OutOfTolerance
比较结果超出容差范围。您可以使用 Simulink.sdi.view 函数打开仿真数据检查器来查看和分析比较结果。
Simulink.sdi.view

您可以指定用于比较的时间和幅值容差值。这些比较使用为比较中的基线信号指定的容差值。为了考虑相移,在 Stick 信号上设置时间容差 1。为了考虑幅值差,在 Stick 信号上设置绝对容差值 0.1。
stick.TimeTol = 1; stick.AbsTol = 0.1;
再次比较信号。这次,由于设置了绝对容差和时间容差,信号比较通过。
comparisonResults = Simulink.sdi.compareSignals(stick.ID,alpha.ID); match = comparisonResults.Status
match =
ComparisonSignalStatus enumeration
WithinTolerance

使用全局容差比较各运行
您可以指定在比较两个仿真运行时使用的全局容差值。全局容差值应用于运行中的所有信号。此示例说明如何为运行比较指定全局容差值,以及如何分析和保存比较结果。
加载包含要比较的数据的仿真数据检查器会话文件。该会话文件包含一个飞机纵向飞行控制器的四次仿真的数据。此示例比较使用不同输入滤波器时间常数的两次运行的数据。
Simulink.sdi.load("AircraftExample.mldatx");要访问要比较的运行数据,请使用 Simulink.sdi.getAllRunIDs 函数获取对应于最后两次仿真运行的运行 ID。
runIDs = Simulink.sdi.getAllRunIDs; runID1 = runIDs(end - 1); runID2 = runIDs(end);
使用 Simulink.sdi.compareRuns 函数来比较运行。指定全局相对容差值为 0.2,全局时间容差值为 0.5。
runResult = Simulink.sdi.compareRuns(runID1,runID2,"reltol",0.2,"timetol",0.5);
检查返回的 Simulink.sdi.DiffRunResult 对象的 Summary 属性,查看信号是在容差值内还是超出容差。
runResult.Summary
ans = struct with fields:
OutOfTolerance: 0
WithinTolerance: 3
Unaligned: 0
UnitsMismatch: 0
Empty: 0
Canceled: 0
EmptySynced: 0
DataTypeMismatch: 0
TimeMismatch: 0
StartStopMismatch: 0
Unsupported: 0
所有三个信号比较结果都在指定的全局容差内。
您可以使用 saveResult 函数将比较结果保存到一个 MLDATX 文件中。
saveResult(runResult,"InputFilterComparison");使用信号容差分析仿真数据
您可以通过编程方式指定信号容差值,以便在使用仿真数据检查器进行比较时使用。在此示例中,您将比较通过仿真飞机纵向飞行控制系统模型收集的数据。每次仿真使用不同的输入滤波器时间常数值,并记录输入和输出信号。通过使用仿真数据检查器和信号容差比较结果,可以分析时间常数变化的影响。
首先,加载包含仿真数据的会话文件。
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 函数访问 q 和 alpha 信号的比较结果。
qResult = getResultByIndex(noTolDiffResult,1); alphaResult = getResultByIndex(noTolDiffResult,2);
检查每个信号结果的 Status 属性,以查看比较结果是否在容差范围内。
qResult.Status
ans =
ComparisonSignalStatus enumeration
OutOfTolerance
alphaResult.Status
ans =
ComparisonSignalStatus enumeration
OutOfTolerance
该比较对所有容差使用值 0,因此 OutOfTolerance 结果意味着信号不同。
通过为信号指定容差值,可以进一步分析时间常数的影响。通过设置与所比较信号对应的 Simulink.sdi.Signal 对象的属性来指定容差。这些比较使用为基线信号指定的容差。此示例指定时间容差和绝对容差。
要指定容差,首先请访问来自基线运行的 Signal 对象。
runTs1 = Simulink.sdi.getRun(runIDTs1); qSig = getSignalsByName(runTs1,'q, rad/sec'); alphaSig = getSignalsByName(runTs1,'alpha, rad');
对于 q 信号,分别使用 AbsTol 和 TimeTol 属性指定绝对容差 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 =
ComparisonSignalStatus enumeration
WithinTolerance
alphaResult2.Status
ans =
ComparisonSignalStatus enumeration
WithinTolerance