プログラムによるサブシステム クローンの検出と置換
クローンは、同一のブロック タイプと接続をもつモデル化パターンです。サブシステム クローンからライブラリ ブロックを作成し、クローンをそれらのライブラリ ブロックへのリンクに置き換えることによりモデルをリファクタリングでき、コンポーネントの再利用が可能になります。クローンの詳細については、クローン検出を使用したコンポーネント再利用の有効化を参照してください。
モデルの送信プロセス中にプログラムでクローンをチェックすると、モデルが製品のメイン ブランチに展開される前に、サブシステムを再利用する方法を特定できます。モデルの更新時には、クローン検出器アプリとクローン検出 API を同時に使用できます。クローン検出 API を使用する場合、検出されたクローンは Simulink® エディターに表示されます。
この例では、クローン検出 API を使用し、サブシステム ブロックを含むライブラリ ファイルを作成して、クローンをそのライブラリ ファイル内のブロックへのリンクに置換することにより、単一モデル内のクローンを特定して置換する方法を説明します。
この例では、以下を使用する方法を学習します。
Simulink.CloneDetection.findClones。モデル内のクローンを検出する。
Simulink.CloneDetection.replaceClones。モデル内のクローンを置換する。
Simulink.CloneDetection.checkEquivalency。更新されたモデルと元のモデルの同一性をチェックする。
Simulink.CloneDetection.Settings。
findClonesの動作に条件を追加する。Simulink.CloneDetection.ReplacementConfig。
replaceClonesの動作に条件を追加する。
プログラムによるモデル内のクローンの特定
モデル
ex_detect_clones_Bを開きます。openExample('ex_detect_clones_B');モデルを現在の作業ディレクトリに保存します。
サブシステム クローンを検出するには、関数
Simulink.CloneDetection.findClones()を使用します。この関数はcloneResultsというオブジェクトを作成します。cloneResults = Simulink.CloneDetection.findClones('ex_detect_clones_B')cloneResults = Results with properties: Clones: [1×1 struct] ExceptionLog: ''cloneResultsオブジェクトにはClonesがあります。これは、SummaryとCloneGroupsの 2 つのフィールドをもつ構造体です。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が 2 個、およびSimilarClonesが 5 個、ExactClonesが 0 個、サブシステムClonesが 5 個あります。CloneGroupsフィールドを表示します。cloneResults.Clones.CloneGroups
ans = 1×2 struct array with fields: Name Summary CloneListこの例のモデルは 2 つの
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最初の CloneGroup の
CloneListを表示します。cloneResults.Clones.CloneGroups(1).CloneList
ans = 3×1 cell array {'ex_detect_clones_B/Subsystem1'} {'ex_detect_clones_B/Subsystem2'} {'ex_detect_clones_B/Subsystem3'}同様に、上記の手順を使用して他の
CloneGroupsの結果を確認できます。
プログラムによるモデル内のクローンの置換
モデル内のクローンを置換するには、関数
Simulink.CloneDetection.replaceClones()を使用します。この関数は、関数findClonesからのcloneResultsオブジェクトを使用します。cloneReplacementResults = Simulink.CloneDetection.replaceClones(cloneResults)
cloneReplacementResults = ReplacementResults with properties: ReplacedClones: [1×5 struct] ExcludedClones: {}cloneReplacementResultsオブジェクトには 2 つのプロパティReplacedClonesとExcludedClonesが含まれます。ReplacedClonesプロパティの内容を表示します。cloneReplacementResults.ReplacedClones
ans = 1×5 struct array with fields: Name ReferenceSubsystem1 行 5 列の配列は、関数がモデル内の 5 つのサブシステム クローンを置換したことを示しています。
置換されたサブシステム クローンのリストを表示します。
struct2table(cloneReplacementResults.ReplacedClones)
ans = 5×2 table Name ReferenceSubsystem ___________________________________ _____________________________ {'ex_detect_clones_B/Subsystem1'} {'newLibraryFile/Subsystem1'} {'ex_detect_clones_B/Subsystem2'} {'newLibraryFile/Subsystem1'} {'ex_detect_clones_B/Subsystem3'} {'newLibraryFile/Subsystem1'} {'ex_detect_clones_B/SS3' } {'newLibraryFile/SS1' } {'ex_detect_clones_B/SS4' } {'newLibraryFile/SS1' }
ライブラリ参照ブロックを使用したクローンの特定
モデルとライブラリ ファイルを現在の作業ディレクトリに保存します。
ex_detect_clones_E clones_library
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: {}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 の値は、サブシステムが同一でなければならないことを示します。
cloneDetectionSettingsオブジェクトのクローン パターンとの照合に使用する参照ライブラリ ファイルを追加します。この例では、SSL1とSSL2がライブラリclones_libraryのサブシステム パターンです。cloneDetectionSettings = cloneDetectionSettings.addLibraries('clones_library')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\clones_library.slx'} Folders: {}クローンを検出するには、モデル名と
cloneDetectionSettingsオブジェクトを使用して関数Simulink.CloneDetection.findClones()を実行します。cloneResults = Simulink.CloneDetection.findClones('ex_detect_clones_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が 2 個、SimilarClonesが 5 個、ExactClonesが 0 個、サブシステムClonesが 5 個あります。最初の
CloneGroupの詳細を表示します。cloneResults.Clones.CloneGroups(1)
ans = struct with fields: Name: 'clones_library/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_detect_clones_E/Subsystem1')ans = ReplacementConfig with properties: LibraryNameToAddSubsystemsTo: 'newLibraryFile' IgnoredClones: {'ex_detect_clones_E/Subsystem1'}クローンを置換するには、
cloneResultsおよびcloneReplacementConfigを入力引数として関数replaceClonesを使用します。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_detect_clones_E/SS3' } {'clones_library/SSL1'} {'ex_detect_clones_E/SS4' } {'clones_library/SSL1'} {'ex_detect_clones_E/Subsystem1'} {'clones_library/SSL2'} {'ex_detect_clones_E/Subsystem2'} {'clones_library/SSL2'}モデル内のサブシステム クローンが参照ライブラリの
SSL1およびSSL2Reference Subsystem ブロックに置換されました。ExcludedClonesプロパティを表示します。struct2table(cloneReplacementResults.ExcludedClones)
ans = 1×2 table Name ReferenceSubsystem ___________________________________ __________________ {'ex_detect_clones_E/Subsystem1'} {'unselected'}
モデルの同一性のチェック
関数 Simulink.CloneDetection.checkEquivalency() を使用すると、更新されたモデルが元のモデルと等価であるかどうかを確認できます。この関数は、Simulink テスト マネージャーを使用し、保存されている元のモデルと更新されたモデルのシミュレーション結果を比較して、結果を 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_detect_clones_E/snapshot_2020_12_21_16_35_06_ex_detect_clones_E.slx'
UpdatedModel: 'ex_detect_clones_E.slx'
プロパティ IsEquivalencyCheckPassed は 1 であり、モデルが等価であることを示しています。OriginalModel プロパティと UpdatedModel プロパティは、関数がどのモデルをチェックしたかを示しています。