setting Simulink data view tolerance progamatically

조회 수: 2(최근 30일)
Albert Mathews
Albert Mathews 2015년 6월 1일
답변: William R 2018년 8월 24일
is it possible to to set the tolerance used by the SDI programatically? for example,assuming i have some .mat files called alldata_b, and alldata from separate simulink runs.
runID5 = Simulink.sdi.createRun('alldata_b','file','alldata_b');
runID6 = Simulink.sdi.createRun('alldata', 'file','alldata');
diffSDI_tmp = Simulink.sdi.compareRuns(runID5, runID6);
% Number of comparisons in result
cntSigCmp_tmp = diffSDI_tmp.count;
% Iterate through each result element
for i = 1:cntSigCmp_tmp
% Get signal result at index i
sigDiff_tmp = diffSDI_tmp.getResultByIndex(i);
sigNam_tmp = Simulink.sdi.getSignal(i); % create the object first
sigNam_tmp = sigNam_tmp.signalLabel; % get the object from the object
sigDiff_tmp.tol = 1;
end
the line "sigDiff_tmp.tol = 1;" gives the following result:
You cannot set the read-only property 'tol' of DiffSignalResult.
Error in <my_script> (line X)
sigDiff_tmp.tol = 1;
does this mean the only way to change the tolerance is by editing in the SDI? is there no way around this?

채택된 답변

Sriram Narayanan
Sriram Narayanan 2015년 6월 3일
It is currently not possible to tune the signal comparison tolerance programmatically. However, one could specify the absolute and relative tolerance for each signal programmatically.
The following is a code snippet of how this can be achieved.
% Configure model "slexAircraftExample" for logging and simulate
simOut = sim('slexAircraftExample', 'SaveOutput','on', ...
'SaveFormat', 'StructureWithTime', ...
'ReturnWorkspaceOutputs', 'on');
% Create a Simulation Data Inspector run
[runID,runIndex,signalIDs] = Simulink.sdi.createRun('My Run', ...
'base',{'simOut'});
% Get the Simulink.sdi.Run object corresponding to the new run ID
runObj = Simulink.sdi.getRun(runID);
% Get the number of signals in the run
numSignals = runObj.signalCount;
% Get the Simulink.sdi.Signal objects for each signal in the run
% Specify the absolute and relative tolerance for each signal
for i = 1:numSignals
signalObjs(i) = runObj.getSignal(signalIDs(i));
signalObjs(i).absTol = 0.5;
signalObjs(i).relTol = 0.005;
end
  댓글 수: 1
Albert Mathews
Albert Mathews 2015년 6월 23일
Thank you Sriram Narayanan The answer above works for setting the tol values for a run. however, an additional note should be made that if the user wants to set the tol values for a SDI.compareRuns object, the tol values MUST be set for the first run argument, see below, otherwise setting tols for the second run argument does nothing.
runID1 = Simulink.sdi.createRun(blah blah);
[runID,runIndex,signalIDs] = Simulink.sdi.createRun(blah blah);
% Get the Simulink.sdi.Run object corresponding to the new run ID
runObj = Simulink.sdi.getRun(runID);
% Get the number of signals in the run
numSignals = runObj.signalCount;
% Get the Simulink.sdi.Signal objects for each signal in the run
% Specify the absolute and relative tolerance for each signal
for i = 1:numSignals;
signalObjs(i) = runObj.getSignal(signalIDs(i));
signalObjs(i).absTol = 1;
signalObjs(i).relTol = 0.1;
end
diffSDI_tmp = Simulink.sdi.compareRuns(runID, runID1, Simulink.sdi.AlignType.BlockPath);
note how the tols are set for runID, and NOT runID1. and how runID is the first run argument in Simulink.sdi.compareRuns

댓글을 달려면 로그인하십시오.

추가 답변(1개)

William R
William R 2018년 8월 24일
But what is not answered in this post is how to set the time tolerance programmatically of a signal. This can be done manually in the SDi but if you store a Simulink.sdi.Signal to the workspace there is no timeTol property and you can also not add or edit this. If you try to add it the following error pops up:
No public property TimeTol exists for class Simulink.sdi.Signal.
Why is this not possible? Or is there another way to do this?

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by