Пакет: 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
Name
— Имя сущности моделиИмя сущности модели, которые заканчиваются количества экземпляра детали. Это свойство является чтением-записью.
Типы данных: char
Value
— Значение 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
. Эта метрика считает количество Data Store Read, и Data Store Write блокирует и собирает в группу их соответствующим Блоком памяти Хранилища данных. 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.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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.