Этот пример показывает, как использовать функции 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);