Обнаружьте и замените клоны подсистемы программно

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

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

То В этом примере показано, как использовать 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]
      ExceptionLog: ''

    cloneResults объект имеет Clones, который является структурой с двумя полями, Summary и CloneGroups, и ExceptionLog.

     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сводные данные и 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: {}
    

    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
                          SelectedSystemBoundary: ''
                         DetectClonesAcrossModel: 0
                  FindClonesRecursivelyInFolders: 1
                        ParamDifferenceThreshold: 50
        ReplaceExactClonesWithSubsystemReference: 0
                                       Libraries: {}
                                         Folders: {}
  3. Установите 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 указывает, что подсистемы должны быть идентичными.

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

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

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте