Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

アーキテクチャ モデルで問題を修正するカスタム編集時チェックの定義

この例では、System Composer™ を使用して作成したアーキテクチャ モデルで実行されるカスタム編集時チェックの作成方法を説明します。編集時チェックにより、モデルの設計レビュー プロセスで早期に問題を検出できます。この例のカスタム編集時チェックでは、接続しているブロック端子のインターフェイス名が一致しないと警告が生成されます。カスタム チェックの作成プロセスの詳細については、カスタム モデル アドバイザー チェックの定義を参照してください。

単純なアーキテクチャ モデルの作成

コネクタを共有する端子間でデータ インターフェイス名が一致しない単純なアーキテクチャ モデルを作成します。

  1. 一時作業ディレクトリを作成します。

  2. MATLAB の [ホーム] タブで、[Simulink] をクリックします。

  3. Simulink のスタート ページで、[System Composer] をクリックして [アーキテクチャ モデル] を選択します。

  4. 3 つの Component ブロックを追加します。

  5. 次の図に示すように、1 つの Component ブロックの出力端子を他の 2 つの Component ブロックの入力端子に接続します。

    Simple architecture model

  6. [モデル化] タブで、[インターフェイス エディター] をクリックします。

  7. interface0 および interface1 という名前で 2 つのデータ インターフェイスを作成します。

  8. プロパティ インスペクターを開きます。

  9. Component に対して、OutBus 端子をクリックします。プロパティ インスペクターの [インターフェイス] セクションで、[名前] フィールドに対して [interface0] を選択します。

  10. Component1 に対して、InBus 端子をクリックします。プロパティ インスペクターの [インターフェイス] セクションで、[名前] フィールドに対して [interface1] を選択します。

  11. Component2 に対して、InBus 端子をクリックします。プロパティ インスペクターの [インターフェイス] セクションで、[名前] フィールドに対して [interface0] を選択します。

  12. モデルを作業ディレクトリに保存します。この例では、モデル名は myModel.slx です。

カスタム編集時チェックの作成

ユーザーがモデルを編集する際に同じコネクタを共有する端子間で一致しないデータ インターフェイス名を検出するチェックを作成します。

  1. カスタム編集時チェックを登録するには、関数 sl_customization を作成します。関数 sl_customization では、1 つの引数 (カスタマイズ マネージャー オブジェクト) を受け入れます。カスタム チェックを登録するには、addModelAdvisorCheckFcn メソッドを使用します。このメソッドへの入力は、チェック定義関数へのハンドルです。この例では、defineCheck がチェック定義関数です。関数 sl_customization を作成し、作業フォルダーに保存します。

    function sl_customization(cm)
    cm.addModelAdvisorCheckFcn(@defineCheck);
  2. チェック定義関数を作成します。関数内で、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
  3. 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 モデルに関連付けます。

  1. モデル アドバイザーをリフレッシュして、パス上の新しいチェックでキャッシュを更新します。

    Advisor.Manager.refresh_customizations
  2. [モデル化] タブをクリックし、[モデル アドバイザー][編集時チェックのカスタマイズ] を選択するか、コマンド プロンプトで次のコマンドを入力してモデル アドバイザー構成エディターを開きます。

    Simulink.ModelAdvisor.openConfigUI;
  3. カスタム編集時チェックのみで構成されるカスタム構成を作成します。[製品][System Composer Edit-time Checks] フォルダーを選択してから、その他のフォルダーを削除します。構成を sc_config.json として保存します。モデル アドバイザー構成エディターを閉じます。

  4. [モデル化] タブをクリックし、[モデル アドバイザー][編集時チェック] を選択して、カスタム構成を sc_config.json ファイルに設定します。開いた [コンフィギュレーション パラメーター] ダイアログ ボックスで、[モデル アドバイザー構成ファイル] パラメーターに構成ファイルのパスを指定します。あるいは、コマンド プロンプトで次のコマンドを入力します。

    ModelAdvisor.setModelConfiguration('myModel', 'sc_config.json');

  5. [モデル アドバイザー]、[編集時] コンフィギュレーション パラメーターを選択して、編集時のチェックをオンにします。あるいは、コマンド プロンプトで次のコマンドを入力できます。

    edittime.setAdvisorChecking('myModel','on');
    
  6. 編集時の警告を表示するには、黄色で強調表示された信号をクリックします。

    Architecture model with edit-time warning

    各端子のインターフェイス名が一致しないため、Component ブロックと Component1 ブロック間のコネクタで警告が発生します。

参考

| |

関連するトピック