Main Content

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

生成されたコードにおける調整可能なキャリブレーション パラメーターの作成

"キャリブレーション パラメーター" はグローバル メモリに保存される値です。アルゴリズムは計算で使用するためにこの値を読み取りますが、書き込みは行いません。キャリブレーション パラメーターはアルゴリズムの実行中に保存された値を変更できるため、"調整可能" です。キャリブレーション パラメーターを作成することで以下が可能です。

  • 実行中にパラメーターを調整して信号値をモニターし、最適なパラメーター値を特定する。

  • メモリに保存されたパラメーター値を上書きし、アルゴリズムを異なる実行条件に効率的に適応させる。たとえば、各車両のエンジン制御ユニットに異なるパラメーター値を保存して、質量の異なる複数の車両に同じ制御アルゴリズムを使用できます。

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 には、グローバル変数 myGainParammyOtherGainextern 宣言が含まれます。このヘッダー ファイルをインクルード (#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 で生成されたコードのアルゴリズムは計算に myGainParammyOtherGain を使用します。

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) 記述が含まれていなければなりません。

ストレージ クラスとメモリ セクションの定義を保存するパッケージの作成

ここで、サンプル パッケージ +SimulinkDemos をコピーして現在のフォルダーにパッケージを作成します。このパッケージには、後でモデルのデータ要素にストレージ クラスを適用するのに使用する Parameter クラスおよび Signal クラスの定義が保存されます。後で、このパッケージにはストレージ クラスと関連するメモリ セクションの定義も保存されます。

  1. 現在の MATLAB® フォルダーを書き込み可能な場所に設定します。

  2. +SimulinkDemos パッケージ フォルダーを現在のフォルダーにコピーします。コピーに +myPackage という名前を付けます。

    copyfile(fullfile(matlabroot,...
        'toolbox','simulink','simdemos','dataclasses','+SimulinkDemos'),...
        '+myPackage','f')

  3. +myPackage フォルダー内でファイル Signal.m に移動し、Signal クラスの定義を編集します。

  4. メソッド setupCoderInfo を定義する methods セクションのコメントを解除します。関数 useLocalCustomStorageClasses への呼び出しで、'packageName''myPackage' に置き換えます。完了すると、セクションは以下のようになります。

      methods
        function setupCoderInfo(h)
          % Use custom storage classes from this package
          useLocalCustomStorageClasses(h, 'myPackage');
        end
      end % methods

  5. ファイルを保存して閉じます。

  6. +myPackage フォルダー内でファイル Parameter.m に移動し、Parameter クラスの定義を編集します。メソッド setupCoderInfo を定義する methods セクションのコメントを解除し、'packageName''myPackage' で置き換えます。

  7. ファイルを保存して閉じます。

ストレージ クラスとメモリ セクションの作成

  1. 現在のフォルダーを、パッケージ フォルダー +myPackage を含むフォルダーに設定します。

  2. カスタム ストレージ クラス デザイナーを開きます。

    cscdesigner('myPackage')
  3. カスタム ストレージ クラス デザイナーの [メモリ セクション] タブで [新規] をクリックします。

  4. 新規のメモリ セクションで、次の表に従ってプロパティを設定します。

    プロパティ
    名前CalMem
    ステートメントを囲む文字変数のグループ
    ステートメントの前#pragma SEC(CALPRM)
    ステートメントの後#pragma SEC()
    const選択
    volatile選択

  5. [適用] をクリックします。

  6. [カスタム ストレージ クラス] タブで [新規] をクリックします。

  7. 新規のストレージ クラスで、次の表に従ってプロパティを設定します。

    プロパティ
    名前CalParam
    信号クリア
    データ スコープExported
    ヘッダー ファイルcalPrms.h
    定義ファイルcalPrms.c
    メモリ セクションCalMem

  8. [OK] をクリックします。変更を保存する確認のメッセージに対して [はい] をクリックします。

既定のパラメーター オブジェクトの myPackage.Parameter への設定

ストレージ クラスの適用を簡単にするために、モデル エクスプローラーを使用して既定のパラメーター オブジェクトを Simulink.Parameter から myPackage.Parameter に変更します。

  1. コマンド プロンプトでモデル エクスプローラーを開きます。

    daexplr

  2. モデル エクスプローラーの [モデルの階層構造] ペインで、[Base Workspace] を選択します。

  3. モデル エクスプローラーのツール バーで、[Add Simulink Parameter] ボタンの横にある矢印をクリックします。ドロップダウン リストで [クラス リストのカスタマイズ] を選択します。

  4. [クラス リストのカスタマイズ] ダイアログ ボックスで、[Parameter classes] の下で [myPackage.Parameter] の横にあるチェック ボックスをオンにします。[OK] をクリックします。

  5. モデル エクスプローラーのツール バーで、[Add Simulink Parameter] ボタンの横にある矢印をクリックします。ドロップダウン リストで [myPackage Parameter] を選択します。

    myPackage.Parameter オブジェクトがベース ワークスペースに表示されます。このオブジェクトは削除できます。

ここで、モデル データ エディターのようなツールを使用してパラメーター オブジェクトを作成すると、Simulink は Simulink.Parameter オブジェクトの代わりに myPackage.Parameter オブジェクトを作成します。

ストレージ クラスの適用

モデル例 RollAxisAutopilotBasicRollMode サブシステムは PID コントローラーを表します。P、I、および D パラメーターをキャリブレーション パラメーターとして構成します。

  1. モデルを開きます。

    openExample('RollAxisAutopilot');

  2. モデルで BasicRollMode サブシステム内に移動します。

  3. アプリ ギャラリーで [Embedded Coder] をクリックします。

  4. ブロック線図の下で、[モデル データ エディター] タブを選択してモデル データ エディターを開きます。

  5. モデル データ エディターで、[パラメーター] タブを選択してブロック線図を更新します。

    これにより、Gain ブロックによって使用されているワークスペース変数に対応する行がデータ テーブルに表示されます (コントローラーの P、I および D パラメーターを表します)。

  6. モデル データ エディターで、[コンテンツのフィルター] ボックスの横にある [選択を使用してフィルター処理します] ボタンを有効にします。

  7. モデルで 3 つの Gain ブロックを選択します。

  8. [コンテンツのフィルター] ボックスに「model workspace」と入力します。

    Gain ブロックが使用する変数はモデル ワークスペース内にあります。

  9. データ テーブルで 3 行を選択し、行の [Storage Class] 列で [Convert to parameter object] を選択します。

    モデル データ エディターにより、ワークスペース変数が myPackage.Parameter オブジェクトに変換されます。これで、ストレージ クラスをオブジェクトに適用できます。

  10. 行の [ストレージ クラス] 列で、[CalParam] を選択します。

コードの生成と検査

  1. モデルからコードを生成します。

  2. コード生成レポートで、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 はパラメーターを宣言します。

  3. インターフェイス ファイル 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)

いくつかのシステム定数 (マクロ) から計算された値を使用して、調整可能なパラメーターを初期化するコードを生成できます。たとえば、マクロ numVesselsvesInitVol から計算された値を使用して、調整可能なパラメーター totalVol を初期化するこのコードを生成できます。

#define numVessels 16
#define vesInitVol 18.2

double totalVol = numVessels * vesInitVol;

この初期化の手法によって調整可能なパラメーターとシステム定数との間の数学的関係が保持され、生成されたコードの読みやすさが向上し、より簡単に維持できるようになります。このコードを生成するには、次のようにします。

  1. システム定数を表現するパラメーター オブジェクトを作成します。

    numVessels = Simulink.Parameter(16);
    vesInitVol = Simulink.Parameter(18.2);

  2. ストレージ クラス Define を使用し、生成されたコードにマクロを出力するオブジェクトを構成します。

    numVessels.CoderInfo.StorageClass = 'Custom';
    numVessels.CoderInfo.CustomStorageClass = 'Define';
    
    vesInitVol.CoderInfo.StorageClass = 'Custom';
    vesInitVol.CoderInfo.CustomStorageClass = 'Define';

  3. 調整可能なパラメーターを表す別のパラメーター オブジェクトを作成します。ストレージ クラス ExportedGlobal を使用し、生成されたコードにグローバル変数を出力するオブジェクトを構成します。

    totalVol = Simulink.Parameter;
    totalVol.CoderInfo.StorageClass = 'ExportedGlobal';

  4. numVessels * vesInitVol を使用して totalVol の値を設定します。生成されたコードで式を保持するように指定するには、関数 slexpr を使用します。

    totalVol.Value = slexpr('numVessels * vesInitVol');

  5. 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 がある場合、ストレージ クラス FileScope または作成する同様のストレージ クラスを使用します。生成されたコードでのデータ表示を制御するストレージ クラスの選択を参照してください。

ASAP2 (a2l) の記述を生成する

ASAP2 規格を使用してキャリブレーション パラメーターを記述する、a2l ファイルを生成できます。詳細については、データ測定およびキャリブレーションのための ASAP2 ファイルのエクスポートを参照してください。

AUTOSAR XML (ARXML) 記述を生成する

Embedded Coder がある場合、AUTOSAR 規格向けに構成するモデルで使われるキャリブレーション パラメーターを記述する ARXML ファイルを生成できます。AUTOSAR キャリブレーション パラメーターとルックアップ テーブルのモデル化 (AUTOSAR Blockset)を参照してください。

キャリブレーションのためのルックアップ テーブル データを保存する

ASAP2 規格または AUTOSAR 規格 (STD_AXIS、COM_AXIS、CURVE など) に従ってキャリブレーション用にルックアップ テーブル データを保存するには、Simulink.LookupTable オブジェクトおよび Simulink.Breakpoint オブジェクトを Lookup Table ブロックで使用できます。

ただし、いくつかの制限が適用されます。Simulink.LookupTable を参照してください。Simulink.LookupTable オブジェクトおよび Simulink.Breakpoint オブジェクトの制限事項を回避するには、代わりに Simulink.Parameter オブジェクトを使用します。

詳細については、ルックアップ テーブル向け ASAP2 情報の定義およびAUTOSAR キャリブレーションおよび測定用のルックアップ テーブルの設定 (AUTOSAR Blockset)を参照してください。

プラグマを使用して特定のメモリ位置にパラメーター データを保存する

Embedded Coder ライセンスがある場合、カスタム プラグマが含まれるコードを生成するには、ストレージ クラスとメモリ セクションを使用します。Control Data and Function Placement in Memory by Inserting Pragmasを参照してください。

参考

| |

関連するトピック