Пакет: slcoverage
Выберите критерий S-функции для правила фильтрации
Использование объектов slcoverage.SFcnSelector
Класс для определения критериев выбора S-функций для правила фильтра.
The slcoverage.SFcnSelector
класс является handle
класс.
sel = slcoverage.SFcnSelector(type,id)
создает SFcnSelector
объект заданного type
на основе блока S-Function id
и устанавливает Type
и Id
свойства.
sel = slcoverage.SFcnSelector(type,id,fileName)
создает SFcnSelector
объект на основе заданных fileName
C или C++, и устанавливает
FileName
свойство.
sel = slcoverage.SFcnSelector(type,id,fileName,functionName)
создает SFcnSelector
объект на основе заданных functionName
C или C++ в указанном файле и устанавливает
FunctionName
свойство.
sel = slcoverage.SFcnSelector(type,id,fileName,functionName,expr,exprIndex)
создает SFcnSelector
объект на основе заданного выражения и exprIndex
и устанавливает Expr
и ExprIndex
свойства.
sel = slcoverage.SFcnSelector(type,id,fileName,functionName,expr,exprIndex,outcomeIndex)
создает SFcnSelector
объект на основе заданного результата покрытия и устанавливает OutcomeIndex
свойство.
sel = slcoverage.SFcnSelector(type,id,fileName,functionName,expr,exprIndex,outcomeIndex,parentExprIndex)
создает SFcnSelector
объект на основе заданного результата покрытия, родительский элемент является другим выражением, заданным parentExprIndex
и устанавливает DecOrCondIndex
свойство.
Type
- Тип S-функции slcoverage.SFcnSelectorType
перечислениеТип S-функции, которую нужно выбрать, заданный как перечисление slcoverage.SFcnSelectorTjype
класс:
slcoverage.SFcnSelectorType.SFcnName
выбирает указанную S-функцию.
slcoverage.SFcnSelectorType.SFcnInstanceCppFileName
выбирает сгенерированный файл кода для этого блока. Используйте этот входной параметр со fileName
аргумент.
slcoverage.SFcnSelectorType.SFcnInstanceCppFunction
выбирает образец функции C или C++. Используйте этот входной параметр со fileName
и functionName
аргументы.
slcoverage.SFcnSelectorType.SFcnInstanceCppCondition
выбирает условие в указанном коде. Используйте этот входной параметр с fileName
, functionName
, expr
, и exprIndex
аргументы.
slcoverage.SFcnSelectorType.SFcnInstanceCppDecision
выбирает решение в указанном коде. Используйте этот входной параметр с fileName
, functionName
, expr
, и exprIndex
аргументы.
slcoverage.SFcnSelectorType.SFcnInstanceCppDecisionOutcome
выбирает результат решения в указанном коде. Используйте этот входной параметр с fileName
, functionName
, expr
, exprIndex
, и outcomeIndex
аргументы.
slcoverage.SFcnSelectorType.SFcnInstanceCppConditionOutcome
выбирает результат условия в указанном коде. Используйте этот входной параметр с fileName
, functionName
, expr
, exprIndex
, и outcomeIndex
аргументы. Если выражение, которому принадлежит результат, принадлежит родительское решение, также используйте parentExprIndex
аргумент.
slcoverage.SFcnSelectorType.SFcnInstanceCppMCDCOutcome
выбирает результат MCDC в указанном коде. Используйте этот входной параметр с fileName
, functionName
, expr
, exprIndex
, и outcomeIndex
аргументы.
slcoverage.SFcnSelectorType.SFcnInstanceCppRelationalBoundaryOutcome
выбирает результат реляционной границы в указанном коде. Используйте этот входной параметр со fileName
, functionName
, expr
, exprIndex
, и outcomeIndex
аргументы. Если результатом реляционного оператора является условие, которое находится внутри решения, также используйте parentExprIndex
аргумент.
Типы данных: slcoverage.SFcnSelectorType
Id
- Идентификатор элемента моделиИдентификатор элемента модели, заданный как имя свойства элемента, указатель на элемент или идентификатор Simulink элемента. Используйте указатель или идентификатор для типов селектора, выбирающих образец. Используйте имя свойства, например значение 'BlockType'
свойство блока, чтобы выбрать несколько элементов модели.
SetAccess | protected |
Типы данных: char
| string
| handle
| integer
FileName
- Файл C или C++ для выбораcharacter array
| string array
Файл C или C++ для выбора, заданный как символьный массив или строковые массивы.
Пример: 'myfile.c'
SetAccess | protected |
Типы данных: char
| string
FunctionName
- функция C или C++ для выбораcharacter array
| string array
Функция C или C++ для выбора, заданная как символьный массив или строковые массивы.
Пример: 'counterbusFcn'
SetAccess | protected |
Типы данных: char
| string
Expr
- Выражение для выбораcharacter array
| string array
Выражение, которое нужно выбрать, заданное как символьный массив или строковые массивы.
Пример: 'inputGElower'
SetAccess | protected |
Типы данных: char
| string
ExprIndex
- Индекс выраженияИндекс выражения, заданный как целое число. Если вы фильтруете результат, это свойство является индексом выражения, которому принадлежит этот результат. Если вы фильтруете выражение, это свойство является индексом этого выражения в теле функции.
Пример: 2
SetAccess | protected |
Типы данных: single
| double
| int
OutcomeIndex
- Индекс выбранного результатаИндекс выбранного результата, заданный как целое число:
Для логического выражения введите 1
для F
результат или 2
для T
результат.
Для оператора switch/case введите 1
для первого случая, 2
для второго случая и так далее.
Для реляционного контура
Целый тип:
введите 1
для типа -1
.
введите 2
для типа +1
.
введите 3
для типа 0
.
Тип с плавающей точкой:
введите 1
для [-tol 0]
или [-tol 0)
.
введите 2
для (0 tol]
или [0 tol]
является результатом 2
Для получения дополнительной информации о реляционном граничном покрытии см. «Реляционное граничное покрытие».
Пример: 2
SetAccess | protected |
Типы данных: single
| double
| int
DecOrCondIndex
- Индекс родительского выраженияИндекс родительского выражения, заданный как целое число. Используйте этот вход для фильтрации выражения, которое принадлежит родительскому решению или условию; это индекс родительского решения или условия относительно функции.
Пример: 2
SetAccess | protected |
Типы данных: single
| double
| int
Description
- Описание селектораОписание селектора, возвращаемое как вектор символов. Simulink Coverage™ создает описание на основе селектора.
SetAccess | protected |
ConstructorCode
- Код, используемый для создания этого объекта селектораКод, используемый для создания этого объекта селектора, возвращенный как вектор символов.
SetAccess | protected |
allSelectors | Селекторы для модели или элемента кода |
В этом примере показано, как создать селектор S-Function.
Загрузите модель при помощи load_system
.
load_system('slvnvdemo_covfilt');
Создайте селектор S-Функции при помощи slcoverage.SFcnSelector
. Чтобы выбрать S-функцию на основе ее имени, введите slcoverage.SFcnSelectorType.SFcnName
как первый вход. Второй вход является путем к S-Функции.
sel = slcoverage.SFcnSelector(slcoverage.SFcnSelectorType.SFcnName,... 'slvnvdemo_covfilt/Mode Logic/ SFunction ')
sel = SFcnSelector with properties: FileName: '' FunctionName: '' Expr: '' OutcomeIndex: [] DecOrCondIndex: [] Description: 'N/A' Type: SFcnName Id: 'slvnvdemo_covfilt:6::46' ConstructorCode: 'slcoverage.SFcnSelector(slcoverage.SFcnSelectorType.SFcnName, 'slvnvdemo_covfilt:6::46', )'
В этом примере показано, как создать селектор для S-функции с помощью slcoverage.SFcnSelector
класс.
В этом примере ваша модель имеет S-Функцию с именем RejectDoublePress_sfun
. Внутри S-функции предположим, что условие rtb_AccelResSwOUT
никогда не является ложным, и вы хотите обосновать этот ложный результат в отчете о покрытии.
Загрузите модель.
modelName = 'ex_cc_cruise_control_doublepress_sfun';
load_system(modelName)
Настройте параметры покрытия с помощью Simulink.SimulationInput
объект.
covSet = Simulink.SimulationInput(modelName); covSet = covSet.setModelParameter('CovEnable','on'); covSet = covSet.setModelParameter('CovMetricStructuralLevel','ConditionDecision'); covSet = covSet.setModelParameter('CovSFcnEnable','on'); covSet = covSet.setModelParameter('CovSaveSingleToWorkspaceVar','on'); covSet = covSet.setModelParameter('CovSaveName','covData'); covSet = covSet.setModelParameter('SimAnalyzeCustomCode','on');
Симулируйте модель с помощью covSet
как вход.
simOut = sim(covSet); covData = simOut.covData;
Generating 'RejectDoublePress_sfun.c' ....Please wait ### <a href="matlab:edit('RejectDoublePress_sfun.c')">'RejectDoublePress_sfun.c'</a> created successfully ### <a href="matlab:edit('RejectDoublePress_sfun_wrapper.c')">'RejectDoublePress_sfun_wrapper.c'</a> created successfully ### <a href="matlab:edit('RejectDoublePress_sfun.tlc')">'RejectDoublePress_sfun.tlc'</a> created successfully ### Building S-function 'RejectDoublePress_sfun.c' for ex_cc_cruise_control_doublepress_sfun/RejectDoublePress mex -I/tmp/BR2021ad_1584584_202060/publish_examples1/tpa9509758/ex97019589 -I/ -I/ /tmp/BR2021ad_1584584_202060/publish_examples1/tp0842181f_8da5_484f_99d9_e8cb4a708984/tpa255575d_b8d0_4926_ad99_f61fac298936.c /tmp/BR2021ad_1584584_202060/publish_examples1/tp0842181f_8da5_484f_99d9_e8cb4a708984/tpeea7f5a7_4cca_444e_ba36_e909e7afd743.c -L/mathworks/devel/bat/BR2021ad/build/matlab/bin/glnxa64 -lmwsl_sfcn_cov_bridge -output RejectDoublePress_sfun Building with 'gcc'. MEX completed successfully. mex -I/tmp/BR2021ad_1584584_202060/publish_examples1/tpa9509758/ex97019589 -I/ -I/ /tmp/BR2021ad_1584584_202060/publish_examples1/tp0842181f_8da5_484f_99d9_e8cb4a708984/RejectDoublePress_sfun.c RejectDoublePress_sfun_wrapper.c /tmp/BR2021ad_1584584_202060/publish_examples1/tp0842181f_8da5_484f_99d9_e8cb4a708984/tp84dd1751_46bd_49ab_8f46_6a346f9f6eac.c /tmp/BR2021ad_1584584_202060/publish_examples1/tp0842181f_8da5_484f_99d9_e8cb4a708984/tp3eca71dc_bcdb_4930_a69f_e69b5b888801.c -L/mathworks/devel/bat/BR2021ad/build/matlab/bin/glnxa64 -lmwsl_sfcn_cov_bridge -output RejectDoublePress_sfun Building with 'gcc'. MEX completed successfully.
Создайте объект селектора для недостающего покрытия результатов при помощи slcoverage.SFcnSelector
класс. Чтобы выбрать результат условия внутри S-Функции, используйте SFcnInstanceCppConditionOutcome
перечисление как первый вход. Второй вход является идентификатором блока или путем блока к S-функции. Третий вход - это имя файла источника, который содержит выражение, RejectDoublePress_sfun_wrapper.c
. Четвертый вход является именем функции, которая содержит условие, RejectDoublePress_sfun_Outputs_wrapper
. Пятый вход является выражением, которому принадлежит результат, который rtb_AccelResSwOUT && CoastSetSwIn[0]
, потому что этому родительскому решению принадлежит условие rtb_AccelResSwOUT
.
Шестой вход является индексом выражения, которое владеет результатом относительно его родительского элемента, и потому rtb_AccelResSwOUT
является первым условием в своем родительском решении, этот вход 1
. Седьмым входом является индекс результата, который 1
потому что это F
случай логического выражения. Конечный вход является индексом родительского выражения относительно функции, и потому rtb_AccelResSwOUT && CoastSetSwIn[0]
является вторым решением в функции, этот вход 2
.
enum = slcoverage.SFcnSelectorType.SFcnInstanceCppConditionOutcome; SFunID = Simulink.ID.getSID([modelName, '/RejectDoublePress']); sel = slcoverage.SFcnSelector(enum,SFunID,'RejectDoublePress_sfun_wrapper.c',... 'RejectDoublePress_sfun_Outputs_wrapper','rtb_AccelResSwOUT && CoastSetSwIn[0]',1,1,2);
Создайте Filter
объект и правило на основе селектора, затем добавьте правило к фильтру.
filt = slcoverage.Filter; rule = slcoverage.FilterRule(sel,'Tested elsewhere',... slcoverage.FilterMode.Exclude); addRule(filt,rule); setFilterName(filt,'S-Function Filter')
Сохраните фильтр следующим sfunfilter
и добавить его к объекту cvdata для my_func.c
путем установки filter
свойство имени файла фильтра.
save(filt,'sfunfilter'); covData.filter = 'sfunfilter';
Сгенерируйте отчет о покрытии.
cvhtml('codeCovReport',covData)
Просмотрите отчет. Нажмите на RejectDoublePress_sfun
ссылка в разделе S-Function Покрытие Кода Results, чтобы увидеть отфильтрованный результат в разделе Объекты, отфильтрованные из анализа покрытия.
cv.cvdatagroup
| getSimulinkBlockHandle
| slcoverage.BlockSelector
| slcoverage.Filter
| slcoverage.FilterRule
| slcoverage.MetricSelector
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.