创建非虚拟模块计数的自定义模型度量
本示例展示了如何使用模型度量 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 模型的非虚拟模块计数度量。对于每个结果,显示 MetricID、ComponentPath 和 Value。
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 文件都包括 ComponentID、ComponentPath、MetricID、Value、AggregatedValue 和 Measure。
filename='MyMetricData.xml';
exportMetrics(metric_engine,filename);在本例中,取消注册非虚拟模块计数度量。
slmetric.metric.unregisterMetric(id_metric);
关闭模型。
bdclose(model);
限制
自定义度量算法不支持组件对象的 path 属性:
链接 Stateflow® 图
MATLAB 功能块
自定义度量算法不遵循库链接。
另请参阅
Advisor.component.Component | Advisor.component.Types | slmetric.Engine | slmetric.metric.Metric | slmetric.metric.createNewMetricClass | slmetric.metric.Result