主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

slcoverage.SFcnSelector 类

命名空间: slcoverage

选择 S-Function 标准作为过滤规则

描述

使用 slcoverage.SFcnSelector 类的对象来指定过滤器规则的 S-Function 选择准则。

slcoverage.SFcnSelector 类是 handle 类。

创建对象

sel = slcoverage.SFcnSelector(type,id) 根据 S-Function 模块 SFcnSelector 创建指定 typeid 对象,并设置 TypeId 属性。

sel = slcoverage.SFcnSelector(type,id,fileName) 根据指定的 C 或 C++ SFcnSelector 创建 fileName 对象,并设置 FileName 属性。

sel = slcoverage.SFcnSelector(type,id,fileName,functionName) 根据指定文件中的指定 C 或 C++ SFcnSelector 创建 functionName 对象并设置 FunctionName 属性。

sel = slcoverage.SFcnSelector(type,id,fileName,functionName,expr,exprIndex) 根据指定的表达式和 SFcnSelector 创建 exprIndex 对象并设置 ExprExprIndex 属性。

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 属性。

属性

全部展开

要选择的 S-Function 类型,指定为 slcoverage.SFcnSelectorType 类的枚举:

  • slcoverage.SFcnSelectorType.SFcnName 选择指定的 S-Function。

  • slcoverage.SFcnSelectorType.SFcnInstanceCppFileName 选择该模块生成的代码文件。将此输入参量与 fileName 参量一起使用。

  • slcoverage.SFcnSelectorType.SFcnInstanceCppFunction 选择 C 或 C++ 函数的实例。将此输入参量与 fileNamefunctionName 参量一起使用。

  • slcoverage.SFcnSelectorType.SFcnInstanceCppCondition 在指定的代码中选择一个条件。将此输入参量与 fileNamefunctionNameexprexprIndex 参量一起使用。

  • slcoverage.SFcnSelectorType.SFcnInstanceCppDecision 在指定的代码中选择一个决策。将此输入参量与 fileNamefunctionNameexprexprIndex 参量一起使用。

  • slcoverage.SFcnSelectorType.SFcnInstanceCppDecisionOutcome 在指定的代码中选择一个决策结果。将此输入参量与 fileNamefunctionNameexprexprIndexoutcomeIndex 参量一起使用。

  • slcoverage.SFcnSelectorType.SFcnInstanceCppConditionOutcome 在指定的代码中选择一个条件结果。将此输入参量与 fileNamefunctionNameexprexprIndexoutcomeIndex 参量一起使用。如果拥有结果的表达式由父决策拥有,则也使用 parentExprIndex 参量。

  • slcoverage.SFcnSelectorType.SFcnInstanceCppMCDCOutcome 在指定的代码中选择 MCDC 结果。将此输入参量与 fileNamefunctionNameexprexprIndexoutcomeIndex 参量一起使用。

  • slcoverage.SFcnSelectorType.SFcnInstanceCppRelationalBoundaryOutcome 在指定的代码中选择关系边界结果。将此输入参量与 fileNamefunctionNameexprexprIndexoutcomeIndex 参量一起使用。如果关系运算符结果由决策内部的条件拥有,则也使用 parentExprIndex 参量。

数据类型: slcoverage.SFcnSelectorType

模型元素标识符,指定为元素的属性名称、元素的句柄或元素的 Simulink 标识符。对选择实例的选择器类型使用句柄或 ID。使用属性名称(例如模块的 'BlockType' 属性的值)来选择多个模型元素。

属性

SetAccess
受保护

数据类型: char | string | handle | integer

要选择的 C 或 C++ 文件,指定为字符数组或字符串数组。

示例: 'myfile.c'

属性:

SetAccess
受保护

数据类型: char | string

要选择的 C 或 C++ 函数,指定为字符数组或字符串数组。

示例: 'counterbusFcn'

属性:

SetAccess
受保护

数据类型: char | string

要选择的表达式,指定为字符数组或字符串数组。

示例: 'inputGElower'

属性:

SetAccess
受保护

数据类型: char | string

表达式索引,指定为整数。如果您正在过滤结果,此属性就是拥有该结果的表达式的索引。如果您正在过滤表达式,则此属性是函数主体内该表达式的索引。

示例: 2

属性:

SetAccess
受保护

数据类型: single | double | int

要选择的结果索引,指定为整数:

  • 对于布尔表达式,输入 1 表示 F 结果,或者输入 2 表示 T 结果。

  • 对于类型 slcoverage.SFcnSelectorType.SFcnInstanceCppMCDCOutcome,请输入表达式内的条件的索引号。

  • 对于 switch/case 语句,第一个 case 输入 1,第二个 case 输入 2,依此类推。

  • 对于关系边界

    • 整数类型:

      • 输入 1 作为类型 -1

      • 输入 2 作为类型 +1

      • 输入 3 作为类型 0

    • 浮点类型:

      • 输入 1 替换 [-tol 0][-tol 0)

      • 输入 2 得到 (0 tol][0 tol] 则结果为 2

    有关关系边界覆盖率的更多信息,请参阅关系边界覆盖率

示例: 2

属性

SetAccess
受保护

数据类型: single | double | int

父表达式索引,指定为整数。使用此输入来过滤父决策或条件所拥有的表达式;这是相对于函数的父决策或条件的索引。

示例: 2

属性

SetAccess
受保护

数据类型: single | double | int

选择器的描述,以字符向量形式返回。Simulink Coverage™ 根据选择器创建描述。

属性:

GetAccess
public
SetAccess
受保护

用于创建此选择器对象的代码,以字符向量形式返回。

属性:

GetAccess
public
SetAccess
受保护

方法

全部展开

示例

全部折叠

此示例展示如何创建 S-Function 选择器。

使用 load_system 加载模型。

load_system('slvnvdemo_covfilt');

使用 slcoverage.SFcnSelector 创建一个 S-Function 选择器。要根据名称选择 S-Function,请输入 slcoverage.SFcnSelectorType.SFcnName 作为第一个输入。第二个输入是 S-Function 的路径。

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/Mode Logic/ SFunction'
    ConstructorCode: 'slcoverage.SFcnSelector(slcoverage.SFcnSelectorType.SFcnName, 'slvnvdemo_covfilt/Mode Logic/ SFunction')'

此示例展示如何使用 slcoverage.SFcnSelector 类为 S-Function 创建选择器。

在此示例中,您的模型有一个名为 RejectDoublePress_sfun 的 S-Function。在 S-Function 中,假设条件 rtb_AccelResSwOUT 永远不会为 false,并且您想要在覆盖率报告中申述这个 false 结果。

加载模型。

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 Command used: slcovmex('-internalfile', 'RejectDoublePress_sfun.c','-R2018a','RejectDoublePress_sfun.c','RejectDoublePress_sfun_wrapper.c','-I/tmp/Bdoc25a_2864802_2299340/tpc2c76115/slcoverage-ex97019589','-DUSE_PUBLISHED_ONLY') :
mex -R2018a -I/tmp/Bdoc25a_2864802_2299340/tpc2c76115/slcoverage-ex97019589 -DUSE_PUBLISHED_ONLY /tmp/Bdoc25a_2864802_2299340/tp554bd594_48a5_42dd_9de2_a8d476ae23b3/tp2221f631_7dfc_41b4_abac_829772dc5e8d.c /tmp/Bdoc25a_2864802_2299340/tp554bd594_48a5_42dd_9de2_a8d476ae23b3/tp414e9051_813b_46cb_88d4_c354cbb4486b.c -L/mathworks/devel/bat/filer/batfs2566-0/Bdoc25a.2864802/build/runnable/matlab/bin/glnxa64 -lmwsl_sfcn_cov_bridge -output RejectDoublePress_sfun
Building with 'gcc'.
MEX completed successfully.
mex -R2018a -I/tmp/Bdoc25a_2864802_2299340/tpc2c76115/slcoverage-ex97019589 -DUSE_PUBLISHED_ONLY /tmp/Bdoc25a_2864802_2299340/tp554bd594_48a5_42dd_9de2_a8d476ae23b3/RejectDoublePress_sfun.c RejectDoublePress_sfun_wrapper.c /tmp/Bdoc25a_2864802_2299340/tp554bd594_48a5_42dd_9de2_a8d476ae23b3/tpcc0762d7_a542_4641_9cf9_4bdb8a9fdc1b.c /tmp/Bdoc25a_2864802_2299340/tp554bd594_48a5_42dd_9de2_a8d476ae23b3/tpa43fee44_69f7_45d2_a8b4_81fd6624b36d.c -L/mathworks/devel/bat/filer/batfs2566-0/Bdoc25a.2864802/build/runnable/matlab/bin/glnxa64 -lmwsl_sfcn_cov_bridge -output RejectDoublePress_sfun
Building with 'gcc'.
MEX completed successfully.

使用 slcoverage.SFcnSelector 类为缺失覆盖率的结果创建选择器对象。要在 S-Function 中选择条件结果,请使用 SFcnInstanceCppConditionOutcome 枚举作为第一个输入。第二个输入是 S-Function 的模块 ID 或模块路径。第三个输入是包含表达式的源文件的文件名,RejectDoublePress_sfun_wrapper.c。第四个输入是包含条件的函数名称,RejectDoublePress_sfun_Outputs_wrapper。第五个输入是拥有结果的表达式,即 rtb_AccelResSwOUT && CoastSetSwIn[0],因为这个父决策拥有条件 rtb_AccelResSwOUT

第六个输入是相对于其父级具有结果的表达式的索引,并且因为 rtb_AccelResSwOUT 是其父级决策中的第一个条件,所以该输入是 1。第七个输入是结果索引,它是 1,因为这是布尔表达式的 F case。最后的输入是父表达式相对于函数的索引,并且因为 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.Justify);
addRule(filt,rule);
setFilterName(filt,'S-Function Filter')

将过滤器保存为 sfunfilter,并通过将 my_func.c 属性设置为过滤器文件名,将其添加到 filter 的 cvdata 对象中。

save(filt,'sfunfilter');
covData.filter = 'sfunfilter';

生成覆盖率报告。

cvhtml('codeCovReport',covData);

审查报告。点击 S-Function 代码覆盖率结果下的 RejectDoublePress_sfun 链接,查看从覆盖率分析过滤的对象下的过滤结果。

版本历史记录

在 R2017b 中推出

全部展开