В следующем примере описывается настройка, выполнение и сравнение результатов модели rtwdemo_cgv в режимах симуляции normal и software-in-the-loop (SIL).
Первой задачей для проверки числовой эквивалентности является проверка строения вашей модели.
Откройте rtwdemo_cgv
модель.
cgvModel = 'rtwdemo_cgv'; load_system(cgvModel);
Сохраните модель в рабочей директории.
save_system(cgvModel, fullfile(pwd, cgvModel)); close_system(cgvModel); % avoid original model shadowing saved model
Используйте cgv.Config
для создания cgv.Config
объект. Задайте параметры, которые проверяют и изменяют значения параметров конфигурации и сохраняют модель для режима выполнения SIL верхней модели.
cgvCfg = cgv.Config('rtwdemo_cgv', 'connectivity', 'sil', 'SaveModel', 'on');
Используйте configModel
метод, чтобы просмотреть ваши строения модели и изменить настройки, чтобы сконфигурировать вашу модель для SIL. Когда 'connectivity'
установлено в 'sil'
системный целевой файл автоматически устанавливается на 'ert.tlc'
. Если вы задали пару параметр/значение, ('SaveModel', 'on'
) когда вы создали cgvCfg
объект, cgv.Config.configModel
метод сохраняет модель.
Примечание
CGV работает с открытыми моделями. Если вы изменяете модель, не сохраняя ее, CGV может выдать ошибку.
cgvCfg.configModel(); % Evaluate, change, and save your model for SIL
Отображение отчета об изменениях, которые cgv.Config.configModel
делает в модель.
cgvCfg.displayReport(); % In this example, this reports no changes
Используйте CGV API, чтобы выполнить модель в двух режимах. Два режима в этом примере являются симуляцией режима normal mode и режимом SIL. В каждом выполнении модели объект CGV для каждого режима захватывает выходные данные и записывает данные в файл.
Если вы еще не сделали этого, выполните шаги, описанные в Configure the Model.
Создайте cgv.CGV
объект, который задает rtwdemo_cgv
модель в симуляции режима normal mode.
cgvSim = cgv.CGV(cgvModel, 'connectivity', 'sim');
Примечание
Когда модель верхнего уровня устанавливается в режим симуляции normal, CGV API устанавливает модели-ссылки в режиме PIL в режим Accelerator.
Предоставьте файл входа в cgvSim
объект.
cgvSim.addInputData(1, [cgvModel '_data']);
Перед выполнением модели укажите файлы MATLAB для выполнения или MAT-файлы для загрузки. Этот шаг является необязательным.
cgvSim.addPostLoadFiles({[cgvModel '_init.m']});
Укажите место, где объект записывает все выходные данные и файлы метаданных для выполнения. Этот шаг является необязательным.
cgvSim.setOutputDir('cgv_output');
Выполните модель.
result1 = cgvSim.run();
Получите выходные данные, сопоставленные с входными данными.
outputDataSim = cgvSim.getOutputData(1);
Для следующего режима выполнения, SIL, повторите шаги 2-7.
cgvSil = cgv.CGV( cgvModel, 'Connectivity', 'sil'); cgvSil.addInputData(1, [cgvModel '_data']); cgvSil.addPostLoadFiles({[cgvModel '_init.m']}); cgvSil.setOutputDir('cgv_output'); result2 = cgvSil.run();
После настройки и выполнения теста сравните выходы, выполнив следующее:
Если вы еще не сделали этого, сконфигурируйте и протестируйте модель, как описано в Configure the Model и Execute the Model.
Проверяйте, что результат выполнения модели:
if ~result1 || ~result2 error('Execution of model failed.'); end
Используйте getOutputData
метод для получения выходных данных из cgv. Объекты CGV.
simData = cgvSim.getOutputData(1); silData = cgvSil.getOutputData(1);
Отображение списка сигналов по имени с помощью getSavedSignals
способ.
cgvSim.getSavedSignals(simData);
Используя список сигналов, составьте список сигналов в массиве ячеек из векторов символов. Список сигналов может содержать ряд сигналов.
signalList = {'simData.getElement(4).Values.Data'};
Используйте createToleranceFile
метод для создания файла, в этом примере, 'localtol'
, корреляция информации допуска с именами выходных сигналов.
toleranceList = {{'absolute', 0.5}}; cgv.CGV.createToleranceFile('localtol', signalList, toleranceList);
Сравните выходные сигналы данных. По умолчанию в compare
метод рассматривает все сигналы, которые имеют общее имя между обоими выполнение. Если файл допуска присутствует, cgv.CGV.compare
использует связанный допуск для определенного сигнала во время сравнения; в противном случае допуск равен нулю. В этом примере 'Plot'
параметру задано значение 'mismatch'
. Поэтому только несоответствующие сигналы создают график.
[matchNames, ~, mismatchNames, ~] = ... cgv.CGV.compare(simData, silData, 'Plot', 'mismatch', ... 'Tolerancefile', 'localtol'); fprintf( '%d Signals match, %d Signals mismatch\n', ... length(matchNames), length(mismatchNames)); disp('Mismatched Signal Names:'); disp(mismatchNames);
14 Signals match, 1 Signals mismatch Mismatched Signal Names: 'simData.getElement(4).Values.Data'
График является результатом несоответствия сигнала.
Нижний график отображает числовое различие между результатами.
После настройки и выполнения теста сравните выходы отдельных сигналов, выполнив следующее:
Если вы еще не сделали этого, сконфигурируйте и протестируйте модель, как описано в Configure the Model и Execute the Model.
Используйте getOutputData
метод получения выходных данных из cgv.CGV
объекты.
simData = cgvSim.getOutputData(1); silData = cgvSil.getOutputData(1);
Используйте getSavedSignals
метод отображения имен выходных сигналов данных. Составьте список конкретных имен сигналов в массиве ячеек из векторов символов. Список сигналов может содержать ряд сигналов.
cgv.CGV.getSavedSignals(simData); signalList = {'simData.getElement(3).Values.hi1.mid0.lo1.Data', ... 'simData.getElement(3).Values.hi1.mid0.lo2.Data', ... 'simData.getElement(2).Values.Data(:,3)'};
Используйте указанные сигналы как вход в compare
метод для сравнения сигналов из отдельных запусков.
[matchNames, ~, mismatchNames, ~] = ... cgv.CGV.compare(simData, silData, 'Plot', 'mismatch', ... 'signals', signalList); fprintf( '%d Signals match, %d Signals mismatch\n', ... length(matchNames), length(mismatchNames)); if ~isempty(mismatchNames) disp( 'Mismatched Signal Names:'); disp(mismatchNames); end
3 Signals match, 0 Signals mismatch
После настройки и запуска теста используйте plot
способ построения графика выходных сигналов.
Если вы еще не сделали этого, сконфигурируйте и протестируйте модель, как описано в Configure the Model и Execute the Model.
Используйте getOutputData
метод получения выходных данных из cgv.CGV
объекты.
simData = cgvSim.getOutputData(1);
Используйте getSavedSignals
метод отображения имен выходных сигналов данных. Составьте список конкретных имен сигналов в массиве ячеек из векторов символов. Список сигналов может содержать ряд сигналов.
cgv.CGV.getSavedSignals(simData); signalList = {'simData.getElement(2).Values.Data(:,1)'};
Используйте указанный список сигналов как вход в plot
метод для сравнения сигналов из отдельных запусков.
[signalNames, signalFigures] = cgv.CGV.plot(simData, ... 'Signals', signalList);