В этом примере показано, как использовать перегруженные операторы +, * и - для объединения результатов покрытия в объединение, пересечение или установку разницы результатов.
Откройте простую модель с двумя взаимоисключающими подсистемами.
open_system('slvnvdemo_cv_mutual_exclusion')

Используйте команды cvtest и cvsim для запуска моделирования. Первоначально значение блока константы равно 0, что вынуждает подсистему 2 выполнять.
test1 = cvtest('slvnvdemo_cv_mutual_exclusion');
data1 = cvsim(test1)
data1 = ... cvdata
version: (R2021a)
id: 231
type: TEST_DATA
test: cvtest object
rootID: 233
checksum: [1x1 struct]
modelinfo: [1x1 struct]
startTime: 27-Jan-2021 07:37:25
stopTime: 27-Jan-2021 07:37:25
intervalStartTime: 0
intervalStopTime: 0
simulationStartTime: 0
simulationStopTime: 10
filter:
simMode: Normal
Следующие команды изменяют значение блока константы на 1 перед выполнением второго моделирования. Это вынуждает подсистему 1 выполнять.
set_param('slvnvdemo_cv_mutual_exclusion/Constant','Value','1'); test2 = cvtest('slvnvdemo_cv_mutual_exclusion'); data2 = cvsim(test2)
data2 = ... cvdata
version: (R2021a)
id: 286
type: TEST_DATA
test: cvtest object
rootID: 233
checksum: [1x1 struct]
modelinfo: [1x1 struct]
startTime: 27-Jan-2021 07:37:27
stopTime: 27-Jan-2021 07:37:27
intervalStartTime: 0
intervalStopTime: 0
simulationStartTime: 0
simulationStopTime: 10
filter:
simMode: Normal
Мы используем decisioninfo команда, чтобы извлечь покрытие принятия решения из каждого теста и перечислить его в процентах.
Примечание: В то время как оба теста имеют 50% покрытия принятия решений, то, покрывают ли они одни и те же 50%, неизвестно.
cov1 = decisioninfo(data1,'slvnvdemo_cv_mutual_exclusion'); percent1 = 100*(cov1(1)/cov1(2)) cov2 = decisioninfo(data2,'slvnvdemo_cv_mutual_exclusion'); percent2 = 100*(cov2(1)/cov2(2))
percent1 =
50
percent2 =
50
Используйте оператор + для получения третьего объекта cvdata, представляющего объединение объектов data1 и data2 cvdata.
Примечание.Новые объекты cvdata, созданные из комбинаций других результатов моделирования, помечаются свойством type, установленным как DERIVED_DATA.
dataUnion = data1 + data2
dataUnion = ... cvdata
version: (R2021a)
id: 0
type: DERIVED_DATA
test: []
rootID: 233
checksum: [1x1 struct]
modelinfo: [1x1 struct]
startTime: 27-Jan-2021 07:37:25
stopTime: 27-Jan-2021 07:37:27
intervalStartTime: 0
intervalStopTime: 0
filter:
simMode: Normal
Обратите внимание, что объединение покрытия составляет 100%, поскольку покрытие между двумя аппаратами не перекрывается.
covU = decisioninfo(dataUnion,'slvnvdemo_cv_mutual_exclusion');
percentU = 100*(covU(1)/covU(2))
percentU = 100
Убедитесь, что покрытие не перекрывается между двумя тестами, пересекая данные 1 и 2 с оператором *. Как и ожидалось, покрытие принятия решений на перекрестке составляет 0%.
dataIntersection = data1 * data2
covI = decisioninfo(dataIntersection,'slvnvdemo_cv_mutual_exclusion');
percentI = 100*(covI(1)/covI(2))
dataIntersection = ... cvdata
version: (R2021a)
id: 0
type: DERIVED_DATA
test: []
rootID: 233
checksum: [1x1 struct]
modelinfo: [1x1 struct]
startTime: 27-Jan-2021 07:37:25
stopTime: 27-Jan-2021 07:37:27
intervalStartTime: 0
intervalStopTime: 0
filter:
simMode: Normal
percentI =
0
Производные объекты cvdata могут использоваться во всех командах отчетов и анализа, а также в качестве входных данных для последующих операций. Например, создайте отчет о покрытии из производного объекта dataIntersection.
cvhtml('intersect_cov', dataIntersection); % Input to another operation newUnion = dataUnion + dataIntersection
newUnion = ... cvdata
version: (R2021a)
id: 0
type: DERIVED_DATA
test: []
rootID: 233
checksum: [1x1 struct]
modelinfo: [1x1 struct]
startTime: 27-Jan-2021 07:37:25
stopTime: 27-Jan-2021 07:37:27
intervalStartTime: 0
intervalStopTime: 0
filter:
simMode: Normal

Оператор - используется для формирования объекта cvdata, который представляет разность наборов между левым и правым операндами. Результат операции содержит точки покрытия, которые удовлетворяются в левом операнде, но не удовлетворяются в правом операнде. Эта операция полезна для определения объема дополнительного покрытия, относимого к определенному тесту.
В следующем примере разница между объединением первого и второго тестового покрытия и первого тестового покрытия должна указывать, насколько дополнительное покрытие обеспечил второй тест. Как уже показано, поскольку ни одна из точек покрытия принятия решения не перекрывалась, новое покрытие принятия решения из теста 2 составляет 50%.
newCov2 = dataUnion - data1
covN = decisioninfo(newCov2,'slvnvdemo_cv_mutual_exclusion');
percentN = 100*(covN(1)/covN(2))
newCov2 = ... cvdata
version: (R2021a)
id: 0
type: DERIVED_DATA
test: []
rootID: 233
checksum: [1x1 struct]
modelinfo: [1x1 struct]
startTime: 27-Jan-2021 07:37:25
stopTime: 27-Jan-2021 07:37:27
intervalStartTime: 0
intervalStopTime: 0
filter:
simMode: Normal
percentN =
50