Блокируйте замены для неподдерживаемых блоков

В этом примере показано, как использовать функции 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');
Checking compatibility for test generation: model 'sldvdemo_sqrt_blockrep'
Compiling model...done
Building model representation...done

'sldvdemo_sqrt_blockrep' is partially compatible for test generation 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. 
See the Diagnostic Viewer for more details on the unsupported elements.

Создание заменяющего правила пользовательского блока работать вокруг несовместимости

Эта модель может анализироваться для генерации тестов путем автоматического блокирования неподдерживаемого блока 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™ для замены блока

Вы запустите 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 = 80;
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);
Warning: Cannot tune parameters in block 'sldvdemo_sqrt_blockrep/1-D Lookup
Table' while using the Lookup Table Coverage option. The Coverage tool will
ignore the new parameter values. 
Warning: Cannot tune parameters in block 'sldvdemo_sqrt_blockrep/1-D Lookup
Table' while using the Lookup Table Coverage option. The Coverage tool will
ignore the new parameter values. 
Warning: Cannot tune parameters in block 'sldvdemo_sqrt_blockrep/1-D Lookup
Table' while using the Lookup Table Coverage option. The Coverage tool will
ignore the new parameter values. 
Warning: Cannot tune parameters in block 'sldvdemo_sqrt_blockrep/1-D Lookup
Table' while using the Lookup Table Coverage option. The Coverage tool will
ignore the new parameter values. 
Warning: Cannot tune parameters in block 'sldvdemo_sqrt_blockrep/1-D Lookup
Table' while using the Lookup Table Coverage option. The Coverage tool will
ignore the new parameter values. 
Warning: Cannot tune parameters in block 'sldvdemo_sqrt_blockrep/1-D Lookup
Table' while using the Lookup Table Coverage option. The Coverage tool will
ignore the new parameter values. 
Warning: Cannot tune parameters in block 'sldvdemo_sqrt_blockrep/1-D Lookup
Table' while using the Lookup Table Coverage option. The Coverage tool will
ignore the new parameter values. 
Warning: Cannot tune parameters in block 'sldvdemo_sqrt_blockrep/1-D Lookup
Table' while using the Lookup Table Coverage option. The Coverage tool will
ignore the new parameter values. 
Warning: Cannot tune parameters in block 'sldvdemo_sqrt_blockrep/1-D Lookup
Table' while using the Lookup Table Coverage option. The Coverage tool will
ignore the new parameter values. 
Warning: Cannot tune parameters in block 'sldvdemo_sqrt_blockrep/1-D Lookup
Table' while using the Lookup Table Coverage option. The Coverage tool will
ignore the new parameter values. 
Warning: Cannot tune parameters in block 'sldvdemo_sqrt_blockrep/1-D Lookup
Table' while using the Lookup Table Coverage option. The Coverage tool will
ignore the new parameter values. 
Warning: Cannot tune parameters in block 'sldvdemo_sqrt_blockrep/1-D Lookup
Table' while using the Lookup Table Coverage option. The Coverage tool will
ignore the new parameter values. 
Warning: Cannot tune parameters in block 'sldvdemo_sqrt_blockrep/1-D Lookup
Table' while using the Lookup Table Coverage option. The Coverage tool will
ignore the new parameter values. 
Warning: Cannot tune parameters in block 'sldvdemo_sqrt_blockrep/1-D Lookup
Table' while using the Lookup Table Coverage option. The Coverage tool will
ignore the new parameter values. 
Warning: Cannot tune parameters in block 'sldvdemo_sqrt_blockrep/1-D Lookup
Table' while using the Lookup Table Coverage option. The Coverage tool will
ignore the new parameter values. 
Warning: Cannot tune parameters in block 'sldvdemo_sqrt_blockrep/1-D Lookup
Table' while using the Lookup Table Coverage option. The Coverage tool will
ignore the new parameter values. 
Warning: Cannot tune parameters in block 'sldvdemo_sqrt_blockrep/1-D Lookup
Table' while using the Lookup Table Coverage option. The Coverage tool will
ignore the new parameter values. 
Warning: Cannot tune parameters in block 'sldvdemo_sqrt_blockrep/1-D Lookup
Table' while using the Lookup Table Coverage option. The Coverage tool will
ignore the new parameter values. 

Выполнение тестов в модели тестовой обвязки

Включите метрику покрытия интерполяционных таблиц и затем запустите тесты с помощью модели тестовой обвязки. Можно также выполнить набор тестов путем нажимания кнопки "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);