Main Content

Simulink.sdi.compareSignals

比较两个 Simulink.sdi.Signal 对象中的数据

说明

示例

diff = Simulink.sdi.compareSignals(sigID1,sigID2) 比较与信号 ID sigID1sigID2 对应的信号,并将结果返回到 Simulink.sdi.DiffSignalResult 对象中。有关如何计算比较结果的详细信息,请参阅 仿真数据检查器如何比较数据

diff = Simulink.sdi.compareSignals(sigID1,sigID2,Name=Value) 使用由一个或多个名称-值参量指定的选项,比较与信号 ID sigID1sigID2 对应的信号。 (自 R2023a 起)

示例

全部折叠

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

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

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 = 
  ComparisonSignalStatus enumeration

    OutOfTolerance

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

此示例说明如何使用仿真数据检查器的 Simulink.sdi.compareSignals 函数比较一个信号在不同仿真运行中的结果。当您只有一个信号需要比较时,使用信号比较将直接返回 Simulink.sdi.diffSignalResult 对象及比较数据。

生成仿真数据

使用 slexAircraftExample 模型生成仿真运行。在各次运行之间,更改输入滤波器的时间常量。

% Load example model
load_system('slexAircraftExample')

% Mark the alpha, rad signal for streaming
Simulink.sdi.markSignalForStreaming('slexAircraftExample/Aircraft Dynamics Model',4,'on')

% Simulate system
out_1 = sim('slexAircraftExample');

% Change input filter time constant
modelWorkspace = get_param('slexAircraftExample','modelworkspace');
assignin(modelWorkspace,'Ts',0.2)

% Simulate again
out_2 = sim('slexAircraftExample');

获取用于信号比较的信号 ID

使用运行 ID 创建运行对象,然后使用 getSignalIDByIndex 获取要传递给 Simulink.sdi.compareSignals 的信号 ID。

% Get run data
runIDs = Simulink.sdi.getAllRunIDs;

runID1 = runIDs(end-1);
runID2 = runIDs(end);

run1 = Simulink.sdi.getRun(runID1);
run2 = Simulink.sdi.getRun(runID2);

sigID1 = getSignalIDByIndex(run1,1);
sigID2 = getSignalIDByIndex(run2,1);

比较信号

比较两个信号,然后打开仿真数据检查器查看结果。

diffResult = Simulink.sdi.compareSignals(sigID1,sigID2);

Simulink.sdi.view

输入参数

全部折叠

基线信号的信号 ID,指定为整数。创建一个运行时,仿真数据检查器会为每个信号赋予一个信号 ID。您可以使用以下函数之一获取信号的信号 ID:

要比较的信号的信号 ID,指定为整数。创建一个运行时,仿真数据检查器会为每个信号赋予一个信号 ID。您可以使用以下函数之一获取信号的信号 ID:

名称-值参数

将可选的参量对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量后,但参量对组的顺序无关紧要。

在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: diff = Simulink.sdi.compareSignals(sigID1,sigID2,DataType="MustMatch")

比较时对信号数据类型的敏感度,指定为 "MustMatch"。如果您希望比较对所比较信号中的数值数据类型不匹配敏感,请指定 DataType="MustMatch"

当信号数据类型不匹配时,Simulink.sdi.DiffSignalResult 结果对象的 Status 属性设置为 DataTypeMismatch

Simulink.sdi.compareSignals 函数将先比较数据类型,再同步和比较信号数据。如果不指定此名称-值参量,数据类型检查只用于检测是否为字符串和数值数据之间的比较。对于字符串和数值数据之间的比较,不计算结果,且结果的状态为 DataTypeMismatch。对于具有不同数值数据类型的信号,比较会计算结果。

如果您将比较配置为在遇到第一次不匹配时停止,则数据类型不匹配会停止比较。

比较时对信号时间向量的敏感度,指定为 "MustMatch"。当您希望比较对所比较信号的时间向量中的不匹配敏感,请指定 Time="MustMatch"。当您指定此名称-值参量时,算法会先比较时间向量,再同步和比较信号数据。

当时间向量不匹配时,Simulink.sdi.DiffSignalResult 结果对象的 Status 属性设置为 TimeMismatch

除非指定此名称-值参量,否则比较对信号时间向量的差异不敏感。如果比较对时间向量的差异不敏感,比较算法会在比较之前同步信号。有关同步如何工作的详细信息,请参阅仿真数据检查器如何比较数据

如果您指定时间向量必须匹配并将比较配置为在遇到第一次不匹配时停止,则时间向量不匹配会停止比较。

比较时对信号开始和停止时间的敏感度,指定为 "MustMatch"。如果您希望比较对信号开始和停止时间的不匹配敏感,请指定 StartStop="MustMatch"。当您指定此名称-值参量时,算法会在同步和比较信号数据之前比较每个信号的开始和停止时间。

当开始时间和停止时间不匹配时,Simulink.sdi.DiffSignalResult 结果对象的 Status 属性设置为 StartStopMismatch

如果您指定开始和停止时间必须匹配并将比较配置为在第一次不匹配时停止,则开始或停止时间不匹配会停止比较。

比较是否在第一次检测到不匹配时停止,指定为 "Metadata""Any"。在比较多维信号时,停止的比较可能不会计算所有通道的结果,并且会更快地返回不匹配的结果。

  • "Metadata" - 元数据不匹配会停止比较。元数据比较发生在信号数据比较之前。

    仿真数据检查器始终比较信号单位。如果您将比较配置为在遇到第一次不匹配时停止,则不匹配的单位始终会停止比较。您可以指定额外的名称-值参量来配置比较,以检查是否存在额外元数据(如信号数据类型、开始和停止时间以及时间向量)的不匹配,并在第一次遇到该不匹配时停止。

  • "Any" - 元数据或信号数据不匹配会停止比较。

是否计算多维信号中每个通道的比较结果,指定为逻辑值 true (1) 或 false (0)。

  • true1 - 比较将表示为具有非标量采样值的单个信号的多维信号扩展为一组具有标量采样值的信号,并计算每个信号的比较结果。

    该多维信号在仿真数据检查器中仍将表示为含非标量采样值的单个信号,这并不会有所改变。

  • false0 - 比较不计算表示为具有非标量采样值的单个信号的多维信号的结果。

输出参量

全部折叠

信号比较结果,以 Simulink.sdi.DiffSignalResult 对象形式返回。复信号比较结果以包含两个 DiffSignalResult 对象的数组形式返回。DiffSignalResult 对象包含实数数据,另一个包含虚数数据。检查 DiffSignalResult 对象的 Name 属性,以确定它是包含实数还是虚数数据。

限制

仿真数据检查器不支持比较以下项:

  • 在 R2020a 之前: int64uint64 数据类型的信号。

  • 可变大小信号。

如果执行多个信号比较或运行比较,则只有最新的 DiffSignalResult 对象具有可见属性。

版本历史记录

在 R2011b 中推出