主要内容

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

创建非虚拟模块计数的自定义模型度量

本示例展示了如何使用模型度量 API 创建自定义模型度量,以计算模型中的非虚拟块。创建度量后,您可以收集度量数据、访问结果并导出结果。

创建度量类

要创建自定义模型度量,请使用 slmetric.metric.createNewMetricClass 函数创建一个从基类 slmetric.metric.Metric 派生的新度量类。slmetric.metric.createNewMetricClass 函数创建一个包含构造函数和空度量算法方法的文件。

1.在本例中,请确保您位于可写文件夹中,并创建一个名为 nonvirtualblockcount 的新度量类。

className = 'nonvirtualblockcount';
slmetric.metric.createNewMetricClass(className);

2.确保模型度量存储库中尚未注册名为 nonvirtualblockcount 的自定义 metricID

slmetric.metric.unregisterMetric('nonvirtualblockcount');
slmetric.metric.refresh();

3.将度量算法写入 slmetric.metric.Metric 方法、algorithm 方法中。该算法计算 Advisor.component.Component 类指定的度量数据。Advisor.component.Types 类指定了可以计算度量数据的模型对象的类型。在这个示例中,文件 nonvirtualblockcount_orig.m 包含了创建用于计算非虚拟块数量的度量的逻辑。将此文件复制到 nonvirtualblockcount.m 文件中。

copyfile nonvirtualblockcount_orig.m nonvirtualblockcount.m f

创建自定义度量时,必须设置 slmetric.metric.Metric 类的以下属性:

  • ID:用于检索新度量数据的唯一度量标识符。

  • Name:度量算法的名称。

  • ComponentScope:计算该度量的模型组件。

  • CompileContext:度量计算的编译模式。如果您的模型需要模型编译,请指定 PostCompile。收集已编译模型的度量数据会降低性能。

  • ResultCheckSumCoverage:如果源文件和 Version 没有更改,请指定是否要重新生成度量数据。

  • AggregationMode:度量算法如何聚合度量数据

您还可以选择设置以下附加属性:

  • Description:度量描述。

  • Version:度量版本。

4.现在您的新模型度量已在 nonvirtualblockcount.m 中定义,您可以将新度量注册到度量存储库中。

[id_metric,err_msg] = slmetric.metric.registerMetric(className);

收集度量数据

要收集模型的度量数据,请使用 slmetric.Engine 的实例。使用 getMetrics 方法,指定要收集的度量。在本例中,为 sldemo_mdlref_conversion 模型指定非虚拟模块计数度量。

1.加载 sldemo_mdlref_conversion 模型。

model = 'sldemo_mdlref_conversion';
load_system(model);

2.创建度量引擎对象并设置分析根。

metric_engine = slmetric.Engine();
setAnalysisRoot(metric_engine,'Root',model,'RootType','Model');

3.收集非虚拟模块计数度量的度量数据。

execute(metric_engine,id_metric);
rc = getMetrics(metric_engine,id_metric);

显示和导出结果

要访问模型的度量,请使用 slmetric.metric.Result 的实例。在这个示例中,显示 sldemo_mdlref_conversion 模型的非虚拟模块计数度量。对于每个结果,显示 MetricIDComponentPathValue

for n=1:length(rc)
    if rc(n).Status == 0
        results = rc(n).Results;

        for m=1:length(results)
            disp(['MetricID: ',results(m).MetricID]);
            disp(['  ComponentPath: ', results(m).ComponentPath]);
            disp(['  Value: ', num2str(results(m).Value)]);
            disp(' ');
        end
    else
        disp(['No results for:',rc(n).MetricID]);
    end
    disp(' ');
end
MetricID: nonvirtualblockcount
  ComponentPath: sldemo_mdlref_conversion
  Value: 8
 
MetricID: nonvirtualblockcount
  ComponentPath: sldemo_mdlref_conversion/Bus Counter
  Value: 8
 
 

要将度量结果导出到 XML 文件,请使用 exportMetrics 方法。对于每个度量结果,XML 文件都包括 ComponentIDComponentPathMetricIDValueAggregatedValueMeasure

filename='MyMetricData.xml';
exportMetrics(metric_engine,filename);

在本例中,取消注册非虚拟模块计数度量。

slmetric.metric.unregisterMetric(id_metric);

关闭模型。

bdclose(model);

限制

自定义度量算法不支持组件对象的 path 属性:

  • 链接 Stateflow® 图

  • MATLAB 功能块

自定义度量算法不遵循库链接。

另请参阅

| | | | |

主题