Этот пример иллюстрирует, как Simulink® Coverage™ записывает метрику MCDC для каскада блоков Логического оператора.
В Simulink существуют различные способы реализовать Булеву логику, такой как с помощью if
оператор в блоке MATLAB function, условный переход в диаграмме Stateflow или комбинация нескольких блоков Логического оператора, соединенных вместе в каскаде.
Модель slvnvdemo_cv_logic_cascade
в качестве примера реализует то же Булево выражение с помощью кода MATLAB в блоке MATLAB function, а также с каскадом блоков Логического оператора.
Используйте следующую команду, чтобы открыть модель slvnvdemo_cv_logic_cascade
:
open_system('slvnvdemo_cv_logic_cascade');
Откройте блок MATLAB function, чтобы видеть присоединенную функцию.
open_system('slvnvdemo_cv_logic_cascade/MATLAB Function')
В блоке MATLAB function, если (&& (b | | c)) будет верно, то сигнал Data1 будет выведен; в противном случае сигнал Data2 выводится.
Откройте подсистему 'Логическое Каскадное' использование следующей команды и обратите внимание, что эта подсистема реализует ту же самую логику с помощью блоков Логического оператора и Переключателя.
open_system('slvnvdemo_cv_logic_cascade/Logic Cascade');
Наконец, откройте Signal Builder и обратите внимание, что существует три комбинации, данные для входного a булевской переменной, b, и c. Эти комбинации являются FFF, TFT и TTT.
open_system('slvnvdemo_cv_logic_cascade/Signal Builder');
Закройте Signal Builder.
close_system('slvnvdemo_cv_logic_cascade/Signal Builder', 0);
Симулируйте модель и сгенерируйте Отчет Покрытия.
testObj = cvtest('slvnvdemo_cv_logic_cascade'); testObj.settings.decision = 1; testObj.settings.condition = 1; testObj.settings.mcdc = 1; covdata = cvsim(testObj); % Simulate for coverage cvhtml('exampleReport.html',covdata); % Generate Coverage Report
Результаты MCDC для блока MATLAB function
В сгенерированном отчете перейдите к деталям для блока MATLAB function.
MCDC заканчивается для if
оператор в блоке MATLAB function - как ожидался бы, давался бы заданные входные параметры.
Результаты MCDC для логического каскада
Затем исследуйте результаты на логический каскад. Вспомните, что эта комбинация блоков реализует ту же логику как код MATLAB в блоке MATLAB function; поэтому, мы ожидали бы, что результатами MCDC будет то же самое, также.
Давайте сначала смотреть на восходящий Or_Block
.
Заметьте, что сводные данные MCDC для этого блока имеют ссылку с текстом "see And_Block"
, обращение к Логическому оператору в корне каскада. Нажмите на эту ссылку, которая будет взята к разделу отчета, показывающего результаты для этого блока.
Блок Logical Operator в корне каскада (в этом случае And_Block
) сообщают результаты MCDC для целого каскада.
Детали для анализа MCDC каскада сначала показывают ссылку, иллюстрирующую, сколько блоков включено в каскад. Нажимание на ссылку "Includes 2 blocks"
поднимет модель и подсветит два блока, включенные в каскад (Or_Block
и And_Block
).
Этот раздел отчета затем показывает Булево выражение, представленное каскадом, в этом случае C1 && (C2 | | C3), где C1
C2
, и C3
условия, которые соответствуют трем входным параметрам к каскаду. Для каждого условия таблица иллюстрирует связанный блок и его вход (показанный в круглой скобке), а также результат MCDC. Эти результаты показывают что входные комбинации TTx
, Fxx
, и TFT
были все осуществлены, но TFF
не имеет. Это совпадает с ожиданием, учитывая входные параметры, сгенерированные Signal Builder (TTT
, FFF
, и TFT
).
Кроме того, как ожидалось, и Булево выражение и результаты MCDC, показанные для этого каскадного соответствия, что показали для if
оператор, реализующий эквивалентную логику в блоке MATLAB function.
Отобразите результаты покрытия на модели с помощью следующей команды:
cvmodelview(covdata);
Как был показан в Отчете Покрытия, цели MCDC не зарегистрированы для отдельных блоков Логического оператора в каскаде; скорее цели MCDC зарегистрированы для Булевого выражения, представленного комбинацией блоков в каскаде, и о результатах сообщают относительно итогового блока в каскаде. Выделение модели отражает это, также. Учитывая входные комбинации FFF
, TFT
, и TTT
для трех входных параметров a, b, и c, Or_Block
получает полный охват, потому что всем целям покрытия Условия блока удовлетворили. Однако, потому что существуют цели MCDC, сопоставленные с этим каскадом, которым не удовлетворили, And_block
(итоговый блок в каскаде), подсвечен в красном.
Наведите на And_block
для получения дополнительной информации.
Подсказка правильно сообщает, что этот блок не получает полный охват, потому что некоторым целям MCDC для каскада не удовлетворяют.
Можно также получить результаты MCDC для каскада логического блока из командной строки MATLAB с помощью mcdcinfo
. Снова, цели MCDC для каскада будут найдены на итоговом блоке в каскаде.
[coverage_casc, description_casc] = mcdcinfo(covdata, 'slvnvdemo_cv_logic_cascade/Logic Cascade/And_Block')
description_casc.condition(1)
description_casc.condition(2)
description_casc.condition(3)
coverage_casc = 1 3 description_casc = struct with fields: text: 'C1 && (C2 || C3)' condition: [1x3 struct] isFiltered: 0 filterRationale: '' justifiedCoverage: 0 ans = struct with fields: text: 'C1 (And_Block In1)' achieved: 1 trueRslt: 'TFT' falseRslt: 'Fxx' isFiltered: 0 filterRationale: '' trueExecutedIn: [] falseExecutedIn: [] ans = struct with fields: text: 'C2 (Or_Block In1)' achieved: 0 trueRslt: 'TTx' falseRslt: '(TFF)' isFiltered: 0 filterRationale: '' trueExecutedIn: [] falseExecutedIn: [] ans = struct with fields: text: 'C3 (Or_Block In2)' achieved: 0 trueRslt: 'TFT' falseRslt: '(TFF)' isFiltered: 0 filterRationale: '' trueExecutedIn: [] falseExecutedIn: []
Другие блоки, которые являются членами каскада, не покажут цели MCDC.
[coverage_or, description_or] = mcdcinfo(covdata, 'slvnvdemo_cv_logic_cascade/Logic Cascade/Or_Block')
coverage_or = [] description_or = []
В модели slvnvdemo_cv_logic_cascade
в качестве примера, настройки покрытия установлены таким образом, что блоки Логического оператора обработаны как замыкание накоротко.
Из-за этой установки, при анализе каскада блоков Логического оператора, операторы в соответствующем Булевом выражении обработаны как закорачивающий в целях MCDC. Как проиллюстрировано результатами, показанными выше, это означает, что MCDC распознает замыкание накоротко, которое происходит и в и через блоки Логического оператора. По сути, MCDC заканчивается для каскада тех соответствий блоков Логического оператора из if
оператор в блоке MATLAB function, когда последний всегда обрабатывается как замыкание накоротко.
Замыкание накоротко в блоке
Заметьте это в примере выше, Истина результат цели MCDC для C2
TTx
, указание на это, когда C1
и C2
оба верны, C3
несущественно из-за замыкания накоротко в Or_Block
.
Замыкание накоротко через несколько блоков
Кроме того, считайте Ложь результатом цели MCDC для C1
, Fxx
. Этот результат иллюстрирует, как анализ MCDC распознает замыкание накоротко через блоки. Поскольку первый вход к And_Block
является ложным, второй вход закорачивается. Впоследствии, в целях MCDC, это короткие схемы Or_Block
(и оба из его входных параметров) полностью. Поведение замыкания накоротко MCDC для каскадов логического блока происходит на основе приоритета операций в соответствующем Булевом выражении (независимо от порядка выполнения блоков Логического оператора в процессе моделирования).
Незамыкание накоротко Булевых выражений
Можно также обработать Булево выражение, представленное каскадом блоков Логического оператора как не закорачивающий во время анализа MCDC, при условии, что определение маскирования MCDC используется. Для этого установите параметр CovLogicBlockShortCircuit на "off"
и гарантируйте, что CovMcdcMode установлен в "Masking"
. Это, на самом деле, настройки по умолчанию для этих параметров при создании новой модели.
Отметьте, если CovLogicBlockShortCircuit является "off"
и CovMcdcMode установлен в "UniqueCause"
затем блоки Логического оператора в каскаде будут анализироваться индивидуально в целях MCDC, и MCDC для Булевого выражения, представленного каскадом в целом, не будет вычислен.
Заметьте, что, когда каскад в этом примере не обработан как замыкание накоротко, некоторым целям MCDC больше не удовлетворяют данные входные параметры.
set_param('slvnvdemo_cv_logic_cascade', 'CovLogicBlockShortCircuit', 'off'); set_param('slvnvdemo_cv_logic_cascade', 'CovMcdcMode', 'Masking'); covdata_non_sc = cvsim('slvnvdemo_cv_logic_cascade'); % Simulate for coverage with logic block short-circuiting off cvhtml('exampleReport_non_sc.html',covdata_non_sc); % Generate Coverage Report