Этот пример иллюстрирует, как Simulink ® Coverage™ записывает метрику MCDC для каскада блоков Логического Оператора.
В Simulink существуют различные способы реализации логики Boolean, например, через использование 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, если (a & & (b | | c) верно, то Data1 сигнала будет выведено; в противном случае выводится Data2 сигнала.
Откройте подсистему 'Logic Cascade' с помощью следующей команды и обратите внимание, что эта подсистема реализует точно такую же логику, используя блоки Logical Operator и Switch.
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"
, обращаясь к Логическому Оператору в корне каскада. Щелкните эту ссылку, чтобы перейти в раздел отчета, показывающий результаты для этого блока.
Блок Логического Оператора в корне каскада (в этом случае And_Block
) сообщает результаты MCDC для всего каскада.
Детали для анализа MCDC каскада сначала показывают ссылку, иллюстрирующую, сколько блоков включено в каскад. Кликнув по ссылке "Includes 2 blocks"
поднимет модель и выделит два блока, входящих в каскад (Or_Block
и And_Block
).
Этот раздел отчета тогда показывает Булево выражение, представленное каскадом, в этом случае C1 && (C2 | | C3), где C1
, C2
, и C3
- условия, которые соответствуют трем входам в каскад. Для каждого условия таблица иллюстрирует связанный блок и его вход (показан в круглых скобках), а также результат MCDC. Эти результаты указывают, что входные комбинации TTx
, Fxx
, и TFT
все были выполнены, но TFF
not. это соответствует ожиданию с учетом входов, сгенерированных Signal Builder (TTT
, FFF
, и TFT
).
Кроме того, как ожидалось, результаты как Boolean expression, так и 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 isJustified: 0 filterRationale: '' trueExecutedIn: [] falseExecutedIn: [] ans = struct with fields: text: 'C2 (Or_Block In1)' achieved: 0 trueRslt: 'TTx' falseRslt: '(TFF)' isFiltered: 0 isJustified: 0 filterRationale: '' trueExecutedIn: [] falseExecutedIn: [] ans = struct with fields: text: 'C3 (Or_Block In2)' achieved: 0 trueRslt: 'TFT' falseRslt: '(TFF)' isFiltered: 0 isJustified: 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, поскольку последний всегда рассматривается как короткое замыкание.
Короткое замыкание внутри блока
Заметьте, что в примере выше, True Out MCDC целевой результат для C2
является TTx
, что указывает на то, что когда C1
и C2
оба верны, C3
является несравненным из-за короткого замыкания внутри Or_Block
.
Короткое замыкание между несколькими блоками
Кроме того, рассмотрите Ложный результат MCDC для C1
, Fxx
. Этот результат иллюстрирует, как анализ MCDC распознает короткое замыкание между блоками. Потому что первый вход в And_Block
false, второй вход коротко замыкается. Впоследствии, в целях MCDC, эти короткие схемы Or_Block
(и оба его входов) полностью. Поведение короткого замыкания MCDC для каскадов логических блоков происходит на основе приоритета операций в соответствующем логическом выражении (независимо от порядка выполнения блоков Логического Оператора во время симуляции).
Некороткие логические выражения
Можно также рассматривать логическое выражение, представленное каскадом блоков Логического оператора, как некороткое замыкание во время анализа MCDC, при условии, что используется определение маскирования MCDC. Для этого установите параметр CovLogicBlockShortCircuit равным "off"
и убедитесь, что для CovMcdcMode задано значение "Masking"
. Это, по сути, настройки по умолчанию для этих параметров при создании новой модели.
Обратите внимание, если CoLogicBlockShortCircuit "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