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