Клоны - это шаблоны моделирования, имеющие идентичные типы блоков и соединения. Модель можно изменить путем создания блоков библиотеки из клонов подсистем и замены клонов ссылками на эти блоки библиотеки, что позволяет повторно использовать компоненты. Дополнительные сведения о клонах см. в разделе Включение повторного использования компонентов с помощью функции обнаружения клонов.
Программная проверка клонов во время процесса отправки модели помогает определить возможности повторного использования подсистем до развертывания модели в основной ветви продукта. При обновлении модели можно одновременно использовать приложение Clone Detector и API clone detector. При использовании API детектора клонов обнаруженные клоны отображаются в редакторе Simulink Editor.
В этом примере показано, как использовать API обнаружения клонов для идентификации и замены клонов путем создания файла библиотеки с блоками подсистемы и замены клонов ссылками на блоки в файле библиотеки.
В этом примере показано, как использовать:
Simulink.CloneDetection.findClones для поиска клонов в модели.
Simulink.CloneDetection.reyClones для замены клонов в модели.
Simulink.CloneDetection.checkEquivalency для проверки эквивалентности обновленной модели исходной модели.
Simulink.CloneDetection.Settings для добавления условий в findClones операция.
Simulink.CloneDetection.ReplacureConfig для добавления условий в 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]
cloneResults объект имеет одно свойство, Clones, которая представляет собой структуру с двумя полями, Summary и CloneGroups.
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, Summary и 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
ParamDifferenceThreshold: 50
ReplaceExactClonesWithSubsystemReference: 0
Libraries: {}
Установите ParamDifferenceThreshold параметр. Этот параметр определяет количество различий, которые подсистемы должны считаться клонами.
cloneDetectionSettings.ParamDifferenceThreshold = 0
cloneDetectionSettings =
Settings with properties:
IgnoreSignalName: 0
IgnoreBlockProperty: 0
ExcludeModelReferences: 0
ExcludeLibraryLinks: 0
ExcludeInactiveRegions: 0
ParamDifferenceThreshold: 0
ReplaceExactClonesWithSubsystemReference: 0
Libraries: {}
Значение 0 указывает, что подсистемы должны быть идентичными.
Добавление файла библиотеки ссылок для сопоставления с образцами клонов в cloneDetectionSettings объект. В этом примере: SSL1 и SSL2 - шаблоны подсистем в библиотеке libName.
cloneDetectionSettings = cloneDetectionSettings.addLibraries('libname')
cloneDetectionSettings =
Settings with properties:
IgnoreSignalName: 0
IgnoreBlockProperty: 0
ExcludeModelReferences: 0
ExcludeLibraryLinks: 0
ExcludeInactiveRegions: 0
ParamDifferenceThreshold: 0
ReplaceExactClonesWithSubsystemReference: 0
Libraries: {'C:\Users\Examples\libname.slx'}
Для поиска клонов выполните функцию 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 Блоки подсистемы привязки из библиотеки ссылок заменили клоны подсистемы в модели.
Просмотр ExcludedClones собственность.
struct2table(cloneReplacementResults.ExcludedClones)
ans =
1×2 table
Name ReferenceSubsystem
___________________________________ __________________
{'ex_clone_detection_E/Subsystem1'} {'unselected'}
Можно проверить, эквивалентна ли обновленная модель исходной, используя Simulink.CloneDetection.checkEquivalency() функция. Эта функция использует Simulink Test Manager для сравнения результатов моделирования сохраненной исходной модели с обновленной моделью и сохраняет результаты в 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 В свойствах отображаются модели проверенной функции.