Клоны моделируют шаблоны, которые имеют идентичные типы блока и связи. Можно осуществить рефакторинг модель путем создания библиотечных блоков из клонов подсистемы и заменяющий клоны на ссылки на те библиотечные блоки, которые включают вам к компонентам повторного использования. Для получения дополнительной информации о клонах, смотрите, Включают Повторное использование Компонента при помощи Обнаружения клонов.
Программно проверка клоны во время процесса подачи модели помогает вам идентифицировать возможности снова использовать подсистемы, прежде чем модель будет развернута в ветвь основного продукта. При обновлении модели можно использовать приложение 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
свойства показывают, который моделирует проверяемую функцию.