Main Content

fix

クラス: ModelAdvisor.EdittimeCheck
名前空間: ModelAdvisor

編集時チェック ブロック違反を修正するアルゴリズムを指定する

R2022a 以降

構文

success = fix(obj,violation)

説明

success = fix(obj,violation) は、カスタム編集時チェック obj に違反している各ブロック violation を修正するアルゴリズムを指定するためのものです。編集時チェックに違反しているブロックは、blockDiscovered メソッドおよび finishedTraversal メソッドで行われる解析の一環として特定されます。

入力引数

すべて展開する

ブロック違反の修正を提供する対象の編集時チェック オブジェクト。ModelAdvisor.EdittimeCheck クラスから派生されるクラスのオブジェクトとして指定します。

編集時チェックに違反しているブロック。ModelAdvisor.ResultDetail オブジェクトまたは ModelAdvisor.ResultDetail オブジェクトの配列として指定します。

出力引数

すべて展開する

アルゴリズムの最初に、修正がまだ適用されていないことを示すために、値 false を指定します。最後に、修正が正常に適用されたことを示すために、値 true を指定します。

属性

Accessprotected

メソッドの属性については、メソッドの属性を参照してください。

すべて展開する

Inport ブロックと Outport ブロックが出力データ型に応じた所定の色になっていることをチェックするカスタム編集時チェックを作成します。

モデルを取得してモデル アドバイザー チェックを試します。

openExample('AdvisorCustomizationExample')

Model with edit-time check violations

モデルを作業フォルダーに保存します。モデルを閉じます。

カスタム編集時チェックを登録するには、関数 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 がパッケージ名で PortColor がクラス名です。次に、モデル アドバイザーの新しいフォルダーにチェックをパブリッシュします。この例では、フォルダー名は "DEMO: Edit-time Checks" です。この例では、関数 defineCheck を作成し、その下のコードを含めます。関数 defineCheck を作業フォルダーに保存します。

function defineCheck
rec = ModelAdvisor.Check("advisor.edittimecheck.PortColor");
rec.Title = 'Check color of Inport and Outport blocks';
rec.CallbackHandle = 'MyEditTimeChecks.PortColor'; 
mdladvRoot = ModelAdvisor.Root;
mdladvRoot.publish(rec,'DEMO: Edit-time Checks');

ModelAdvisor.EdittimeCheck 抽象基底クラスから派生するクラスを作成します。この例では、PortColor.m という名前のクラス ファイルを作成します。下のコードを PortColor.m ファイルにコピーします。次に、+MyEditTimeChecks という名前のフォルダーを作成し、このフォルダーに PortColor.m ファイルを保存します。クラスはパッケージ名と同じ名前のフォルダー内に存在する必要があります。

PortColor クラスは、PortColorblockDiscoveredfix という 3 つのメソッドを定義します。PortColor メソッドは CheckId プロパティおよび TraversalType プロパティを設定します。このチェックは新しく追加されたブロックと編集されたブロックを確認する必要がありますが、編集されたブロックまたは新しく追加されたブロックとして、同じサブシステムまたはモデル内の影響を受けたブロックを確認する必要はないため、チェックにはトラバーサル タイプの edittimecheck.TraversalTypes.BLKITER が含まれます。blockDiscovered メソッドには、Inport ブロックと Outport ブロックの色をチェックするアルゴリズムが含まれます。fix メソッドは正しい色になっていないブロックを更新します。

classdef PortColor < ModelAdvisor.EdittimeCheck
    % Check that ports conform to software design standards for background color.
    %
    %   Background Color                Data Types
    %   orange                          Boolean
    %   green                           all floating-point
    %   cyan                            all integers
    %   Light Blue                      Enumerations and Bus Objects
    %   white                           auto
    %


    methods
        % Set the Check ID and traversal type.
        function obj=PortColor(checkId)
            obj=obj@ModelAdvisor.EdittimeCheck(checkId);
            obj.traversalType = edittimecheck.TraversalTypes.BLKITER;                       
        end
        % Specify the edit-time check algorithm using the blockDiscovered method.
        function violation = blockDiscovered(obj, blk)
            violation = []; 
            % To check when this check gets called, insert a breakpoint here. 
            if strcmp(get_param(blk,'BlockType'),'Inport') || strcmp(get_param(blk,'BlockType'),'Outport')
                
                dataType = get_param(blk,'OutDataTypeStr');
                currentBgColor = get_param(blk,'BackgroundColor');
                
                if strcmp(dataType,'boolean')
                        if ~strcmp(currentBgColor, 'orange')
                            % Create a violation object using the ModelAdvisor.ResultDetail class.
                            violation = ModelAdvisor.ResultDetail;
                            ModelAdvisor.ResultDetail.setData(violation,'SID',Simulink.ID.getSID(blk));
                            violation.CheckID = obj.checkId;
                            violation.Description = 'Inport/Outport blocks with Boolean outputs should be orange.';
                            violation.title = 'Port Block Color';
                            violation.ViolationType = 'Warning';
                        end
                elseif any(strcmp({'single','double'},dataType))
                        if ~strcmp(currentBgColor, 'green')
                            violation = ModelAdvisor.ResultDetail;
                            ModelAdvisor.ResultDetail.setData(violation,'SID',Simulink.ID.getSID(blk));
                            violation.CheckID = obj.checkId;
                            violation.Description = 'Inport/Outport blocks with floating-point outputs should be green.';
                            violation.title = 'Port Block Color';
                            violation.ViolationType = 'Warning';
                        end
                elseif any(strcmp({'uint8','uint16','uint32','int8','int16','int32'}, dataType))
                        if ~strcmp(currentBgColor, 'cyan')
                            violation = ModelAdvisor.ResultDetail;
                            ModelAdvisor.ResultDetail.setData(violation,'SID',Simulink.ID.getSID(blk));
                            violation.CheckID = obj.checkId;
                            violation.Description = 'Inport/Outport blocks with integer outputs should be cyan.';
                            violation.title = 'Port Block Color';
                            violation.ViolationType = 'Warning';
                        end
                elseif contains(dataType,'Bus:')
                    if ~strcmp(currentBgColor, 'lightBlue')
                        violation = ModelAdvisor.ResultDetail;
                        ModelAdvisor.ResultDetail.setData(violation,'SID',Simulink.ID.getSID(blk));
                        violation.CheckID = obj.checkId;
                        violation.Description = 'Inport/Outport blocks with bus outputs should be light blue.';
                        violation.title = 'Port Block Color';
                        violation.ViolationType = 'Warning';
                    end
                 elseif contains(dataType,'Enum:')
                    if ~strcmp(currentBgColor, 'lightBlue')
                        violation = ModelAdvisor.ResultDetail;
                        ModelAdvisor.ResultDetail.setData(violation,'SID',Simulink.ID.getSID(blk));
                        violation.CheckID = obj.checkId;
                        violation.Description = 'Inport/Outport blocks with enumeration outputs should be light blue.';
                        violation.title = 'Port Block Color';
                        violation.ViolationType = 'Warning';
                    end
                elseif contains(dataType, 'auto')
                    if ~strcmp(currentBgColor, 'white')
                        violation = ModelAdvisor.ResultDetail;
                        ModelAdvisor.ResultDetail.setData(violation,'SID',Simulink.ID.getSID(blk));
                        violation.CheckID = obj.checkId;
                        violation.Description = 'Inport/Outport blocks with auto outputs should be white.';
                        violation.title = 'Port Block Color';
                        violation.ViolationType = 'Warning';
                    end                    
                end
            end  
        end
        
              
        % Optionally, provide a fix  for the violation object.
        function success = fix(obj, violation)
            success = false;
            dataType = get_param(violation.Data,'OutDataTypeStr');
            if strcmp(dataType,'boolean')
                set_param(violation.Data,'BackgroundColor','orange');
            elseif any(strcmp({'single','double'},dataType))
                set_param(violation.Data,'BackgroundColor','green');
            elseif any(strcmp({'uint8','uint16','uint32','int8','int16','int32'}, dataType))
                set_param(violation.Data,'BackgroundColor','cyan');
            elseif contains(dataType,'Bus:')  || contains(dataType,'Enum:')
                set_param(violation.Data,'BackgroundColor','lightBlue');
            elseif contains(dataType,'auto')
                set_param(violation.Data,'BackgroundColor','white');
            end
            success = true;
        end
    end
end

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

Advisor.Manager.refresh_customizations

AdvisorCustomizationExample モデルを開きます。

[モデル化] タブをクリックし、[モデル アドバイザー]、[構成エディター] を選択するか、コマンド プロンプトで次のコマンドを入力してモデル アドバイザー構成エディターを開きます。

Simulink.ModelAdvisor.openConfigUI;

カスタム編集時チェックで構成されるカスタム構成を作成します。構成を my_config.json として保存します。モデル アドバイザー構成エディターを閉じます。カスタム構成を my_config.json ファイルに設定します。

ModelAdvisor.setModelConfiguration('AdvisorCustomizationExample', 'my_config.json');

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

edittime.setAdvisorChecking('AdvisorCustomizationExample','on');

編集時の警告を表示するには、黄色で強調表示されたブロックをクリックします。

モデルの最上位レベルで、2 つの Inport ブロックの出力データ型が int32 になっています。これらはシアンでなければならないため、編集時の警告が生成されます。Outport ブロックについては、データ型が [自動] で白になっているため、違反は生成されません。

編集時の警告を修正するには、編集時チェック警告のウィンドウで [修正] をクリックします。

バージョン履歴

R2022a で導入