アーキテクチャ モデルで問題を修正するカスタム編集時チェックの定義
この例では、System Composer™ を使用して作成したアーキテクチャ モデルで実行されるカスタム編集時チェックの作成方法を説明します。編集時チェックにより、モデルの設計レビュー プロセスで早期に問題を検出できます。この例のカスタム編集時チェックでは、接続しているブロック端子のインターフェイス名が一致しないと警告が生成されます。カスタム チェックの作成プロセスの詳細については、カスタム モデル アドバイザー チェックの定義を参照してください。
単純なアーキテクチャ モデルの作成
コネクタを共有する端子間でデータ インターフェイス名が一致しない単純なアーキテクチャ モデルを作成します。
一時作業ディレクトリを作成します。
MATLAB の [ホーム] タブで、[Simulink] をクリックします。
Simulink のスタート ページで、[System Composer] をクリックして [アーキテクチャ モデル] を選択します。
3 つの Component ブロックを追加します。
次の図に示すように、1 つの Component ブロックの出力端子を他の 2 つの Component ブロックの入力端子に接続します。
[モデル化] タブで、[インターフェイス エディター] をクリックします。
interface0
およびinterface1
という名前で 2 つのデータ インターフェイスを作成します。プロパティ インスペクターを開きます。
Component
に対して、OutBus
端子をクリックします。プロパティ インスペクターの [インターフェイス] セクションで、[名前] フィールドに対して[interface0]
を選択します。Component1
に対して、InBus
端子をクリックします。プロパティ インスペクターの [インターフェイス] セクションで、[名前] フィールドに対して[interface1]
を選択します。Component2
に対して、InBus
端子をクリックします。プロパティ インスペクターの [インターフェイス] セクションで、[名前] フィールドに対して[interface0]
を選択します。モデルを作業ディレクトリに保存します。この例では、モデル名は
myModel.slx
です。
カスタム編集時チェックの作成
ユーザーがモデルを編集する際に同じコネクタを共有する端子間で一致しないデータ インターフェイス名を検出するチェックを作成します。
カスタム編集時チェックを登録するには、関数
sl_customization
を作成します。関数sl_customization
では、1 つの引数 (カスタマイズ マネージャー オブジェクト) を受け入れます。カスタム チェックを登録するには、addModelAdvisorCheckFcn
メソッドを使用します。このメソッドへの入力は、チェック定義関数へのハンドルです。この例では、defineCheck
がチェック定義関数です。関数sl_customization
を作成し、作業フォルダーに保存します。function sl_customization(cm) cm.addModelAdvisorCheckFcn(@defineCheck);
チェック定義関数を作成します。関数内で、
ModelAdvisor.Check
オブジェクトを作成し、入力引数としてチェック ID を指定します。次に、ModelAdvisor.Check
Title
プロパティおよびCallbackHandle
プロパティを指定します。CallbackHandle
プロパティは編集時チェックを定義するために作成するクラスの名前です。この例では、MyEditTimeChecks
が名前空間でPortMismatch
がクラス名です。次に、モデル アドバイザーの新しいフォルダーにチェックをパブリッシュします。この例では、フォルダー名は 「System Composer Edit-time Check」 です。この例では、関数defineCheck
を作成し、その下のコードを含めます。関数defineCheck
を作業フォルダーに保存します。function defineCheck rec = ModelAdvisor.Check("advisor.edittimecheck.SystemComposerPortMismatch"); rec.Title = 'Check port mismatch for system composer components'; rec.CallbackHandle = 'MyEditTimeChecks.PortMismatch'; mdladvRoot = ModelAdvisor.Root; mdladvRoot.publish(rec,'System Composer Edit-time Check'); end
ModelAdvisor.EdittimeCheck
抽象基底クラスから派生するクラスを作成します。この例では、PortMismatch
という名前のクラス ファイルを作成します。下のコードをPortMismatch.m
ファイルにコピーします。次に、+MyEditTimeChecks
という名前のフォルダーを作成し、このフォルダーにPortMismatch.m
ファイルを保存します。クラスは名前空間と同じ名前のフォルダー内に存在する必要があります。PortMismatch
クラスは、PortMismatch
およびblockDiscovered
という 2 つのメソッドを定義します。PortMismatch
メソッドはCheckId
プロパティおよびTraversalType
プロパティを設定します。このチェックは新しく追加されたブロックと編集されたブロックおよび同じサブシステムまたはモデルで影響を受けたブロックを確認する必要があるため、チェックにはトラバーサル タイプのedittimecheck.TraversalTypes.ACTIVEGRAPH
が含まれます。blockDiscovered
メソッドには、端子インターフェイス名が一致するかどうかをチェックするアルゴリズムが含まれます。classdef PortMismatch < ModelAdvisor.EdittimeCheck methods function obj=PortMismatch(checkId) obj=obj@ModelAdvisor.EdittimeCheck(checkId); obj.traversalType = edittimecheck.TraversalTypes.ACTIVEGRAPH; end function violationArray = blockDiscovered(obj,blk) violationArray = []; blkHdl = get_param(blk, 'Handle'); archMdl = systemcomposer.arch.Model(bdroot(blk)); comp = archMdl.lookup('SimulinkHandle',blkHdl); if isa(comp, 'systemcomposer.arch.Component') for i = 1:length(comp.Ports) compPort = comp.Ports(i); if strcmp(compPort.Direction, 'Output') srcInterfaceName = compPort.InterfaceName; for j = 1:length(compPort.Connectors) connector = compPort.Connectors(j); destPort = connector.DestinationPort; destInterfaceName = destPort.InterfaceName; if(~strcmpi(srcInterfaceName, destInterfaceName)) hiliteHandle = destPort.SimulinkHandle; violation = ModelAdvisor.ResultDetail; ModelAdvisor.ResultDetail.setData(violation, 'Signal',hiliteHandle); violation.CheckID = obj.checkId; violation.Description = 'Connected port interface names should be the same.'; violation.Title = 'Port Interface Mismatch'; violation.ViolationType = 'warn'; violationArray = [violationArray violation]; %#ok<AGROW> end end end end else compPort = comp; if strcmp(compPort.Direction, 'Output') srcInterfaceName = compPort.InterfaceName; for j = 1:length(compPort.Connectors) connector = compPort.Connectors(j); destPort = connector.DestinationPort; destInterfaceName = destPort.InterfaceName; if(~strcmpi(srcInterfaceName, destInterfaceName)) hiliteHandle = destPort.SimulinkHandle; violation = ModelAdvisor.ResultDetail; ModelAdvisor.ResultDetail.setData(violation,'Signal',hiliteHandle); violation.CheckID = obj.checkId; violation.Description = 'Connected port interface names should be the same.'; violation.Title = 'Port Interface Mismatch'; violation.ViolationType = 'warn'; violationArray = [violationArray violation]; %#ok<AGROW> end end end end end end end
カスタム編集時チェック構成の作成
編集時チェックで構成されるカスタム構成を作成します。構成を myModel.slx
モデルに関連付けます。
モデル アドバイザーをリフレッシュして、パス上の新しいチェックでキャッシュを更新します。
Advisor.Manager.refresh_customizations
[モデル化] タブをクリックし、[モデル アドバイザー] 、 [編集時チェックのカスタマイズ] を選択するか、コマンド プロンプトで次のコマンドを入力してモデル アドバイザー構成エディターを開きます。
Simulink.ModelAdvisor.openConfigUI;
カスタム編集時チェックのみで構成されるカスタム構成を作成します。[製品] 、 [System Composer Edit-time Checks] フォルダーを選択してから、その他のフォルダーを削除します。構成を
sc_config.json
として保存します。モデル アドバイザー構成エディターを閉じます。[モデル化] タブをクリックし、[モデル アドバイザー] 、 [編集時チェック] を選択して、カスタム構成を
sc_config.json
ファイルに設定します。開いた [コンフィギュレーション パラメーター] ダイアログ ボックスで、[モデル アドバイザー構成ファイル] パラメーターに構成ファイルのパスを指定します。あるいは、コマンド プロンプトで次のコマンドを入力します。ModelAdvisor.setModelConfiguration('myModel', 'sc_config.json');
[モデル アドバイザー]、[編集時] コンフィギュレーション パラメーターを選択して、編集時のチェックをオンにします。あるいは、コマンド プロンプトで次のコマンドを入力できます。
edittime.setAdvisorChecking('myModel','on');
編集時の警告を表示するには、黄色で強調表示された信号をクリックします。
各端子のインターフェイス名が一致しないため、
Component
ブロックとComponent1
ブロック間のコネクタで警告が発生します。
参考
ModelAdvisor.EdittimeCheck
| ModelAdvisor.Check
| ModelAdvisor.ResultDetail