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

В этом примере показано, как использовать функции 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™ для замены блока

Вы запустите 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);