В этом примере показано, как 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 для просмотра связанной функции.
open_system('slvnvdemo_cv_logic_cascade/MATLAB Function')

В блоке MATLAB Function, если (a & & (b | | c)) true, то Data1 сигнала будет выведен; в противном случае выводится Data2 сигнала.
Откройте подсистему «Logic Cascade», используя следующую команду, и обратите внимание, что эта подсистема реализует точно такую же логику, используя блоки логических операторов и коммутатор.
open_system('slvnvdemo_cv_logic_cascade/Logic Cascade');

Наконец, откройте Формирователь сигналов и обратите внимание, что для логических входов a, b и C. Эти комбинации являются FFF, TFT и TTT.
open_system('slvnvdemo_cv_logic_cascade/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
В созданном отчете перейдите к подробной информации для функционального блока MATLAB.


Результаты MCDC для if операторы в блоке MATLAB Function являются такими, как следовало бы ожидать, учитывая указанные входные данные.
Результаты MCDC для логического каскада
Затем изучите результаты для логического каскада. Напомним, что эта комбинация блоков реализует ту же логику, что и код MATLAB в блоке функции MATLAB; поэтому мы ожидаем, что результаты 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 имеет. Это соответствует ожиданиям, заданным входами, генерируемыми формирователем сигналов (TTT, FFF, и TFT).
Кроме того, как и ожидалось, как логическое выражение, так и результаты MCDC, показанные для этого каскада, соответствуют тому, что было показано для if оператор, реализующий эквивалентную логику в блоке функции MATLAB.
Отображение результатов покрытия в модели с помощью следующей команды:
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.
Короткое замыкание на нескольких блоках
Кроме того, рассмотрим объективный результат False Out MCDC для C1, Fxx. Этот результат иллюстрирует, как MCDC-анализ распознает короткое замыкание между блоками. Потому что первый вход в And_Block false, второй вход закорочен. Впоследствии, для целей 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
