最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

個別の信号、状態、およびパラメーター データ要素へのストレージ クラスの適用

"ストレージ クラス" とは、モデルのデータ項目 (信号、ブロック パラメーターまたは状態) に適用するコード生成の設定です。データ項目に直接適用すると、ストレージクラスは以下の動作をします。

  • データ項目が生成コードでグローバル シンボル (通常はグローバル変数) として表示されるようにする。

  • [既定のパラメーター動作] および [信号ストレージの再利用] などの最適化が、生成されたコードでデータ項目を排除するのを防止する。

  • Embedded Coder® がある場合には、生成されたコードがデータ項目を保存したり、定義するための形式を構成できる。たとえば、ストレージ型の修飾子 constvolatile を適用したり、パラメーター データ項目がマクロ (#define) として表示されるよう構成したりできます。

ストレージ クラスを個別のデータ項目に直接適用すると、次のことが可能です。

  • パラメーターを調整し、実行中の信号と状態を監視する。

  • メモリ セクションを通じてメモリでのデータの配置を構成する。

  • データ (たとえばグローバル変数) を外部コードと交換するコードを生成する。

コード マッピング エディターを使用して、ストレージ クラスを既定でデータのカテゴリに適用する詳細については、Configure Default Code Generation for Data (Embedded Coder)を参照してください。

データ項目へのストレージ クラスの適用

この例では、ストレージ クラスを、モデルの信号、ブロックの状態、およびブロック パラメーターに適用する方法を示します。

モデル例の確認

モデル例 rtwdemo_roll を開きます。

open_system('rtwdemo_roll')

BasicRollMode サブシステムに移動します。

open_system('rtwdemo_roll/BasicRollMode')

このサブシステムには、状態データの一部を保持する Integrator ブロックが含まれています。

モデルのルート レベルから、RollAngleReference サブシステムに移動します。

open_system('rtwdemo_roll/RollAngleReference')

このサブシステムには UpThr というラベルの付いた Constant ブロックが含まれています。

この例では、Integrator ブロックの状態と出力信号を構成し、Constant ブロックの [定数値] パラメーターが生成されたコードで別のグローバル変数として表示されるようにします。

ストレージ クラスの適用

  1. モデルのルート レベルに移動します。

  2. Simulink Coder アプリを開きます。画面の指示に従って、システム ターゲット ファイルを grt.tlc に変更します。

  3. [モデル データ エディター] タブをクリックします。

  4. モデル データ エディターで [スコープの変更] ボタンをクリックします。これにより、

  5. サブシステム内のデータ項目が含まれるよう、データのリストが展開されます。

  6. [信号] タブを選択します。

  7. [ビューの変更] ドロップダウン リストを Code に設定します。

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

  9. オプションで、[名前] 列を使用して、mySignal のような Integrator ブロックの出力信号の名前を指定します。

  10. [ストレージ クラス] 列を使用して、ストレージ クラス ExportedGlobal を適用します。

  11. [状態] タブを選択します。

  12. オプションで、[名前] 列を使用して、myState のような状態の名前を指定します。

  13. [ストレージ クラス] 列を使用して、ストレージ クラス ExportedGlobal を適用します。

  14. [パラメーター] タブを選択します。ブロック パラメーターにストレージ クラスを直接適用することはできません。Simulink.Parameter のようなパラメーター オブジェクトを作成し、そのオブジェクトを使用してブロック パラメーターの値を設定し、ストレージ クラスをそのオブジェクトに適用しなければなりません。

  15. [ビューの変更] ドロップダウン リストを Design に設定します。

  16. [コンテンツのフィルター] ボックスに UpThr と入力します。

  17. [値] 列を使用してパラメーターの値を 6 から UpThr に変更します。

  18. パラメーターの値を編集しながら、UpThr の横にあるアクション ボタン (3 つの縦向きのドット) をクリックし、[作成] を選択します。

  19. [新規データの作成] ダイアログ ボックスで、[値]Simulink.Parameter に設定して [OK] をクリックします。UpThr という名前の Simulink.Parameter オブジェクトがベース ワークスペースに表示されます。

  20. UpThr のプロパティのダイアログ ボックスで、[値]6 に、[ストレージ クラス]ExportedGlobal に設定します。[OK] をクリックします。

または、コマンド プロンプトで次のコマンドを使用して、信号、状態およびパラメーター データを設定できます。

% Configure signal
portHandles = get_param('rtwdemo_roll/BasicRollMode/Integrator',...
    'PortHandles');
outportHandle = portHandles.Outport;
set_param(outportHandle,'Name','mySignal')
set_param(outportHandle,'StorageClass','ExportedGlobal')

% Configure state
set_param('rtwdemo_roll/BasicRollMode/Integrator',...
    'StateName','myState')
set_param('rtwdemo_roll/BasicRollMode/Integrator',...
    'StateStorageClass','ExportedGlobal')

% Configure parameter
set_param('rtwdemo_roll/RollAngleReference/UpThr','Value','UpThr')
UpThr = Simulink.Parameter(6);
UpThr.StorageClass = 'ExportedGlobal';

コードの生成と検査

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

set_param('rtwdemo_roll','SystemTargetFile','grt.tlc')
rtwbuild('rtwdemo_roll')
### Starting build procedure for model: rtwdemo_roll
### Successful completion of build procedure for model: rtwdemo_roll
### Simulink cache artifacts for 'rtwdemo_roll' were created in 'H:\Documents\MATLAB\examples\simulinkcoder-ex37783258\rtwdemo_roll.slxc'.

ファイル rtwdemo_roll.c を検証します。このファイルはグローバル変数を定義します。

file = fullfile('rtwdemo_roll_grt_rtw','rtwdemo_roll.c');
rtwdemodbtype(file,'/* Exported block signals */','real32_T myState;',1,1)
/* Exported block signals */
real32_T mySignal;                     /* '<S1>/Integrator' */

/* Exported block parameters */
real32_T UpThr = 6.0F;                 /* Variable: UpThr
                                        * Referenced by: '<S3>/UpThr'
                                        */

/* Exported block states */
real32_T myState;                      /* '<S1>/Integrator' */

ファイル rtwdemo_roll.h でこの変数を宣言しています。これらの変数にアクセスするために、外部コードにこのヘッダー ファイルをインクルードする (#include) ことができます。

rtwdemo_roll.c で、UpThr のような変数の名前をファイルで検索します。関数 rtwdemo_roll_step のモデル アルゴリズムは、この変数に対して読み取りと書き込みを行います。

選択できる組み込みストレージ クラス

データ項目に対する既定のストレージ クラスは Auto です。これは、コード ジェネレーターが、コード内での項目の表示方法を決定することを意味しています。選択できる組み込みストレージ クラスのリストについては、生成されたコードでのデータ表示を制御するストレージ クラスの選択を参照してください。

ストレージ クラスの指定の保存場所の決定

ストレージ クラスを直接適用する個別の信号や状態データ項目 (Data Store Memory ブロックを含む) それぞれについて、Simulink® はストレージ クラスの指定を、モデル ファイル、または、ベース ワークスペース、モデル ワークスペースまたはデータ ディクショナリで作成する信号データ オブジェクト (Simulink.Signal) のプロパティのいずれかに保存します。ストレージ クラスをブロック パラメーターに適用するには、パラメーター データ オブジェクト (Simulink.Parameter など) を作成し、オブジェクトでストレージ クラスを指定しなければなりません。

  • ストレージ クラスをモデルの信号または状態に適用する場合、たとえば、モデル データ エディターまたはプロパティ インスペクターを使用して、ストレージ クラスの指定をモデル ファイルに保存します。

    この手法を使用する場合、外部の信号データ オブジェクトを使用して、データ型など、データ項目の他の特性を制御することはできません。

  • 信号またはパラメーター データ オブジェクトを作成する場合は、オブジェクトの CoderInfo プロパティを使用してストレージ クラスを適用します。このプロパティの値は Simulink.CoderInfo オブジェクトで、その StorageClass プロパティを使用してストレージ クラスを指定します。モデルのデータ項目をオブジェクトと関連付けた後、データ項目はそのオブジェクトからストレージ クラスを取得します。

信号、状態および Data Store Memory ブロックについて、ストレージ クラスの指定をモデルまたはデータ オブジェクトのどちらに保存するかの決定については、信号の設計属性と状態の保存 (Simulink)を参照してください。

モデル データ エディターを使用したストレージ クラスの Outport ブロックへの適用

モデル データ エディターを使用して、ストレージ クラスをルートレベルの Outport ブロックまたはブロックを駆動する入力信号に直接適用します。

  • ストレージ クラスの指定を Outport ブロックに格納するには、モデル データ エディターの [入力端子/出力端子] タブを使用します。この手法を使用する場合、ブロックを駆動する入力信号を削除した後でも指定は残ります。この手法を使用して内部アルゴリズムを作成する前にモデル インターフェイスを設定します。

  • ブロックを駆動する入力信号に指定を格納するには、モデル データ エディターの [信号] タブを使用します。

対話的にストレージ クラスを適用する手法

検索、並べ替え、フィルター可能なリスト内の複数のデータ項目にストレージ クラスを適用するには、データ項目へのストレージ クラスの適用に示すように、モデル データ エディター ( [モデル化] タブで [モデル データ エディター] をクリック) を使用します。

単一の信号、ブロックの状態、またはパラメーターに注目しているときにストレージ クラスを適用するには、プロパティ インスペクター ([モデル化] タブの [設計][プロパティ インスペクター] をクリック)、[信号プロパティ] ダイアログ ボックス (信号の場合)、またはブロック ダイアログ ボックス (状態またはパラメーターの場合) を使用します。[コード生成] の下で、ストレージ クラスを適用します。

  • 信号、状態、または Data Store Memory ブロックの場合、最初に、信号または状態に名前を付けます。この名前は、コード ジェネレーターが対応するグローバル シンボルの名前として使用します。次に、[Storage Class] (この場合、指定はモデル ファイルに保存されます) を使用してストレージ クラスを指定するか、またはSimulink モデル内のデータ オブジェクトの使用 (Simulink)に示すように、信号データ オブジェクトを作成し、そのオブジェクトにストレージ クラスを適用します。

プログラムでストレージ クラスを適用する手法

信号またはモデル ワークスペースまたはデータ ディクショナリに保存するパラメーター データ オブジェクトを操作するには、ワークスペースまたはディクショナリのプログラム インターフェイスを使用します。プログラムによる変数の操作 (Simulink)を参照してください。

ストレージ クラスの信号線への直接の適用

この例では、プログラムによってストレージ クラスを信号線に直接適用する方法について説明します。

  1. モデル例 rtwdemo_secondOrderSystem を開きます。

    rtwdemo_secondOrderSystem

  2. Force: f(t) という名前のブロックの出力のハンドルを取得します。

    portHandles = ...
         get_param('rtwdemo_secondOrderSystem/Force: f(t)','PortHandles');
    outportHandle = portHandles.Outport;

  3. 対応する信号の名前を ForceSignal に設定します。

    set_param(outportHandle,'Name','ForceSignal')

  4. 信号のストレージ クラスを ExportedGlobal に設定します。

    set_param(outportHandle,'StorageClass','ExportedGlobal')

  5. モデルからコードを生成します。コードでは信号を表現するために、グローバル変数 ForceSignal が宣言および定義されます。

ストレージ クラスのブロックの状態への直接の適用

この例では、プログラムによってストレージ クラスをブロックの状態に適用する方法について説明します。

  1. モデル例 rtwdemo_basicsc を開きます。

    rtwdemo_basicsc

  2. Delay ブロックの状態に myState と名前を付けます。

    set_param('rtwdemo_basicsc/Delay','StateName','myState')

  3. 状態のストレージ クラスを ExportedGlobal に設定します。

    set_param('rtwdemo_basicsc/Delay',...
        'StateStorageClass','ExportedGlobal')

  4. モデルからコードを生成します。コードでは状態を表現するために、グローバル変数 myState が宣言および定義されます。

パラメーター オブジェクト コンフィギュレーション クイック リファレンス線図

次の図に、生成コード内のパラメーター オブジェクトの表現を制御するコード生成とストレージ クラスのオプションを示します。

関連するトピック