Пакет: slmetric.metric
Суперклассы:
Детали об экземплярах объектов slmetric.metric.Result
Детали о том, что метрический механизм значит свойство объекта slmetric.metric.Result
Value
.
Вызов метода slmetric.Engine.execute
создает объекты slmetric.metric.Result
, который опционально включает объекты slmetric.metric.ResultDetail
. Details1 = slmetric.metric.ResultDetail = (ID, Name)
создает объект slmetric.metric.ResultDetail
. Необходимо предоставить ID и Имя как входные параметры конструктору.
ID
— Уникальный идентификаторУникальный идентификатор для сущности, которую считает экземпляр детали результата. Это свойство является чтением-записью.
Типы данных: char
Имя
Имя образцовой сущностиИмя образцовой сущности, которые заканчиваются количества экземпляра детали. Это свойство является чтением-записью.
Типы данных: char
Значение
Значение свойства ID
Скалярное значение сгенерировано метрическим алгоритмом для ID
. Это свойство является чтением-записью.
Типы данных: double
getGroupIdentifier | Получите идентификатор для группы объектов slmetric.metric.ResultDetail |
getGroupName | Получите имя для группы объектов slmetric.metric.ResultDetail |
setGroup | Определите имя и идентификатор для группы объектов slmetric.metric.ResultDetail |
Используйте getGroupName
и методы getGroupIdentfier
, чтобы получить имя и идентификатор для группы клонов.
Откройте модель в качестве примера.
open_system([docroot '\toolbox\simulink\examples\ex_clone_detection.slx']);
Сохраните модель в качестве примера в свою текущую рабочую папку.
Вызовите метод execute
. Примените метод getMetrics
для themathworks.metric.CloneDetection
метрики.
metric_engine = slmetric.Engine(); setAnalysisRoot(metric_engine,'Root','ex_clone_detection','RootType','Model'); execute(metric_engine); rc = getMetrics(metric_engine,'mathworks.metrics.CloneDetection');
Для каждого объекта slmetric.metric.Result
отобразите ComponentPath
. Для каждого объекта slmetric.metric.ResultDetail
отобразите имя группы клонов и идентификатор.
for n=1:length(rc.Results) if rc.Results(n).Value > 0 for m=1:length(rc.Results(n).Details) disp(['ComponentPath: ',rc.Results(n).ComponentPath]); disp(['Group Name: ',rc.Results(n).Details(m).getGroupName]); disp(['Group Identifier: ',rc.Results(n).Details(m).getGroupIdentifier]); end else disp(['No results for ComponentPath: ',rc.Results(n).ComponentPath]); end disp(' '); end
Результаты показывают, что модель содержит одну группу клонов, CloneGroup1
, который содержит два клона.
Используйте метод setGroup
, чтобы сгруппировать подробные результаты. Когда вы создаете пользовательскую образцовую метрику, вы применяете этот метод как часть метода algorithm
.
Используя функцию createNewMetricClass
, создайте метрический класс под названием DataStoreCount
. Эта метрика рассчитывает, количество Записи Чтения и Хранилища данных Хранилища данных блокирует и собирает в группу их соответствующим Блоком памяти Хранилища данных. Функция createNewMetricClass
создает файл, DataStoreCount.m
в текущей рабочей папке. Файл содержит конструктора и пустой метрический метод алгоритма. В данном примере убедитесь, что вы работаете в перезаписываемой папке.
className = 'DataStoreCount';
slmetric.metric.createNewMetricClass(className);
Чтобы написать метрический алгоритм, откройте файл DataStoreCount.m
и добавьте метрику в файл. В данном примере можно создать метрический алгоритм путем копирования этой логики в файл DataStoreCount.m
.
classdef DataStoreCount < slmetric.metric.Metric % Count the number of Data Store Read and Data Store Write % blocks and correlate them across components. methods function this = DataStoreCount() this.ID = 'DataStoreCount'; this.ComponentScope = [Advisor.component.Types.Model, ... Advisor.component.Types.SubSystem]; this.AggregationMode = slmetric.AggregationMode.Sum; this.AggregateComponentDetails = true; this.CompileContext = 'None'; this.Version = 1; this.SupportsResultDetails = true; %Textual information on the metric algorithm this.Name = 'Data store usage'; this.Description = 'Metric that counts the number of Data Store Read and Write'; 'blocks and groups them by the corresponding Data Store Memory block.'; end function res = algorithm(this, component) % Use find_system to get all blocks inside this component. dswBlocks = find_system(getPath(component), ... 'SearchDepth', 1, ... 'BlockType', 'DataStoreWrite'); dsrBlocks = find_system(getPath(component), ... 'SearchDepth', 1, ... 'BlockType', 'DataStoreRead'); % Create a ResultDetail object for each data store read and write block. % Group ResultDetails by the data store name. details1 = slmetric.metric.ResultDetail.empty(); for i=1:length(dswBlocks) details1(i) = slmetric.metric.ResultDetail(getfullname(dswBlocks{i}),... get_param(dswBlocks{i}, 'Name')); groupID = get_param(dswBlocks{i},'DataStoreName'); groupName = get_param(dswBlocks{i},'DataStoreName'); details1(i).setGroup(groupID, groupName); details1(i).Value = 1; end details2 = slmetric.metric.ResultDetail.empty(); for i=1:length(dsrBlocks) details2(i) = slmetric.metric.ResultDetail(getfullname(dsrBlocks{i}),... get_param(dsrBlocks{i}, 'Name')); groupID = get_param(dsrBlocks{i},'DataStoreName'); groupName = get_param(dsrBlocks{i},'DataStoreName'); details2(i).setGroup(groupID, groupName); details2(i).Value = 1; end res = slmetric.metric.Result(); res.ComponentID = component.ID; res.MetricID = this.ID; res.Value = length(dswBlocks)+ length(dsrBlocks); res.Details = [details1 details2]; end end end
В метрическом классе DataStoreCount
метод SupportsResultDetail
установлен в истину. Метрический алгоритм содержит логику для метода setGroup
.
Теперь, когда ваша новая образцовая метрика задана в DataStoreCount.m
, укажите новую метрику.
[id_metric,err_msg] = slmetric.metric.registerMetric(className);
Чтобы собрать метрические данные по моделям, используйте экземпляры slmetric.Engine
. Используя метод getMetrics
, задайте метрику, которую вы хотите собрать. В данном примере укажите, что хранилище данных считает метрику для модели sldemo_mdlref_dsm
.
Загрузите модель sldemo_mdlref_dsm
.
model = 'sldemo_mdlref_dsm'; load_system(model);
Создайте метрический объект механизма и установите аналитический корень.
metric_engine = slmetric.Engine(); setAnalysisRoot(metric_engine,'Root',model,'RootType','Model');
Соберите метрические данные для метрики количества Хранилища данных.
execute(metric_engine); rc=getMetrics(metric_engine, id_metric);
Для каждого объекта slmetric.metric.Result
отобразите ComponentPath
. Для каждого объекта slmetric.metric.ResultDetails
отобразите название группы Хранилища данных и идентификатор.
for n=1:length(rc.Results) if rc.Results(n).Value > 0 for m=1:length(rc.Results(n).Details) disp(['ComponentPath: ',rc.Results(n).ComponentPath]); disp(['Group Name: ',rc.Results(n).Details(m).getGroupName]); disp(['Group Identifier: ',rc.Results(n).Details(m).getGroupIdentifier]); end else disp(['No results for ComponentPath: ',rc.Results(n).ComponentPath]); end disp(' '); end
Вот результаты.
ComponentPath: sldemo_mdlref_dsm Group Name: ErrorCond Group Identifier: ErrorCond No results for ComponentPath: sldemo_mdlref_dsm/A No results for ComponentPath: sldemo_mdlref_dsm/A1 No results for ComponentPath: sldemo_mdlref_dsm/More Info1 ComponentPath: sldemo_mdlref_dsm_bot Group Name: RefSignalVal Group Identifier: RefSignalVal ComponentPath: sldemo_mdlref_dsm_bot2 Group Name: ErrorCond Group Identifier: ErrorCond ComponentPath: sldemo_mdlref_dsm_bot/PositiveSS Group Name: RefSignalVal Group Identifier: RefSignalVal ComponentPath: sldemo_mdlref_dsm_bot/NegativeSS Group Name: RefSignalVal Group Identifier: RefSignalVal
В данном примере не укажите метрику количества хранилища данных.
slmetric.metric.unregisterMetric(id_metric);
Закройте модель.
clear; bdclose('all');
slmetric.metric.Result
| slmetric.metric.ResultCollection
| slmetric.metric.ResultDetail
| slmetric.metric.getAvailableMetrics
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.