以编程方式检查和比较数据
您可以利用MATLAB中的仿真数据检查器的功能®命令行使用模拟数据检查器API。
模拟数据检查器组织运行和信号中的数据,为每个运行和信号分配一个唯一的数字标识。一些模拟数据检查器API函数使用运行id和信号id来引用数据,而不是接受运行id或信号本身作为输入。要访问工作区中的运行id,可以使用Simulink.sdi.getAllRunIDs
或Simulink.sdi.getRunIDByIndex
.您可以通过a访问信号idSimulink.sdi.Run
对象使用getSignalIDByIndex
方法。
的Simulink.sdi.Run
而且Simulink.sdi.Signal
类提供对数据的访问,并允许您查看和修改运行和信号元数据。您可以使用如下函数修改模拟数据检查器首选项Simulink.sdi.setSubPlotLayout
,Simulink.sdi.setRunNamingRule
,Simulink.sdi.setMarkersOn
.若要恢复模拟数据检查器的默认设置,请使用Simulink.sdi.clearPreferences
.
创建一个运行并查看数据
此示例演示如何创建运行,向其添加数据,然后在模拟数据检查器中查看数据。
为运行创建数据
创建timeseries
对象,以包含正弦信号和余弦信号的数据。给每个timeseries
对象的描述性名称。
时间= linspace(0,20,100);sinine_vals = sin(2*pi/5*time);Sine_ts =时间序列(sine_vals,time);sine_ts。Name =“sin, T = 5”;Cos_vals = cos(2*pi/8*time);Cos_ts =时间序列(cos_vals,时间);cos_ts。Name =“余弦,T = 8”;
创建运行并添加数据
使用Simulink.sdi.view
函数打开模拟数据检查器。
Simulink.sdi.view
若要将数据从工作区导入到仿真数据检查器,请创建Simulink.sdi.Run
对象使用Simulink.sdi.Run.create
函数。方法将有关运行的信息添加到其元数据中的名字
而且描述
的属性运行
对象。
sinusoidsRun = Simulink.sdi.Run.create;sinusoidsRun。Name =正弦曲线的;sinusoidsRun。描述=不同频率的正弦和余弦信号;
使用添加
函数将在工作区中创建的数据添加到空运行中。
添加(sinusoidsRun“var”、sine_ts cos_ts);
在模拟数据检查器中绘制数据
使用getSignalByIndex
访问功能Simulink.sdi.Signal
包含信号数据的对象。您可以使用Simulink.sdi.Signal
对象属性指定信号的线条样式和颜色,并在模拟数据检查器中绘制它。指定LineColor
而且LineDashed
每个信号的属性。
sinine_sig = getSignalByIndex(sinusoidsRun,1);sine_sig。LineColor = [0 0 1];sine_sig。LineDashed =“-”。;cos_sig = sinusoidsRun.getSignalByIndex(2);cos_sig。LineColor = [0 1 0];cos_sig。LineDashed =“——”;
使用Simulink.sdi.setSubPlotLayout
函数配置2
——- - - - - -1
模拟数据检查器绘图区域中的子绘图布局。然后使用plotOnSubplot
函数在上面的子图上绘制正弦信号,在下面的子图上绘制余弦信号。
Simulink.sdi.setSubPlotLayout (2, 1);plotOnSubPlot (sine_sig 1 1,真实);plotOnSubPlot (cos_sig 2 1,真实);
关闭模拟数据检查器并保存数据
在检查完绘制的信号数据后,可以关闭Simulation data Inspector并将会话保存到MLDATX文件中。
Simulink.sdi.close (“sinusoids.mldatx”)
比较相同运行中的两个信号
您可以使用模拟数据检查器编程接口来比较单个运行中的信号。本例比较了飞机纵向控制器的输入和输出信号。
首先,加载包含数据的会话。
Simulink.sdi.load (“AircraftExample.mldatx”);
使用Simulink.sdi.Run.getLatest
函数访问数据中的最新运行。
aircraftRun = Simulink.sdi.Run.getLatest;
然后,您可以使用Simulink.sdi.getSignalsByName
函数来访问坚持
信号,它表示控制器的输入α,rad
表示输出的信号。
stick = getSignalsByName(aircraftRun,“坚持”);alpha = getSignalsByName(aircraftRun,“α,rad”);
在比较信号之前,可以指定用于比较的容差值。比较使用比较中为基线信号指定的容差值,因此设置的绝对容差值0.1
在坚持
信号。
棍子。AbsTol = 0.1;
现在,比较信号使用Simulink.sdi.compareSignals
函数。的坚持
信号是基线,而α,rad
信号是要与基线进行比较的信号。
comparisonResults = Simulink.sdi.compareSignals(stick.ID,alpha.ID);match = comparisonResults。状态
match = ComparisonSignalStatus枚举超时容忍
比较结果超差。您可以使用Simulink.sdi.view
功能,打开仿真数据检查器,查看和分析比较结果。
比较run和Global Tolerance
您可以指定比较两次模拟运行时要使用的全局容差值。全局公差值应用于运行中的所有信号。此示例展示如何为运行比较指定全局公差值,以及如何分析和保存比较结果。
首先,加载包含要比较的数据的会话文件。会话文件包含四次模拟飞机纵向控制器的数据。这个例子比较了使用不同输入过滤器时间常数的两次运行的数据。
Simulink.sdi.load (“AircraftExample.mldatx”);
若要访问运行数据进行比较,请使用Simulink.sdi.getAllRunIDs
函数获取与最后两次模拟运行相对应的运行id。
runIDs = Simulink.sdi.getAllRunIDs;runID1 = runid (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
对象查看信号是否在公差值范围内或超出公差值。
runResult。总结
ans =带字段的结构:OutOfTolerance: 0 withtolerance: 3 Unaligned: 0 UnitsMismatch: 0 Empty: 0 cancelled: 0 EmptySynced: 0 DataTypeMismatch: 0 TimeMismatch: 0 StartStopMismatch: 0 Unsupported: 0
所有三个信号比较结果都在指定的全局公差范围内。
方法将比较结果保存到MLDATX文件中saveResult
函数。
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
属性的比较结果问
而且α
信号。
qResult = getResultByIndex(noTolDiffResult,1);alphaResult = getResultByIndex(noTolDiffResult,2);
检查状态
对每个信号结果进行比较,看比较结果是否落在我们的超差范围内。
qResult。状态
ans = ComparisonSignalStatus枚举OutOfTolerance
alphaResult。状态
ans = ComparisonSignalStatus枚举OutOfTolerance
比较使用的值为0
对于一切公差,故之OutOfTolerance
结果意味着信号不相同。
您可以通过指定信号的容差值来进一步分析时间常数的影响。属性的属性指定公差Simulink.sdi.Signal
与正在比较的信号相对应的对象。比较使用为基线信号指定的公差。这个例子指定了一个时间公差和一个绝对公差。
要指定公差,首先访问信号
基线运行的对象。
runTs1 = Simulink.sdi.getRun(runIDTs1);qSig = getSignalsByName(runTs1,“问,rad /秒”);alphaSig = getSignalsByName(runTs1,“α,rad”);
指定的绝对公差0.1
和时间的容忍度0.6
为问
信号使用AbsTol
而且TimeTol
属性。
qSig。AbsTol = 0.1;qSig。TimeTol = 0.6;
指定的绝对公差0.2
和时间的容忍度0.8
为α
信号。
alphaSig。AbsTol= 0.2; alphaSig.TimeTol = 0.8;
再比较一下结果。访问比较的结果并检查状态
属性。
tolDiffResult = Simulink.sdi.compareRuns(runIDTs1,runIDTs2);qResult2 = getResultByIndex(tolDiffResult,1);alphaResult2 = getResultByIndex(tolDiffResult,2);qResult2。状态
ans = ComparisonSignalStatus枚举不耐受
alphaResult2。状态
ans = ComparisonSignalStatus枚举不耐受