exponenta event banner

Программный контроль и сравнение данных

Можно использовать возможности инспектора данных моделирования из командной строки MATLAB ® с помощью API инспектора данных моделирования .

Инспектор данных моделирования организует данные в прогонах и сигналах, присваивая каждому прогону и сигналу уникальный числовой идентификатор. Некоторые функции API Simulation Data Inspector используют идентификаторы прогона и сигнала для ссылки на данные, а не принимают прогон или сам сигнал в качестве входных данных. Для доступа к идентификаторам выполнения в рабочей области можно использовать Simulink.sdi.getAllRunIDs или Simulink.sdi.getRunIDByIndex. Доступ к идентификаторам сигналов можно получить через Simulink.sdi.Run с использованием getSignalIDByIndex способ.

Simulink.sdi.Run и Simulink.sdi.Signal классы обеспечивают доступ к данным и позволяют просматривать и изменять метаданные запуска и сигналов. Настройки инспектора расчетных данных можно изменить с помощью таких функций, как Simulink.sdi.setSubPlotLayout, Simulink.sdi.setRunNamingRule, и Simulink.sdi.setMarkersOn. Чтобы восстановить параметры инспектора данных моделирования по умолчанию, используйте Simulink.sdi.clearPreferences.

Создание прогона и просмотр данных

В этом примере показано, как создать прогон, добавить в него данные, а затем просмотреть данные в инспекторе данных моделирования.

Создание данных для прогона

Создать timeseries объекты, содержащие данные для синусоидального сигнала и косинусного сигнала. Дать каждому timeseries объект описательное имя.

time = linspace(0,20,100);

sine_vals = sin(2*pi/5*time);
sine_ts = timeseries(sine_vals,time);
sine_ts.Name = 'Sine, T=5';

cos_vals = cos(2*pi/8*time);
cos_ts = timeseries(cos_vals,time);
cos_ts.Name = 'Cosine, T=8';

Создание прогона и добавление данных

Используйте Simulink.sdi.view для открытия инспектора данных моделирования.

Simulink.sdi.view

Чтобы импортировать данные в инспектор данных моделирования из рабочей области, создайте Simulink.sdi.Run с использованием Simulink.sdi.Run.create функция. Добавление информации о выполнении в метаданные с помощью Name и Description свойства Run объект.

sinusoidsRun = Simulink.sdi.Run.create;
sinusoidsRun.Name = 'Sinusoids';
sinusoidsRun.Description = 'Sine and cosine signals with different frequencies';

Используйте add добавление данных, созданных в рабочей области, в пустой прогон.

add(sinusoidsRun,'vars',sine_ts,cos_ts);

Печать данных в инспекторе расчетных данных

Используйте getSignalByIndex функция для доступа Simulink.sdi.Signal объекты, содержащие данные сигнала. Вы можете использовать Simulink.sdi.Signal свойства объекта для задания стиля и цвета линии для сигнала и вывода его на печать в Инспекторе данных моделирования. Укажите LineColor и LineDashed свойства для каждого сигнала.

sine_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,true);
plotOnSubPlot(cos_sig,2,1,true);

Закрытие инспектора данных моделирования и сохранение данных

По завершении проверки данных напечатанного сигнала можно закрыть инспектор данных моделирования и сохранить сеанс в файле MLDATX.

Simulink.sdi.close('sinusoids.mldatx')

Сравнение двух сигналов в одном и том же прогоне

Программный интерфейс Simulation Data Inspector можно использовать для сравнения сигналов в одном прогоне. В этом примере сравниваются входной и выходной сигналы продольного контроллера самолета.

Сначала загрузите сеанс, содержащий данные.

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');

Перед сравнением сигналов можно указать значение допуска для сравнения. В сравнениях используются значения допуска, заданные для базового сигнала в сравнении, поэтому установите абсолютное значение допуска, равное 0.1 на Stick сигнал.

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.load('AircraftExample.mldatx');

Чтобы получить доступ к данным выполнения для сравнения, используйте Simulink.sdi.getAllRunIDs для получения идентификаторов прогонов, соответствующих двум последним прогонам моделирования.

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);

Проверьте Summary свойство возвращенного Simulink.sdi.DiffRunResult объект, чтобы увидеть, были ли сигналы в пределах значений допуска или вне допуска.

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

Все три результата сравнения сигналов находятся в пределах заданного глобального допуска.

Результаты сравнения можно сохранить в файл 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 для доступа к результатам сравнения для q и alpha сигналы.

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');

Задание абсолютного допуска 0.1 и временной допуск 0.6 для q сигнал с помощью AbsTol и TimeTol свойства.

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

Задание абсолютного допуска 0.2 и временной допуск 0.8 для alpha сигнал.

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

См. также

Связанные темы