В этом примере показано, как использовать метрический API модели, чтобы создать пользовательскую метрику модели для подсчета невиртуальных блоков в модели. После создания метрики можно собрать данные для метрики, получить доступ к результатам и экспортировать результаты.
Чтобы создать пользовательскую метрику модели, используйте slmetric.metric.createNewMetricClass
функция, чтобы создать новый метрический класс вывела из базового класса slmetric.metric.Metric
. Функция slmetric.metric.createNewMetricClass создает файл, который содержит конструктора и пустой метрический метод алгоритма.
1. В данном примере убедитесь, что вы находитесь в writeable папке и создаете новый метрический класс под названием nonvirtualblockcount
.
className = 'nonvirtualblockcount';
slmetric.metric.createNewMetricClass(className);
2. Напишите метрический алгоритм в 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
: Метрическая версия.
3. Теперь, когда ваша новая метрика модели задана в nonvirtualblockcount.m, можно указать новую метрику в метрическом репозитории.
[id_metric,err_msg] = slmetric.metric.registerMetric(className);
Чтобы собрать метрические данные по моделям, используйте экземпляры slmetric.Engine
. Используя getMetrics
метод, задайте метрики, которые вы хотите собрать. В данном примере укажите, что невиртуальный блок считает метрику для sldemo_mdlref_bus
модель.
1. Загрузите sldemo_mdlref_bus модель.
model = 'sldemo_mdlref_bus';
load_system(model);
2. Создайте метрический объект механизма и установите аналитический корень.
metric_engine = slmetric.Engine(); setAnalysisRoot(metric_engine,'Root',model,'RootType','Model');
3. Соберите метрические данные для невиртуальной метрики количества блока.
execute(metric_engine); rc = getMetrics(metric_engine,id_metric);
Чтобы получить доступ к метрикам для вашей модели, используйте экземпляр slmetric.metric.Result
. В этом примере отобразите невиртуальные метрики количества блока для sldemo_mdlref_bus модели. Для каждого результата отобразите MetricID, ComponentPath и Значение.
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_bus Value: 13 MetricID: nonvirtualblockcount ComponentPath: sldemo_mdlref_bus/More Info3 Value: 0 MetricID: nonvirtualblockcount ComponentPath: sldemo_mdlref_bus/More Info4 Value: 0 MetricID: nonvirtualblockcount ComponentPath: sldemo_mdlref_bus/More Info1 Value: 0 MetricID: nonvirtualblockcount ComponentPath: sldemo_mdlref_bus/More Info2 Value: 0 MetricID: nonvirtualblockcount ComponentPath: sldemo_mdlref_counter_bus Value: 2 MetricID: nonvirtualblockcount ComponentPath: sldemo_mdlref_counter_bus/COUNTER Value: 6 MetricID: nonvirtualblockcount ComponentPath: sldemo_mdlref_counter_bus/COUNTER/Counter Value: 3 MetricID: nonvirtualblockcount ComponentPath: sldemo_mdlref_counter_bus/COUNTER/Counter/ResetCheck Value: 4 MetricID: nonvirtualblockcount ComponentPath: sldemo_mdlref_counter_bus/COUNTER/Counter/ResetCheck/NoReset Value: 2 MetricID: nonvirtualblockcount ComponentPath: sldemo_mdlref_counter_bus/COUNTER/Counter/ResetCheck/Reset Value: 3 MetricID: nonvirtualblockcount ComponentPath: sldemo_mdlref_counter_bus/COUNTER/Counter/SaturationCheck Value: 5 MetricID: nonvirtualblockcount ComponentPath: sldemo_mdlref_counter_bus/COUNTER/LimitsProcess Value: 1 MetricID: nonvirtualblockcount ComponentPath: sldemo_mdlref_counter_bus/More Info1 Value: 0 MetricID: nonvirtualblockcount ComponentPath: sldemo_mdlref_counter_bus/More Info2 Value: 0
Чтобы экспортировать метрические результаты в XML-файл, используйте exportMetrics метод. Для каждого метрического результата XML-файл включает ComponentID
, ComponentPath
, MetricID
Значение
, AggregatedValue
, и Measure
.
filename='MyMetricData.xml';
exportMetrics(metric_engine,filename);
В данном примере не укажите невиртуальную метрику количества блока.
slmetric.metric.unregisterMetric(id_metric);
Закройте модель.
clear;
bdclose('all');
Пользовательские метрические алгоритмы не поддерживают свойство path на объектах компонента:
Соединенные диаграммы Stateflow
Блоки MATLAB function
Пользовательские метрические алгоритмы не переходят по ссылкам библиотеки.
Copyright 2019 The MathWorks, Inc.
Advisor.component.Component
| Advisor.component.Types
| slmetric.Engine
| slmetric.metric.createNewMetricClass
| slmetric.metric.Metric
| slmetric.metric.Result