System object の範囲解析のトラブルシューティング
System object を使用するモデルに対する範囲の派生時に、複数のハンドル オブジェクトを参照する可能性のある変数がモデルに含まれている場合、解析は失敗します。次の例は、固定小数点ツールがモデルに対する範囲を派生させることができるようにコードを再構成する方法を示しています。
この例では、他の条件に応じて異なる System object を参照する可能性のある変数がコードに含まれているため、最初のモデル ex_HandleVariableRefersToMultipleObjects
の範囲解析でエラーが発生します。モデル ex_HandleVariableRefersToSingleObject
は最初のモデルを書き換えたもので、機能は同じですが、固定小数点ツールはモデルに対する範囲を派生させることができます。
最初のモデルを開きます。MATLAB® コマンド ラインで以下のように入力します。
addpath(fullfile(docroot,'toolbox','fixpoint','examples')) ex_HandleVariableRefersToMultipleObjects
MATLAB Function ブロック内のコードは、カスタム System object の
fAddConstant
を参照します。function y = fcn(u, c) %#codegen persistent hSysObjAddTen persistent hSysObjAddNegTen persistent hSysObjForStep if isempty(hSysObjAddTen) hSysObjAddTen = fAddConstant(10); end if isempty(hSysObjAddNegTen) hSysObjAddNegTen = fAddConstant(-10); end if c > 0 hSysObjForStep = hSysObjAddTen; else hSysObjForStep = hSysObjAddNegTen; end y = step(hSysObjForStep, u);
Simulink® [アプリ] タブから [固定小数点ツール] を選択します。
固定小数点ツールの [新規] ワークフローで、
[固定小数点の反復的変換]
を選択します。固定小数点ツールの [設計対象のシステム (SUD)] で、変換するシステムとして
ex_HandleVariableRefersToMultipleObjects
を選択します。[範囲の収集モード] で [派生範囲] を選択します。
[範囲の収集] ボタンをクリックします。
c
の値に応じて異なる System object を参照する可能性のあるハンドル変数がコード内に存在するため、この解析は失敗します。固定小数点ツールが System object に対する範囲を派生させることができるように、MATLAB Function ブロック内のコードを次のように変更できます。
function y = fcn(u, c) %#codegen persistent hSysObjAddTen persistent hSysObjAddNegTen if isempty(hSysObjAddTen) hSysObjAddTen = fAddConstant(10); end if isempty(hSysObjAddNegTen) hSysObjAddNegTen = fAddConstant(-10); end if c > 0 y = step(hSysObjAddTen, u); else y = step(hSysObjAddNegTen, u); end
固定小数点ツールと
ex_HandleVariableRefersToMultipleObjects
モデルを閉じます。書き換えられたコードが含まれているex_HandleVariableRefersToSingleObject
モデルを開きます。MATLAB コマンド ラインで以下のように入力します。ex_HandleVariableRefersToSingleObject
Simulink [アプリ] タブから [固定小数点ツール] を選択します。
固定小数点ツールの [新規] ワークフローで、
[固定小数点の反復的変換]
を選択します。[範囲の収集モード] で [派生範囲] を選択します。
[範囲の収集] ボタンをクリックします。
今回は、固定小数点ツールはモデルで使用されている変数の範囲を問題なく派生させます。