このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
生成されたコードにおける調整可能なキャリブレーション パラメーターの作成
"キャリブレーション パラメーター" はグローバル メモリに保存される値です。アルゴリズムは計算で使用するためにこの値を読み取りますが、書き込みは行いません。キャリブレーション パラメーターはアルゴリズムの実行中に保存された値を変更できるため、"調整可能" です。キャリブレーション パラメーターを作成することで以下が可能です。
実行中にパラメーターを調整して信号値をモニターし、最適なパラメーター値を特定する。
メモリに保存されたパラメーター値を上書きし、アルゴリズムを異なる実行条件に効率的に適応させる。たとえば、各車両のエンジン制御ユニットに異なるパラメーター値を保存して、質量の異なる複数の車両に同じ制御アルゴリズムを使用できます。
Simulink® で、キャリブレーション パラメーターを表す Simulink.Parameter
オブジェクトを作成します。パラメーター オブジェクトを使用して、Gain ブロックの [ゲイン] パラメーターなど、ブロック パラメーター値を設定します。生成されたコードでパラメーター オブジェクトの表現を制御するには、ストレージ クラスをオブジェクトに適用します。
たとえばラピッド プロトタイピングなど、生成されたコードでブロック パラメーターに既定でアクセスできるようにするには、[既定のパラメーター動作] (既定のパラメーター動作を参照) を [調整可能]
に設定します。詳細については、生成コード内の変数の保持を参照してください。
調整可能なグローバル変数としてのブロック パラメーターの表現
以下の例では、生成されたコードでブロック パラメーターをグローバル変数として表すことで、調整可能なパラメーター データを作成する方法を示します。
パラメーター オブジェクトを使用したブロック パラメーターの構成
モデル例 InlineBlockParameters
を開き、生成されたブロック名を表示するよう設定します。
load_system('InlineBlockParameters') set_param('InlineBlockParameters','HideAutomaticNames','off') open_system('InlineBlockParameters')
[モデル化] タブで [モデル データ エディター] をクリックします。
モデル データ エディターで、[パラメーター] タブを検査します。
モデルで G1
Gain ブロックをクリックします。モデル データ エディターで、ブロックの [Gain] パラメーターに対応する行が強調表示されます。
モデル データ エディターの [値] 列で、ゲイン値を 2
から myGainParam
に変更します。
myGainParam
の横にあるアクション ボタン (3 つの縦向きのドット) をクリックし、[作成] を選択します。
Create New Data ブロックのダイアログ ボックスで、[値] を Simulink.Parameter(2)
に設定します。[作成] をクリックします。Simulink.Parameter
オブジェクト myGainParam
は、パラメーター値 2
をモデル ワークスペースに保存します。
myGainParam ダイアログ ボックスの [コード生成] タブで、[Coder アプリでの構成] をクリックします。
コード マッピング エディターで、myGainParam
の [ストレージ クラス] を ExportedGlobal
に設定します。このストレージ クラスにより、パラメーター オブジェクトは調整可能なグローバル変数として生成されたコードに表示されます。
あるいは、パラメーター オブジェクトを作成してモデルを構成するには、コマンド プロンプトで以下のコマンドを使用します。
set_param('InlineBlockParameters/G1','Gain','myGainParam') mws = get_param('InlineBlockParameters', 'modelworkspace'); mws.assignin('myGainParam',Simulink.Parameter(2)); cm = coder.mapping.utils.create('InlineBlockParameters'); setModelParameter(cm,'myGainParam','StorageClass','ExportedGlobal');
モデル データ エディターを使用して、G2
Gain ブロック用のパラメーター オブジェクト myOtherGain
を作成します。ストレージ クラス ExportedGlobal
を適用します。
あるいは、以下のコマンドをコマンド プロンプトで使用します。
set_param('InlineBlockParameters/G2','Gain','myOtherGain') mws.assignin('myOtherGain',Simulink.Parameter(-2)); setModelParameter(cm,'myOtherGain','StorageClass','ExportedGlobal');
コードの生成と検査
モデルからコードを生成します。
slbuild('InlineBlockParameters')
### Starting build procedure for: InlineBlockParameters ### Successful completion of build procedure for: InlineBlockParameters Build Summary Top model targets built: Model Action Rebuild Reason ======================================================================================================= InlineBlockParameters Code generated and compiled. Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 31.743s
生成されたファイル InlineBlockParameters.h
には、グローバル変数 myGainParam
と myOtherGain
の extern
宣言が含まれます。このヘッダー ファイルをインクルード (#include
) することで、実行時にコードによる変数の値の読み取りと書き込みを可能にします。
file = fullfile('InlineBlockParameters_grt_rtw','InlineBlockParameters.h'); coder.example.extractLines(file,... 'extern real_T myGainParam;','Referenced by: ''<Root>/G2''',1,1)
extern real_T myGainParam; /* Variable: myGainParam * Referenced by: '<Root>/G1' */ extern real_T myOtherGain; /* Variable: myOtherGain * Referenced by: '<Root>/G2'
ファイル InlineBlockParameters.c
は、myGainParam
および myOtherGain
にメモリを割り当て初期化します。
file = fullfile('InlineBlockParameters_grt_rtw','InlineBlockParameters.c'); coder.example.extractLines(file,... '/* Exported block parameters */','Referenced by: ''<Root>/G2''',1,1)
/* Exported block parameters */ real_T myGainParam = 2.0; /* Variable: myGainParam * Referenced by: '<Root>/G1' */ real_T myOtherGain = -2.0; /* Variable: myOtherGain * Referenced by: '<Root>/G2'
モデルの関数 step
で生成されたコードのアルゴリズムは計算に myGainParam
と myOtherGain
を使用します。
coder.example.extractLines(file,... '/* Model step function */','/* Model initialize function */',1,0)
/* Model step function */ void InlineBlockParameters_step(void) { /* Outport: '<Root>/Out1' incorporates: * Gain: '<Root>/G1' * Gain: '<Root>/G2' * Inport: '<Root>/In1' * Sum: '<Root>/Sum' */ InlineBlockParameters_Y.Out1 = myGainParam * InlineBlockParameters_U.In1 + myOtherGain * -75.0; }
ブロック パラメーターが MATLAB の数値変数を参照するときのストレージ クラスの適用
ブロック パラメーターの値の設定に数値変数を使用する場合、ストレージ クラスを変数に適用することはできません。回避策として、変数をパラメーター オブジェクトに変換し、ストレージ クラスをそのオブジェクトに適用することができます。変数をパラメーター オブジェクトに変換するには、以下の手法のいずれかを選択します。
モデル データ エディターの [パラメーター] タブで、[ビューの変更] が
[コード]
に設定された状態で、変数に対応する行を見つけます。[Storage Class] 列で、ドロップダウン リストから[Convert to parameter object]
を選択します。モデル データ エディターが変数をパラメーター オブジェクトに変換します。その後 [Storage Class] 列を使用して、ストレージ クラスをオブジェクトに適用します。この手法はモデル エクスプローラーでも使用できます。
データ オブジェクト ウィザードを使用します (データ オブジェクト ウィザードを使用したモデルのデータ オブジェクトの作成を参照)。ウィザードで [パラメーター] チェック ボックスをオンにします。ウィザードが変数をオブジェクトに変換します。次に、そのオブジェクトにストレージ クラスを、たとえばモデル データ エディターまたはモデル エクスプローラーを使用して適用します。
キャリブレーション パラメーターを表すストレージ クラスの作成 (Embedded Coder)
この例では、生成されたコードでキャリブレーション パラメーターを出力するストレージ クラスを作成する方法を示します。ストレージ クラスは、各パラメーター オブジェクト (Simulink.Parameter
) が、キーワードやプラグマなどの特殊な装飾をもつグローバル変数として表示されるようにします。
生成されたコードで、キャリブレーション パラメーターは、calPrms.c
という名前のファイルで定義され、calPrms.h
で宣言されたグローバル変数として表示されなければなりません。変数の定義は、次の定義のようにしなければなりません。
#pragma SEC(CALPRM) const volatile float param1 = 3.0F; const volatile float param2 = 5.0F; const volatile float param3 = 7.0F; #pragma SEC()
変数にはキーワード const
およびキーワード volatile
を使用します。プラグマ #pragma SEC(CALPRM)
は、メモリ内での変数の配置を制御します。プラグマを実装するには、変数定義が連続したコードのブロックに表示されなければなりません。
また、生成されたコードには、各パラメーターの ASAP2 (a2l
) 記述が含まれていなければなりません。
ストレージ クラスとメモリ セクションの定義を保存するパッケージの作成
現在のフォルダーにパッケージを作成します。新しいストレージ クラスの定義および関連するメモリ セクションをパッケージに追加します。次に、ストレージ クラスをモデル内のデータ オブジェクトに適用します。
パッケージ MATLAB® 名前空間フォルダー
+myPackage
を含む例を開きます。パッケージには、Parameter
クラスとSignal
クラスの定義が格納されます。openExample('ecoder/ExploreExampleModelCustomStorageClassesExample')
名前空間フォルダー
+myPackage
内でファイルSignal.m
に移動します。Signal.m
を開き、メソッドsetupCoderInfo
を定義しているmethods
セクションのコメントを解除します。関数useLocalCustomStorageClasses
への呼び出しで、'packageName'
を'myPackage'
に置き換えます。methods function setupCoderInfo(h) % Use custom storage classes from this package useLocalCustomStorageClasses(h, 'myPackage'); end end % methods
ファイルを保存して閉じます。
ファイル
Parameter.m
を開き、ファイルSignal.m
に行ったのと同じ変更を加えます。ファイルを保存して閉じます。
ストレージ クラスとメモリ セクションの作成
現在のフォルダーを、パッケージ名前空間フォルダー
+myPackage
を含むフォルダーに設定します。カスタム ストレージ クラス デザイナーを開きます。
cscdesigner('myPackage')
カスタム ストレージ クラス デザイナーの [メモリ セクション] タブで [新規] をクリックします。
新規のメモリ セクションで、プロパティを下表にリストされている値に設定します。
プロパティ 値 名前 CalMem
ステートメントを囲む文字 変数のグループ
ステートメントの前 #pragma SEC(CALPRM)
ステートメントの後 #pragma SEC()
const 選択 volatile 選択 [適用] をクリックします。
[カスタム ストレージ クラス] タブで [新規] をクリックします。
新規のストレージ クラスで、プロパティを下表にリストされている値に設定します。
プロパティ 値 名前 CalParam
信号 クリア データ スコープ Exported
ヘッダー ファイル calPrms.h
定義ファイル calPrms.c
メモリ セクション CalMem
[OK] をクリックします。変更を保存する確認のメッセージに対して [はい] をクリックします。
既定のパラメーター オブジェクトの myPackage.Parameter
への設定
ストレージ クラスの適用を簡単にするために、モデル エクスプローラーを使用して既定のパラメーター オブジェクトを Simulink.Parameter
から myPackage.Parameter
に変更します。
コマンド プロンプトでモデル エクスプローラーを開きます。
daexplr
モデル エクスプローラーの [モデルの階層構造] ペインで、[Base Workspace] を選択します。
モデル エクスプローラーのツール バーで、[Add Simulink Parameter] ボタンの横にある矢印をクリックします。ドロップダウン リストで [クラス リストのカスタマイズ] を選択します。
[クラス リストのカスタマイズ] ダイアログ ボックスで、[Parameter classes] の下で [myPackage.Parameter] の横にあるチェック ボックスをオンにします。[OK] をクリックします。
モデル エクスプローラーのツール バーで、[Add Simulink Parameter] ボタンの横にある矢印をクリックします。ドロップダウン リストで [myPackage Parameter] を選択します。
myPackage.Parameter
オブジェクトがベース ワークスペースに表示されます。このオブジェクトは削除できます。
ここで、モデル データ エディターのようなツールを使用してパラメーター オブジェクトを作成すると、Simulink は Simulink.Parameter
オブジェクトの代わりに myPackage.Parameter
オブジェクトを作成します。
ストレージ クラスの適用
モデル例 RollAxisAutopilot
の BasicRollMode
サブシステムは PID コントローラーを表します。P
、I
、および D
パラメーターをキャリブレーション パラメーターとして構成します。
モデルを開きます。
openExample('RollAxisAutopilot');
モデルで
BasicRollMode
サブシステム内に移動します。Embedded Coder アプリを開きます。
ブロック線図の下で、[モデル データ エディター] タブを選択してモデル データ エディターを開きます。
モデル データ エディターで、[パラメーター] タブを選択してブロック線図を更新します。
これにより、Gain ブロックによって使用されているワークスペース変数に対応する行がデータ テーブルに表示されます (コントローラーの P、I および D パラメーターを表します)。
モデル データ エディターで、[コンテンツのフィルター] ボックスの横にある [選択を使用してフィルター処理します] ボタンを有効にします。
モデルで 3 つの Gain ブロックを選択します。
[コンテンツのフィルター] ボックスに「
model workspace
」と入力します。Gain ブロックが使用する変数はモデル ワークスペース内にあります。
データ テーブルで 3 行を選択し、行の [Storage Class] 列で
[Convert to parameter object]
を選択します。モデル データ エディターにより、ワークスペース変数が
myPackage.Parameter
オブジェクトに変換されます。これで、ストレージ クラスをオブジェクトに適用できます。行の [ストレージ クラス] 列で、
[CalParam]
を選択します。
コードの生成と検査
モデルからコードを生成します。
コード生成レポートで、
calPrms.c
ファイルを検査します。このファイルは、キャリブレーション パラメーターを定義します。/* Exported data definition */ #pragma SEC(CALPRM) /* Definition for custom storage class: CalParam */ const volatile real32_T dispGain = 0.75F; const volatile real32_T intGain = 0.5F; const volatile real32_T rateGain = 2.0F; #pragma SEC()
ファイル
calPrms.h
はパラメーターを宣言します。インターフェイス ファイル
RollAxisAutopilot.a2l
を検査します。ファイルには、たとえばdispGain
など、各パラメーターに関する情報が含まれます。/begin CHARACTERISTIC /* Name */ dispGain /* Long Identifier */ "" /* Type */ VALUE /* ECU Address */ 0x0000 /* @ECU_Address@dispGain@ */ /* Record Layout */ Scalar_FLOAT32_IEEE /* Maximum Difference */ 0 /* Conversion Method */ RollAxisAutopilot_CM_single /* Lower Limit */ -3.4E+38 /* Upper Limit */ 3.4E+38 /end CHARACTERISTIC
システム定数または他のマクロからのパラメーター値の初期化 (Embedded Coder)
いくつかのシステム定数 (マクロ) から計算された値を使用して、調整可能なパラメーターを初期化するコードを生成できます。たとえば、マクロ numVessels
と vesInitVol
から計算された値を使用して、調整可能なパラメーター totalVol
を初期化するこのコードを生成できます。
#define numVessels 16 #define vesInitVol 18.2 double totalVol = numVessels * vesInitVol;
この初期化の手法によって調整可能なパラメーターとシステム定数との間の数学的関係が保持され、生成されたコードの読みやすさが向上し、より簡単に維持できるようになります。このコードを生成するには、次のようにします。
システム定数を表現するパラメーター オブジェクトを作成します。
numVessels = Simulink.Parameter(16); vesInitVol = Simulink.Parameter(18.2);
ストレージ クラス
Define
を使用し、生成されたコードにマクロを出力するオブジェクトを構成します。numVessels.CoderInfo.StorageClass = 'Custom'; numVessels.CoderInfo.CustomStorageClass = 'Define'; vesInitVol.CoderInfo.StorageClass = 'Custom'; vesInitVol.CoderInfo.CustomStorageClass = 'Define';
調整可能なパラメーターを表す別のパラメーター オブジェクトを作成します。ストレージ クラス
ExportedGlobal
を使用し、生成されたコードにグローバル変数を出力するオブジェクトを構成します。totalVol = Simulink.Parameter; totalVol.CoderInfo.StorageClass = 'ExportedGlobal';
式
numVessels * vesInitVol
を使用してtotalVol
の値を設定します。生成されたコードで式を保持するように指定するには、関数slexpr
を使用します。totalVol.Value = slexpr('numVessels * vesInitVol');
totalVol
を使用してモデルのブロック パラメーター値を設定します。モデルから生成するコードは、システム定数に基づいた値を使用して調整可能なパラメーターを初期化します。
Simulink.Parameter
オブジェクトの値を設定する式の使用の詳細と制限については、数式を使用した変数値の設定を参照してください。
パラメーター オブジェクトの保存場所のコード生成への影響
パラメーター オブジェクトは、ベース ワークスペース、モデル ワークスペースまたはデータ ディクショナリで作成できます。ただし、MATLAB セッションを終了すると、ベース ワークスペース内の変数は削除されます。パラメーター オブジェクトおよびモデルが使用するその他の変数の保存場所を決定するには、Simulink モデルの変数とオブジェクトの保存場所の決定を参照してください。
パラメーター オブジェクトの場所は、生成されたコードの対応するデータ定義のファイルの配置に影響する可能性があります。
パラメーター オブジェクトをベース ワークスペースまたはデータ ディクショナリに配置する場合、コード ジェネレーターでは、対応するパラメーター データ (たとえばグローバル変数など) がシステム内の特定のコンポーネントではなく、コードを生成するシステムに属していると仮定されます。たとえば、モデル参照階層内のモデルで
Auto
以外のストレージ クラスをもつパラメーター オブジェクトが使用されている場合、データ定義は階層の最上位モデル用に生成されたコードに表示され、オブジェクトを使用するモデル用に生成されたコードには表示されません。ただし、Embedded Coder® をお持ちの場合は、一部のストレージ クラスを使用してデータを所有するモデルの名前を指定することができます。所有者モデルを指定すると、そのモデル用に生成されたコードによってデータが定義されます。データの所有権の詳細については、Control Placement of Global Data Definitions and Declarations in Generated Filesを参照してください。
パラメーター オブジェクトをモデル ワークスペースに配置する場合、コード ジェネレーターは、モデルがデータを所有していると仮定します。保存モデルを含む参照階層からコードを生成する場合、データ定義はその保存モデル用に生成されたコードに表示されます。
データの所有権の詳細については、Control Placement of Global Data Definitions and Declarations in Generated Filesを参照してください。
Auto
以外のストレージ クラスをパラメーター オブジェクトに適用する場合、オブジェクトは生成されたコード内でグローバル シンボルとして表示されます。そのため、モデル参照階層では、異なるモデル ワークスペースまたはディクショナリに含まれる 2 つのオブジェクトが同じ名前を持つことはできません。各オブジェクトの名前はモデルの階層構造全体で一意でなければなりません。ただし、Embedded Coder がある場合、ストレージ クラス
FileScope
を使用し、異なるモデル ワークスペースにおけるパラメーター オブジェクト間で名前の衝突を防ぐことができます。Struct ストレージ クラスを使用してパラメーター データを構造体に整理するを参照してください。
モデル ワークスペース内に AUTOSAR.Parameter
オブジェクトを保存した場合、コード ジェネレーターはオブジェクトに対して指定したストレージ クラスを無視します。
信号データへのアクセスの設定
アルゴリズムの実行中にパラメーターの値を調整する場合、出力信号値をモニターまたは取得して、調整の結果を解析します。生成されたコードでアクセス可能なデータとして信号を表すには、テスト ポイントやストレージ クラスなどの手法を使用できます。生成コード内の変数の保持を参照してください。
パラメーターを調整するためのプログラム インターフェイス
生成されたコードを設定して、以下を含めることができます。
エクスターナル モードから独立しているパラメーターを調整するための C アプリケーション プログラム インターフェイス (API)。生成されたコードには、パラメーター値にアクセスするための独自のコードを書き込めるように、追加のコードが含まれています。C API を使用した生成コードと外部コードの間のデータ交換を参照してください。
エクスターナル モードから独立しているパラメーターを調整するための Target Language Compiler API。パラメーターの関数を参照してください。
調整可能なパラメーターの最小値と最大値の設定
調整可能なパラメーターの最小値と最大値を指定することをお勧めします。
以下の方法で最小値と最大値を指定できます。
パラメーター オブジェクトを使用するブロック ダイアログ ボックス内。この手法を使用して、最小値と最大値の情報をモデル内に保存します。
パラメーター値を設定するのに使用する
Simulink.Parameter
オブジェクトのプロパティを使用。この手法を使用して、最小値と最大値の情報をモデル外部に保存します。
詳細については、ブロック パラメーターの最小値と最大値の指定を参照してください。
その他のモデル化の目的に関する考慮事項
目的 | 考慮事項および詳細情報 |
---|---|
ストレージ型修飾子 const および volatile を適用する | Embedded Coder があり、ストレージ型修飾子を生成する場合は、型修飾子 const と volatile を使用したグローバル データの保護を参照してください。 |
キーワード static を適用して異なるコンポーネントにおけるパラメーター間で名前の衝突を防ぐ | Embedded Coder がある場合、ストレージ クラス |
ASAP2 (a2l ) の記述を生成する | ASAP2 規格を使用してキャリブレーション パラメーターを記述する、 |
AUTOSAR XML (ARXML) 記述を生成する | Embedded Coder がある場合、AUTOSAR 規格向けに構成するモデルで使われるキャリブレーション パラメーターを記述する ARXML ファイルを生成できます。AUTOSAR キャリブレーション パラメーターとルックアップ テーブルのモデル化 (AUTOSAR Blockset)を参照してください。 |
キャリブレーションのためのルックアップ テーブル データを保存する | ASAP2 規格または AUTOSAR 規格 (STD_AXIS、COM_AXIS、CURVE など) に従ってキャリブレーション用にルックアップ テーブル データを保存するには、 ただし、いくつかの制限が適用されます。 詳細については、ルックアップ テーブル向け ASAP2 情報の定義およびAUTOSAR キャリブレーションおよび測定用のルックアップ テーブルの設定 (AUTOSAR Blockset)を参照してください。 |
プラグマを使用して特定のメモリ位置にパラメーター データを保存する | Embedded Coder ライセンスがある場合、カスタム プラグマが含まれるコードを生成するには、ストレージ クラスとメモリ セクションを使用します。Control Data and Function Placement in Memory by Inserting Pragmasを参照してください。 |
参考
Simulink.Parameter
| Simulink.LookupTable
| Simulink.Breakpoint
関連するトピック
- 外部 C/C++ コードと Simulink モデルまたは生成コード間のデータ交換
- 異なるデータ型のコンテキストでパラメーター データを再利用
- 生成されたコードにおけるブロック パラメーターの調整可能性の制限
- 生成されたコードによる内部信号、状態、パラメーター データの保存方法
- C Data Code Interface Configuration for Model Interface Elements
- Access Structured Data Through a Pointer That External Code Defines
- AUTOSAR キャリブレーションおよび測定用のルックアップ テーブルの設定 (AUTOSAR Blockset)