Пакет: 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 - Уникальный идентификаторУникальный идентификатор сущности, который учитывается образцом детали результата. Это свойство - чтение/запись.
Типы данных: 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 метод для mathworks.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 и группирует их вместе соответствующим блоком Data Store Memory. The 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 для метода задано значение true. Метрический алгоритм содержит логику для 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 и установите корень анализа.
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.getAvailableMetrics | slmetric.metric.Result | slmetric.metric.ResultCollection | slmetric.metric.ResultDetail
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.