Клоны моделируют шаблоны, которые имеют идентичные типы блока и связи. Можно осуществить рефакторинг модель путем создания библиотечных блоков из клонов подсистемы и заменяющий клоны на ссылки на те библиотечные блоки, которые включают вам к компонентам повторного использования. Для получения дополнительной информации о клонах, смотрите, Включают Повторное использование Компонента при помощи Обнаружения клонов.
Программно проверка клоны во время процесса подачи модели помогает вам идентифицировать возможности снова использовать подсистемы, прежде чем модель будет развернута в ветвь основного продукта. При обновлении модели можно использовать приложение Clone Detector и клонировать API детектора одновременно. Когда вы используете API детектора клона, обнаруженные клоны появляются в Редакторе Simulink.
То В этом примере показано, как использовать API обнаружения клонов, чтобы идентифицировать и заменить клоны в одной модели путем создания файла библиотеки с подсистемой, блокируется и заменяющий клоны на ссылки на блоки в файле библиотеки.
В этом примере вы изучаете, как использовать:
Simulink.CloneDetection.findClones, чтобы найти клоны в модели.
Simulink.CloneDetection.replaceClones, чтобы заменить клоны в модели.
Simulink.CloneDetection.checkEquivalency, чтобы проверять эквивалентность обновленной модели с исходной моделью.
Simulink. CloneDetection. Настройки, чтобы добавить условия в findClones операция.
Simulink. CloneDetection. ReplacementConfig, чтобы добавить условия в replaceClones операция.
Откройте модель ex_clone_detection_B. В MATLAB® командная строка, введите:
addpath(fullfile(docroot,'toolbox','simulink','examples')) ex_clone_detection_B
Сохраните модель в текущей рабочей директории.
Чтобы найти клоны подсистемы, используйте функциональный Simulink.CloneDetection.findClones(). Эта функция создает объект под названием cloneResults.
cloneResults = Simulink.CloneDetection.findClones('ex_clone_detection_B')
cloneResults =
Results with properties:
Clones: [1×1 struct]
ExceptionLog: ''cloneResults объект имеет Clones, который является структурой с двумя полями, Summary и CloneGroups, и ExceptionLog.
cloneResults.Clones
ans =
struct with fields:
Summary: [1×1 struct]
CloneGroups: [1×2 struct]
Просмотрите Summary поле .
cloneResults.Clones.Summary
ans =
struct with fields:
CloneGroups: 2
SimilarClones: 5
ExactClones: 0
Clones: 5
PotentialReusePercentage: [1×1 struct]
В этом примере модель имеет два CloneGroups с соответствием с шаблонами подсистемы, пятью SimilarClones, и нулевой ExactClones, и пять подсистем Clones.
Просмотрите CloneGroups поле .
cloneResults.Clones.CloneGroups
ans =
1×2 struct array with fields:
Name
Summary
CloneList
Модель в этом примере возвращает массив двух CloneGroups. Каждый массив включает Nameсводные данные и CloneList.
Посмотрите детали первой группы клонов.
cloneResults.Clones.CloneGroups(1)
ans =
struct with fields:
Name: 'Similar Clone Group 1'
Summary: [1×1 struct]
CloneList: {3×1 cell}
Просмотрите Summary.
cloneResults.Clones.CloneGroups(1).Summary
ans =
struct with fields:
ParameterDifferences: [1×1 struct]
Clones: 3
BlocksPerClone: 8
CloneType: 'Similar'
BlockDifference: 1
Просмотрите CloneList из первого CloneGroup.
cloneResults.Clones.CloneGroups(1).CloneList
ans =
3×1 cell array
{'ex_clone_detection_B/Subsystem1'}
{'ex_clone_detection_B/Subsystem2'}
{'ex_clone_detection_B/Subsystem3'}
Точно так же можно найти результаты другого CloneGroups использование перечисленных выше шагов.
Чтобы заменить клоны в модели, используйте функциональный Simulink.CloneDetection.replaceClones(). Эта функция использует cloneResults объект от findClones функция.
cloneReplacementResults = Simulink.CloneDetection.replaceClones(cloneResults)
cloneReplacementResults =
ReplacementResults with properties:
ReplacedClones: [1×5 struct]
ExcludedClones: {}
cloneReplacementResults объект включает два свойства, ReplacedClones и ExcludedClones.
Просмотрите содержимое ReplacedClones свойство.
cloneReplacementResults.ReplacedClones
ans =
1×5 struct array with fields:
Name
ReferenceSubsystem
Массив 1 на 5 указывает, что функция заменила пять клонов подсистемы в модели.
Просмотрите список замененных клонов подсистемы.
struct2table(cloneReplacementResults.ReplacedClones)
ans =
5×2 table
Name ReferenceSubsystem
___________________________________ _____________________________
{'ex_clone_detection_B/Subsystem1'} {'newLibraryFile/Subsystem1'}
{'ex_clone_detection_B/Subsystem2'} {'newLibraryFile/Subsystem1'}
{'ex_clone_detection_B/Subsystem3'} {'newLibraryFile/Subsystem1'}
{'ex_clone_detection_B/SS3' } {'newLibraryFile/SS1' }
{'ex_clone_detection_B/SS4' } {'newLibraryFile/SS1' }
Сохраните модель и файл библиотеки в текущей рабочей директории.
ex_clone_detection_E libname
Используйте Simulink.CloneDetection.Settings() класс, чтобы создать объект, который задает определенные обстоятельства для нахождения клонов в модели.
cloneDetectionSettings = Simulink.CloneDetection.Settings()
cloneDetectionSettings =
Settings with properties:
IgnoreSignalName: 0
IgnoreBlockProperty: 0
ExcludeModelReferences: 0
ExcludeLibraryLinks: 0
ExcludeInactiveRegions: 0
SelectedSystemBoundary: ''
DetectClonesAcrossModel: 0
FindClonesRecursivelyInFolders: 1
ParamDifferenceThreshold: 50
ReplaceExactClonesWithSubsystemReference: 0
Libraries: {}
Folders: {}Установите ParamDifferenceThreshold параметр. Этот параметр задает количество дифференцирований, что подсистемы, должно быть, придется рассмотреть клонами.
cloneDetectionSettings.ParamDifferenceThreshold = 0
cloneDetectionSettings =
Settings with properties:
IgnoreSignalName: 0
IgnoreBlockProperty: 0
ExcludeModelReferences: 0
ExcludeLibraryLinks: 0
ExcludeInactiveRegions: 0
SelectedSystemBoundary: ''
DetectClonesAcrossModel: 0
FindClonesRecursivelyInFolders: 1
ParamDifferenceThreshold: 0
ReplaceExactClonesWithSubsystemReference: 0
Libraries: {}
Folders: {}Значение 0 указывает, что подсистемы должны быть идентичными.
Добавьте ссылочный файл библиотеки, чтобы использовать, чтобы совпадать с шаблонами клона в cloneDetectionSettings объект. В этом примере, SSL1 и SSL2 шаблоны подсистемы в библиотеке libName.
cloneDetectionSettings = cloneDetectionSettings.addLibraries('libname')
cloneDetectionSettings =
Settings with properties:
IgnoreSignalName: 1
IgnoreBlockProperty: 0
ExcludeModelReferences: 0
ExcludeLibraryLinks: 0
ExcludeInactiveRegions: 0
SelectedSystemBoundary: ''
DetectClonesAcrossModel: 0
FindClonesRecursivelyInFolders: 1
ParamDifferenceThreshold: 50
ReplaceExactClonesWithSubsystemReference: 0
Libraries: {'C:\Users\Examples\libname.slx'}
Folders: {}Чтобы найти клоны, выполните функциональный Simulink.CloneDetection.findClones() использование имени модели и cloneDetectionSettings объект.
cloneResults = Simulink.CloneDetection.findClones('ex_clone_detection_E', cloneDetectionSettings)
cloneResults =
Results with properties:
Clones: [1×1 struct]
cloneResults.Clones.Summary
ans =
struct with fields:
CloneGroups: 2
SimilarClones: 5
ExactClones: 0
Clones: 5
PotentialReusePercentage: [1×1 struct]
В этом примере модель имеет два CloneGroups, пять SimilarClones, нулевой ExactClones, и пять подсистем Clones.
Посмотрите детали первого CloneGroup.
cloneResults.Clones.CloneGroups(1)
ans =
struct with fields:
Name: 'libname/SSL1'
Summary: [1×1 struct]
CloneList: {3×1 cell}
1. Задавать условия для replaceClones функционируйте, создайте указатель с помощью Simulink.CloneDetection.ReplacementConfig() класс:
cloneReplacementConfig = Simulink.CloneDetection.ReplacementConfig()
cloneReplacementConfig =
ReplacementConfig with properties:
LibraryNameToAddSubsystemsTo: 'newLibraryFile'
IgnoredClones: {}
Добавьте подсистемы в IgnoredClones список. В этом примере проигнорируйте Subsystem1 постараться не заменять его на клон.
cloneReplacementConfig.addCloneToIgnoreList('ex_clone_detection_E/Subsystem1')
ans =
ReplacementConfig with properties:
LibraryNameToAddSubsystemsTo: 'newLibraryFile'
IgnoredClones: {'ex_clone_detection_E/Subsystem1'}
Чтобы заменить клоны, используйте replaceClones функция с cloneResults и cloneReplacementConfig как входные параметры.
cloneReplacementResults = Simulink.CloneDetection.replaceClones(cloneResults, cloneReplacementConfig)
cloneReplacementResults =
ReplacementResults with properties:
ReplacedClones: [1×4 struct]
ExcludedClones: [1×1 struct]
Просмотрите ReplacedClones свойство.
struct2table(cloneReplacementResults.ReplacedClones)
ans =
4×2 table
Name ReferenceSubsystem
___________________________________ __________________
{'ex_clone_detection_E/SS3' } {'libname/SSL1'}
{'ex_clone_detection_E/SS4' } {'libname/SSL1'}
{'ex_clone_detection_E/Subsystem1'} {'libname/SSL2'}
{'ex_clone_detection_E/Subsystem2'} {'libname/SSL2'}
SSL1 и SSL2 Ссылочные блоки Subsystem от ссылочной библиотеки заменили клоны подсистемы в модели.
Просмотрите ExcludedClones свойство.
struct2table(cloneReplacementResults.ExcludedClones)
ans =
1×2 table
Name ReferenceSubsystem
___________________________________ __________________
{'ex_clone_detection_E/Subsystem1'} {'unselected'}
Можно проверять, эквивалентна ли обновленная модель с исходной моделью при помощи Simulink.CloneDetection.checkEquivalency() функция. Эта функция использует менеджера по Simulink Test, чтобы сравнить результаты симуляции сохраненной исходной модели с обновленной моделью и сохраняет результаты в checkEquiResults указатель.
checkEquiResults = Simulink.CloneDetection.checkEquivalency(cloneReplacementResults)
[21-Dec-2020 16:35:13] Running simulations...
[21-Dec-2020 16:35:32] Completed 1 of 2 simulation runs
[21-Dec-2020 16:35:33] Completed 2 of 2 simulation runs
checkEquiResults =
EquivalencyCheckResults with properties:
List: [1×1 struct]
Просмотрите результаты эквивалентности проверки.
checkEquiResults.List
ans =
struct with fields:
IsEquivalencyCheckPassed: 1
OriginalModel: 'm2m_ex_clone_detection_E/snapshot_2020_12_21_16_35_06_ex_clone_detection_E.slx'
UpdatedModel: 'ex_clone_detection_E.slx'
Свойство IsEquivalencyCheckPassed 1, который предполагает, что модели эквивалентны. OriginalModel и UpdatedModel свойства показывают, который моделирует проверяемую функцию.