fix
クラス: ModelAdvisor.EdittimeCheck
名前空間: ModelAdvisor
構文
success = fix(obj,violation)
説明
は、カスタム編集時チェック success
= fix(obj
,violation
)obj
に違反している各ブロック violation
を修正するアルゴリズムを指定するためのものです。編集時チェックに違反しているブロックは、blockDiscovered
メソッドおよび finishedTraversal
メソッドで行われる解析の一環として特定されます。
入力引数
obj
— 編集時チェック オブジェクト
ModelAdvisor.EdittimeCheck
クラスから派生されるクラスのオブジェクト
ブロック違反の修正を提供する対象の編集時チェック オブジェクト。ModelAdvisor.EdittimeCheck
クラスから派生されるクラスのオブジェクトとして指定します。
violation
— 編集時チェックに違反しているブロック
ModelAdvisor.ResultDetail
| ModelAdvisor.ResultDetail
オブジェクトの配列
編集時チェックに違反しているブロック。ModelAdvisor.ResultDetail
オブジェクトまたは ModelAdvisor.ResultDetail
オブジェクトの配列として指定します。
出力引数
success
— 修正の成否
true
| false
アルゴリズムの最初に、修正がまだ適用されていないことを示すために、値 false
を指定します。最後に、修正が正常に適用されたことを示すために、値 true
を指定します。
例
Inport ブロックおよび Outport ブロックのカスタム編集時チェックの作成
Inport ブロックと Outport ブロックが出力データ型に応じた所定の色になっていることをチェックするカスタム編集時チェックを作成します。
モデルを取得してモデル アドバイザー チェックを試します。
openExample('AdvisorCustomizationExample')
モデルを作業フォルダーに保存します。モデルを閉じます。
カスタム編集時チェックを登録するには、関数 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
クラスは、PortColor
、blockDiscovered
、fix
という 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 で導入
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)