Замена блоков без поддержки

В этом примере показано, как использовать функции Simulink ® Design Verifier™ для замены неподдерживаемых блоков и как настроить генерацию тестовых векторов для определенных требований.

Модель с неподдерживаемым блоком

Пример модели включает блок Switch, выход которого управляется блоком Sqrt. Для каждого положения переключателя выход модели вычисляется блоком 1-D Интерполяционная Таблица. Для этой модели пример сконцентрирован на генерации тестов, которые удовлетворяют следующему:

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 функция при помощи блока 1-D Интерполяционная Таблица.

Данные таблицы были рассчитаны, чтобы соответствовать значениям sqrt, с максимальной ошибкой 0.2 в области значений [0 10000]. См. панель инициализации маски блока Sqrt_Approx в библиотеке sldvdemo_custom_blockreplib для значений данных интерполяционной таблицы.

Правило замены находится в определенном фАЙЛЕ MATLAB sldvdemo_custom_blkrep_rule_sqrt.m. Поскольку замещающий блок sldvdemo_custom_blockreplib для блока Sqrt, действительного только для типов double или single, это правило гарантирует, что эти условия выполняются перед разрешением замены блока.

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

Настройка опций Verifier™ Simulink ® Design для замены блоков

Будет запущен Simulink Design Verifier в генерацию тестов режиме с включенной заменой блоков. В порядок генерации тестов для позиций блока Switch необходимо использовать пользовательское правило замены sldvdemo_custom_blkrep_rule_sqrt.m.

Поскольку вы также заинтересованы в покрытии интерполяционных таблиц, вам нужна встроенная замена блоков blkrep_rule_lookup_normal.m, который вставляет цели тестирования для каждого интервала и значение точки останова для блока 1-D интерполяционной таблицы. Более того, вам нужно встроенное правило 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';

Выполнение генерации тестов с заменой блоков

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