Обнаружение и замена клонов программно

Клоны являются шаблонами моделирования, которые имеют одинаковые типы блоков и связи. Можно рефакторить модель, создав библиотечные блоки из клонов подсистем и заменив клоны ссылками на те библиотечные блоки, которые позволяют вам повторно использовать компоненты. Дополнительные сведения о клонах см. в разделе «Включение повторного использования компонентов при помощи обнаружения клонов».

Программная проверка на клоны в процессе подачи модели помогает вам идентифицировать возможности для повторного использования подсистем перед развертыванием модели в основной ветви продукта. При обновлении модели можно использовать приложение Clone Detector и API детектора клонов одновременно. При использовании API детектора клонов обнаруженные клоны появляются в Редактор.

В этом примере показано, как использовать API обнаружения клонов для идентификации и замены клонов путем создания файла библиотеки с блоками подсистем и замены клонов ссылками на блоки в файле библиотеки.

В этом примере вы узнаете, как использовать:

Идентифицируйте клоны в модели

  1. Откройте модель ex_clone_detection_B. В MATLAB® в командной строке введите:

    addpath(fullfile(docroot,'toolbox','simulink','examples'))
    ex_clone_detection_B

    Сохраните модель в текущей рабочей директории.

  2. Чтобы найти клоны подсистем, используйте функцию 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]
    
  3. Просмотрите Summary поле.

     cloneResults.Clones.Summary
    
    ans = 
      struct with fields:
                     CloneGroups: 2
                   SimilarClones: 5
                     ExactClones: 0
                          Clones: 5
        PotentialReusePercentage: [1×1 struct]
    

    В этом примере модель имеет два CloneGroups с совпадающими шаблонами подсистем, пять SimilarClones, и нуль ExactClonesи пять подсистем Clones.

  4. Просмотрите CloneGroups поле.

     cloneResults.Clones.CloneGroups
    
    ans = 
      1×2 struct array with fields:
        Name
        Summary
        CloneList
    

    Модель в этом примере возвращает массив из двух CloneGroups. Каждый массив включает в себя Name, Summary и CloneList.

  5. Просмотр сведений о первой группе клонов.

     cloneResults.Clones.CloneGroups(1)
    
    ans = 
      struct with fields:
             Name: 'Similar Clone Group 1'
          Summary: [1×1 struct]
        CloneList: {3×1 cell}
    
  6. Просмотрите Summary.

     cloneResults.Clones.CloneGroups(1).Summary
    
    ans = 
      struct with fields:
        ParameterDifferences: [1×1 struct]
                      Clones: 3
              BlocksPerClone: 8
                   CloneType: 'Similar'
             BlockDifference: 1
    
  7. Просмотрите 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 использование вышеописанных шагов.

Замена клонов в модели

  1. Чтобы заменить клоны в модели, используйте функцию Simulink.CloneDetection.replaceClones(). Эта функция использует cloneResults объект из findClones функция.

     cloneReplacementResults = Simulink.CloneDetection.replaceClones(cloneResults)
    
    cloneReplacementResults = 
      ReplacementResults with properties:
        ReplacedClones: [1×5 struct]
        ExcludedClones: {}
    

    The cloneReplacementResults объект включает два свойства, ReplacedClones и ExcludedClones.

  2. Просмотр содержимого ReplacedClones свойство.

    cloneReplacementResults.ReplacedClones
    
    ans = 
      1×5 struct array with fields:
        Name
        ReferenceSubsystem
    

    Массив 1 на 5 указывает, что функция заменила пять клонов подсистем в модели.

  3. Просмотр списка замененных клонов подсистем.

     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'       }
    

Идентифицируйте клоны, используя Ссылку подсистемы Блоков

  1. Сохраните модель и файл библиотеки в текущей рабочей директории.

    ex_clone_detection_E
    libname
  2. Используйте 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: {}
    
  3. Установите ParamDifferenceThreshold параметр. Этот параметр задает количество различий, которые подсистемы должны считаться клонами.

     cloneDetectionSettings.ParamDifferenceThreshold = 0
    
    cloneDetectionSettings = 
      Settings with properties:
                                IgnoreSignalName: 0
                             IgnoreBlockProperty: 0
                          ExcludeModelReferences: 0
                             ExcludeLibraryLinks: 0
                          ExcludeInactiveRegions: 0
                        ParamDifferenceThreshold: 0
        ReplaceExactClonesWithSubsystemReference: 0
                                       Libraries: {}
    

    Значение 0 указывает, что подсистемы должны быть идентичными.

  4. Добавьте файл библиотеки ссылок, который будет использоваться для соответствия шаблонам клонов в 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'}
    
  5. Чтобы найти клоны, выполните функцию 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.

  6. Просмотр сведений о первых CloneGroup.

     cloneResults.Clones.CloneGroups(1)
    
    ans = 
      struct with fields:
             Name: 'libname/SSL1'
          Summary: [1×1 struct]
        CloneList: {3×1 cell}
    

Замените клоны на условия

  1. 1. Чтобы задать условия для replaceClones function, создать указатель используя Simulink.CloneDetection.ReplacementConfig() класс:

     cloneReplacementConfig = Simulink.CloneDetection.ReplacementConfig()
    
    cloneReplacementConfig = 
      ReplacementConfig with properties:
        LibraryNameToAddSubsystemsTo: 'newLibraryFile'
                       IgnoredClones: {}
    
  2. Добавьте подсистемы к IgnoredClones список. В этом примере игнорируйте Subsystem1 чтобы избежать замены его на клон.

    cloneReplacementConfig.addCloneToIgnoreList('ex_clone_detection_E/Subsystem1')
    
    ans = 
      ReplacementConfig with properties:
        LibraryNameToAddSubsystemsTo: 'newLibraryFile'
                       IgnoredClones: {'ex_clone_detection_E/Subsystem1'}
    
  3. Для замены клонов используйте replaceClones функция со cloneResults и cloneReplacementConfig как входные параметры.

    cloneReplacementResults = Simulink.CloneDetection.replaceClones(cloneResults, cloneReplacementConfig)
    
    cloneReplacementResults = 
      ReplacementResults with properties:
        ReplacedClones: [1×4 struct]
        ExcludedClones: [1×1 struct]
    
  4. Просмотрите 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 из библиотеки ссылки заменили клоны подсистем в модели.

  5. Просмотрите 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 свойства показывают, какие модели проверена функция.

Похожие темы