В этом примере показано, как использовать функции Simulink® Design Verifier™, чтобы заменить неподдерживаемые блоки и к тому, как настраивают генерацию тестового вектора для конкретных требований.
Модель в качестве примера включает блок switch, выходом которого управляет блок Sqrt. Для каждого положения переключателя выход модели вычисляется 1D блоком Lookup Table. Для этой модели пример концентрируется на генерации тестов, которые удовлетворяют следующему:
1. Достигните 100%-го покрытия интерполяционных таблиц.
2. Тестовые векторы демонстрируют каждое положение блока switch, когда значения его первых и третьих входных портов отличаются.
open_system('sldvdemo_sqrt_blockrep');
Начиная с sqrt
функция не поддерживается, эта модель частично совместима с Simulink Design Verifier.
sldvcompat('sldvdemo_sqrt_blockrep');
Entering Stage: 'SLDV Compatibility Analysis' for Model: 'sldvdemo_sqrt_blockrep' Checking compatibility of model 'sldvdemo_sqrt_blockrep' Compiling model... done Checking compatibility... done Warning: Simulink Design Verifier has only partial support for some elements of the model: 'sldvdemo_sqrt_blockrep' is partially compatible with Simulink Design Verifier. The model can be analyzed by Simulink Design Verifier. It contains unsupported elements that will be stubbed out during analysis. The results of the analysis might be incomplete. Warning: Block 'sldvdemo_sqrt_blockrep/Sqrt' is configured to operate as function sqrt. Simulink Design Verifier does not support this function. 'sldvdemo_sqrt_blockrep' is partially compatible with Simulink Design Verifier. The model can be analyzed by Simulink Design Verifier. It contains unsupported elements that will be stubbed out during analysis. The results of the analysis might be incomplete. Exiting Stage: 'SLDV Compatibility Analysis' for Model: 'sldvdemo_sqrt_blockrep'
Эта модель может анализироваться для генерации тестов путем автоматического блокирования неподдерживаемого блока Sqrt. Однако тесты не могут быть сгенерированы для положений блока switch, потому что Simulink Design Verifier не изучает блок Sqrt, и выход этого блока производит блок switch. Поскольку вы хотите тесты для блока switch, необходимо заменить блок Sqrt на поддерживаемый блок, который функционально эквивалентен. Библиотечный блок sldvdemo_custom_blockreplib
показанный ниже ограничивает входной сигнал к области значений [0 10000]
и аппроксимирует sqrt
функция при помощи 1D блока Lookup Table.
Табличные данные были вычислены, чтобы совпадать со значениями sqrt
, ошибка имеющая 0.2
в области значений [0 10000]
. Обратитесь к панели инициализации маски блока Sqrt_Approx
в библиотеке sldvdemo_custom_blockreplib
для значений данных об интерполяционной таблице.
Заменяющее правило находится в заданном файл MATLAB sldvdemo_custom_blkrep_rule_sqrt.m
. Начиная с заменяющего блока sldvdemo_custom_blockreplib
для Sqrt блок только допустим для двойных или одного типов, это правило гарантирует, что этим условиям удовлетворяют прежде, чем позволить замену блока.
function rule = sldvdemo_custom_blkrep_rule_sqrt
rule = SldvBlockReplacement.blockreprule; rule.fileName = mfilename;
rule.blockType = 'Sqrt';
rule.replacementPath = sprintf('sldvdemo_custom_blockreplib/Sqrt_Approx');
rule.replacementMode = 'Normal';
parameter.OutMin = '$original.OutMin$'; parameter.OutMax = '$original.OutMax$'; parameter.OutDataTypeStr = '$original.OutDataTypeStr$'; rule.parameterMap = parameter;
rule.isReplaceableCallBack = @replacementTestFunction;
end
function out = replacementTestFunction(blockH)
out = false; acceptedOutDataTypeStr = {'double','single',... 'Inherit: Inherit via back propagation',... 'Inherit: Same as input'}; I = strmatch(get_param(blockH,'OutDataTypeStr'),acceptedOutDataTypeStr,'exact'); if ~isempty(I)
portDataTypes = get_param(blockH,'CompiledPortDataTypes');
out = any(strcmp(portDataTypes.Inport,{'double','single'})) && ... strcmp(portDataTypes.Inport,portDataTypes.Outport); end end
open_system('sldvdemo_custom_blockreplib'); open_system('sldvdemo_custom_blockreplib/Sqrt_Approx/1-D Lookup Table');
Вы запустите Simulink Design Verifier в режиме генерации тестов с включенными заменами блока. Для того, чтобы сгенерировать тесты для положений блока switch, необходимо использовать пользовательское заменяющее правило sldvdemo_custom_blkrep_rule_sqrt.m
.
Поскольку вы также интересуетесь покрытием интерполяционных таблиц, вам нужна встроенная замена блока blkrep_rule_lookup_normal.m
, который вставляет цели тестирования для каждого интервала и значение точки останова для 1D блока Lookup Table. Кроме того, вам нужно встроенное правило blkrep_rule_switch_normal.m
, который требует, чтобы каждое положение переключателя было осуществлено, когда значения первых и третьих входных портов отличаются. Обратитесь к Замене Блока в документации Simulink Design Verifier для списка всех встроенных заменяющих правил.
Анализ запустится максимум для 30 секунд и произведет модель тестовой обвязки. Сообщите, что генерация также включена. Другие опции Simulink Design Verifier установлены в свои значения по умолчанию.
opts = sldvoptions; opts.Mode = 'TestGeneration'; opts.MaxProcessTime = 30; opts.BlockReplacement = 'on'; opts.BlockReplacementRulesList = ['sldvdemo_custom_blkrep_rule_sqrt.m,' ... 'blkrep_rule_lookup_normal.m,'... 'blkrep_rule_switch_normal.m']; opts.SaveHarnessModel = 'on'; opts.ModelReferenceHarness = 'on'; opts.SaveReport = 'on';
sldvrun
функция анализирует модель с помощью настроек, заданных в sldvoptions
объект opts
. Сгенерированный отчет включает в себя блок суммирования главы замены, выполняемые на модели.
[status,fileNames] = sldvrun('sldvdemo_sqrt_blockrep', opts, true);
Включите метрику покрытия интерполяционных таблиц и затем запустите тесты с помощью модели тестовой обвязки. Можно также выполнить комплект тестов путем нажимания кнопки "Run all" на диалоговом окне Signal Builder после включения покрытия интерполяционных таблиц в меню "Analysis"> "Coverage"> "Settings".
Отчет покрытия, показанный ниже, указывает, что можно достигнуть 100%-го покрытия интерполяционных таблиц с тестовыми векторами, которые сгенерировал Simulink Design Verifier.
[harnessModelPath,harnessModel] = fileparts(fileNames.HarnessModel); set_param(harnessModel,'covMetricSettings','dcmte'); sldvdemo_playall(harnessModel);
Чтобы завершить пример, закройте все модели и удалите файлы, которые сгенерировал Simulink Design Verifier.
close_system('sldvdemo_custom_blockreplib'); close_system(fileNames.HarnessModel,0); close_system(fileNames.BlockReplacementModel,0); close_system('sldvdemo_sqrt_blockrep',0); delete(fileNames.HarnessModel); delete(fileNames.BlockReplacementModel); delete(fileNames.DataFile);