Пакет: 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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.