Клоны являются шаблонами моделирования, которые имеют одинаковые типы блоков и связи. Можно рефакторить модель, создав библиотечные блоки из клонов подсистем и заменив клоны ссылками на те библиотечные блоки, которые позволяют вам повторно использовать компоненты. Дополнительные сведения о клонах см. в разделе «Включение повторного использования компонентов при помощи обнаружения клонов».
Программная проверка на клоны в процессе подачи модели помогает вам идентифицировать возможности для повторного использования подсистем перед развертыванием модели в основной ветви продукта. При обновлении модели можно использовать приложение Clone Detector и API детектора клонов одновременно. При использовании API детектора клонов обнаруженные клоны появляются в Редактор.
В этом примере показано, как использовать API обнаружения клонов для идентификации и замены клонов путем создания файла библиотеки с блоками подсистем и замены клонов ссылками на блоки в файле библиотеки.
В этом примере вы узнаете, как использовать:
Simulink.CloneDetection.findClones для поиска клонов в модели.
Simulink.CloneDetection.replaceClones для замены клонов в модели.
Simulink.CloneDetection.checkEquivalency, чтобы проверить эквивалентность обновленной модели с исходной моделью.
Simulink.CloneDetection.Settings для добавления условий к 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]
The 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: {}
The 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
function, создать указатель используя 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'}
The SSL1
и SSL2
Ссылки Блоков Subsystem из библиотеки ссылки заменили клоны подсистем в модели.
Просмотрите 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, что предполагает, что модели эквивалентны. The OriginalModel
и UpdatedModel
свойства показывают, какие модели проверена функция.