Main Content

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

カスタム ストレージ クラス デザイナーを使用したストレージ クラスの作成

生成されたコード内のデータの外観を制御するには、ExportToFile などの組み込みストレージ クラスを使用できます (Struct ストレージ クラスを使用してパラメーター データを構造体に整理するを参照)。組み込みストレージ クラスが要件を満たさない場合は、独自のストレージ クラスを作成できます。データ オブジェクトに適用できるストレージ クラスを作成するには、カスタム ストレージ クラス デザイナーを使用してパッケージにストレージ クラスを作成します。Define Service Interfaces, Storage Classes, Memory Sections, and Function Templates for Software Architectureを参照してください。

コード マッピング エディターを使用してモデルに適用できるストレージ クラスを定義するには、Embedded Coder ディクショナリを使用します。または、パッケージにストレージ クラスを作成し、そのパッケージを Embedded Coder ディクショナリから参照します。

パッケージでは、Signal および Parameter データ クラスも定義します。データ オブジェクトを参照してください。Simulink などのパッケージのデータ オブジェクトでは、そのパッケージで定義されているストレージ クラスは使用できますが、他のパッケージで定義されているストレージ クラスは使用できません。

カスタム ストレージ クラス デザイナーを使用したメモリ セクションの作成の詳細については、Control Data and Function Placement in Memory by Inserting Pragmasを参照してください。

ストレージ クラスの作成と適用

モデル例の確認

この例では、独自のストレージ クラスを作成してデータ オブジェクトに適用することで、モデルから生成されるコードを制御する方法を示します。

モデル CustomStorageClasses を開きます。

open_system('CustomStorageClasses')

この例では、モデル内の複数の信号とパラメーターの宣言と定義を 1 つの宣言ヘッダー ファイルと 1 つの定義ファイルにエクスポートします。

データ クラス パッケージの作成

ストレージ クラスを作成するには、まず、データ クラス パッケージを作成してストレージ クラス定義を含めます。パッケージから作成したデータ オブジェクトでは、そのパッケージで定義されているストレージ クラスを使用できます。

  1. サンプル パッケージ フォルダー +SimulinkDemos をコピーして独自のデータ クラス パッケージを作成します。サンプル パッケージ フォルダーに移動します。

    % Remember the current folder path
    currentPath = pwd;
    
    % Navigate to the example package folder
    demoPath = '\toolbox\simulink\simdemos\dataclasses';
    cd([matlabroot,demoPath])
    

  2. +SimulinkDemos フォルダーをクリップボードにコピーします。

  3. 作業フォルダーに戻ります。

    cd(currentPath)

  4. +SimulinkDemos フォルダーをクリップボードから作業フォルダーに貼り付けます。コピーしたフォルダーの名前を「+myPackage」に変更します。

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

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

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

    関数 useLocalCustomStorageClasses により、myPackage で定義されているストレージ クラスを myPackage から作成したデータ オブジェクトに適用できます。

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

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

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

データ クラスの作成の詳細については、データ クラスの定義を参照してください。

ストレージ クラスの作成

カスタム ストレージ クラス デザイナーを使用して、ストレージ クラスを作成するか、データ クラス パッケージで定義されているストレージ クラスを編集できます。

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

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

    cscdesigner('myPackage')
  3. ストレージ クラス ExportToFile を選択します。

  4. [名前] フィールドで、ストレージ クラスの名前を「ExportToGlobal」に変更します。

  5. [ヘッダー ファイル] ドロップダウン リストで、選択を [インスタンス固有] から [指定] に変更します。新規フィールドで、ヘッダー ファイル名「global.h」を指定します。

  6. [定義ファイル] ドロップダウン リストで、選択を [Instance specific] から [Specify] に変更します。新規フィールドで、定義ファイル名「global.c」を指定します。

  7. [OK] をクリックします。[はい] をクリックして、データ クラス パッケージ myPackage への変更を保存します。

ストレージ クラスの適用

独自のストレージ クラスを適用するには、パッケージからデータ オブジェクトを作成し、ストレージ クラスを使用するようにオブジェクトを構成します。

  1. モデル例内のパラメーターと信号の一部を表すデータ オブジェクトを作成します。オブジェクトはデータ クラス パッケージ myPackage を使用して作成します。

    % Parameters
    templimit = myPackage.Parameter(202);
    pressurelimit = myPackage.Parameter(45.2);
    O2limit = myPackage.Parameter(0.96);
    rpmlimit = myPackage.Parameter(7400);
    
    % Signals
    tempalarm = myPackage.Signal;
    pressurealarm = myPackage.Signal;
    O2alarm = myPackage.Signal;
    rpmalarm = myPackage.Signal;
  2. 各オブジェクトのストレージ クラスを ExportToGlobal に設定します。

    % Parameters
    templimit.CoderInfo.StorageClass = 'Custom';
    templimit.CoderInfo.CustomStorageClass = 'ExportToGlobal';
    pressurelimit.CoderInfo.StorageClass = 'Custom';
    pressurelimit.CoderInfo.CustomStorageClass = 'ExportToGlobal';
    O2limit.CoderInfo.StorageClass = 'Custom';
    O2limit.CoderInfo.CustomStorageClass = 'ExportToGlobal';
    rpmlimit.CoderInfo.StorageClass = 'Custom';
    rpmlimit.CoderInfo.CustomStorageClass = 'ExportToGlobal';
    
    % Signals 
    tempalarm.CoderInfo.StorageClass = 'Custom';
    tempalarm.CoderInfo.CustomStorageClass = 'ExportToGlobal';
    pressurealarm.CoderInfo.StorageClass = 'Custom';
    pressurealarm.CoderInfo.CustomStorageClass = 'ExportToGlobal';
    O2alarm.CoderInfo.StorageClass = 'Custom';
    O2alarm.CoderInfo.CustomStorageClass = 'ExportToGlobal';
    rpmalarm.CoderInfo.StorageClass = 'Custom';
    rpmalarm.CoderInfo.CustomStorageClass = 'ExportToGlobal';
    
  3. モデル内の各ターゲット信号に対して [信号名を Simulink の信号オブジェクトに関連付ける] オプションを選択します。このオプションを選択するには、モデル データ エディターの [信号プロパティ] ダイアログ ボックスの [解決] 列を使用するか、コマンド ラインを使用します。

    % Signal tempalarm
    portHandles = get_param('CustomStorageClasses/RelOp1','PortHandles');
    outputPortHandle = portHandles.Outport;
    set_param(outputPortHandle,'MustResolveToSignalObject','on')
    
    % Signal pressurealarm
    portHandles = get_param('CustomStorageClasses/RelOp2','PortHandles');
    outputPortHandle = portHandles.Outport;
    set_param(outputPortHandle,'MustResolveToSignalObject','on')
    
    % Signal O2alarm
    portHandles = get_param('CustomStorageClasses/RelOp3','PortHandles');
    outputPortHandle = portHandles.Outport;
    set_param(outputPortHandle,'MustResolveToSignalObject','on')
    
    % Signal rpmalarm
    portHandles = get_param('CustomStorageClasses/RelOp4','PortHandles');
    outputPortHandle = portHandles.Outport;
    set_param(outputPortHandle,'MustResolveToSignalObject','on')
    

コードの生成

  1. モデル例のコードを生成します。

    slbuild('CustomStorageClasses')
  2. モデルの [コード] ビューで、生成されたヘッダー ファイル global.h を表示します。このファイルには、ストレージ クラス ExportToGlobal を使用するモデルの信号とパラメーターの extern 宣言が含まれています。

    /* Declaration for custom storage class: ExportToGlobal */
    extern boolean_T O2alarm;
    extern real_T O2limit;
    extern boolean_T pressurealarm;
    extern real_T pressurelimit;
    extern boolean_T rpmalarm;
    extern real_T rpmlimit;
    extern boolean_T tempalarm;
    extern real_T templimit;

  3. 生成されたファイル global.c を表示します。このファイルには、ストレージ クラス ExportToGlobal を使用するモデルの信号とパラメーターの定義が含まれています。

    /* Definition for custom storage class: ExportToGlobal */
    boolean_T O2alarm;
    real_T O2limit = 0.96;
    boolean_T pressurealarm;
    real_T pressurelimit = 45.2;
    boolean_T rpmalarm;
    real_T rpmlimit = 7400.0;
    boolean_T tempalarm;
    real_T templimit = 202.0;

組み込みストレージ クラスの変更

Simulink パッケージの ExportToFile などの組み込みストレージ クラスを直接変更することはできませんが、コピーを作成してからそのコピーを変更できます。csc_registration.m ファイルのない新しいパッケージを作成し、そのパッケージではじめてカスタム ストレージ クラス デザイナーを開くと、Simulink によって組み込みストレージ クラスの定義がパッケージにコピーされます。その後、カスタム ストレージ クラス デザイナーで、コピーされた定義を変更できます。あるいは、組み込みストレージ クラスをパッケージで使用可能なままにするには、[コピー] をクリックしてそのいずれかをコピーし、コピー結果を変更します。

ストレージ クラス プロパティの構成によるデータ表現の制御

カスタム ストレージ クラス デザイナーは、ストレージ クラスとメモリ セクションを作成して管理するためのツールです。+mypkg などの特定のパッケージに対してカスタム ストレージ クラス デザイナーを開くには、コマンド プロンプトで関数 cscdesigner を使用します。

cscdesigner('mypkg')

パッケージを表すフォルダーの名前は + で始まります。関数 cscdesigner を使用する際は、ターゲット パッケージの名前から + を省略します。

モデル内のデータに対するストレージ クラスの効果を制御するには、カスタム ストレージ クラス デザイナーでストレージ クラスのプロパティを指定します。特定の種類のコードを生成する方法を調べるには、次の表の情報を使用してください。

生成コード内のデータの種類手法
構造体[タイプ][FlatStructure] に設定します。構造化データの生成を参照してください。
マクロ[データの初期化][マクロ] に設定し、[信号] をオフにします。マクロの生成を参照してください。
ポインター[データ アクセス][ポインター] に設定し、[データ スコープ][自動][インポート]、または [インスタンス固有] に設定します。外部コードでポインター変数を定義しなければなりません。
static データ (ファイルスコープのデータ)[データ スコープ][ファイル] に設定します。
const または volatile データ[メモリ セクション]const または volatile、あるいはその両方を指定するメモリ セクションに設定します。たとえば、組み込みメモリ セクション MemConstMemVolatile、および MemConstVolatile のいずれかを使用します。独自のメモリ セクションを作成するには、Control Data and Function Placement in Memory by Inserting Pragmasを参照してください。
データに対する読み取りと書き込みを行う外部関数の呼び出し変数に対する読み取りと書き込みの代わりにカスタムのアクセサー関数またはマクロを呼び出すを参照してください。

ストレージ クラスのユーザーによるプロパティ値の指定を許可

[データ スコープ] など、ストレージ クラスの一部のプロパティでは、カスタム ストレージ クラス デザイナーで値を指定する代わりに、ストレージ クラスのユーザーによる値の指定を許可できます。いくつかのプロパティ値だけが異なる複数のストレージ クラスの代わりに、単一の柔軟なストレージ クラスを作成できます。

たとえば、生成されたコードでグローバル変数を出力するストレージ クラスを作成するとします。ユーザーがモデル内のある信号について [データ スコープ] プロパティを [エクスポート] に設定し、別の信号についてはこのプロパティを [インポート] に設定できるようにストレージ クラスを構成できます。

カスタム ストレージ クラス デザイナーで、このように構成するプロパティごとに、プロパティ値を [インスタンス固有] に設定します。これにより、ユーザーがストレージ クラスをデータ項目に適用すると、プロパティはそのデータ項目のカスタム属性としてユーザーに表示されます。インスタンス固有のカスタム属性の詳細については、ストレージ クラス プロパティを参照してください。

マクロの生成

生成コードでマクロを出力するストレージ クラスを作成するには、[データの初期化][マクロ] に設定し、[信号] をオフにします。

[データの初期化][マクロ] に設定すると、[定義ファイル] は意味をもたなくなります。ストレージ クラスのユーザーが意味のない定義ファイルを指定することを防ぐには、カスタム ストレージ クラス デザイナーで [定義ファイル][指定] に設定し、テキスト ボックスを空のままにします。

  • ヘッダー ファイルでマクロを定義するには (#define)、[ヘッダー ファイル] プロパティでヘッダー ファイルの名前を指定します。

  • マクロ定義をコンパイラ オプションまたはコンパイラ フラグとして提供するには、[データ アクセス][インポート] に、[ヘッダー ファイル][指定] に設定します。[ヘッダー ファイル] テキスト ボックスを空のままにします。これにより、生成されたコードでマクロは定義されず、ヘッダー ファイルはインクルード (#include) されません。

    コンパイラ オプションまたはコンパイラ フラグを指定するには、モデル コンフィギュレーション パラメーター [コンフィギュレーション パラメーター][コード生成][カスタム コード][コード情報][定義] を使用します。[コード生成] ペイン: カスタム コード: 追加のビルド情報: 定義を参照してください。

構造化データの生成

データ項目をフラットな構造体に集約するストレージ クラスを作成するには (組み込みストレージ クラス Struct と同様)、[タイプ][FlatStructure] に設定します。[構造体の属性] タブが表示されます。

  • 生成されたコードに表示されるグローバル構造体変数の名前を制御するには、[構造体名] プロパティおよびテキスト ボックスを使用します。

  • [構造体名][インスタンス固有] に設定した場合は、ストレージ クラスのユーザーが構造体変数の名前を指定します。この場合、コード ジェネレーターは変数の名前から構造体型の名前を導出します。

    構造体型の名前やその他の特性をより正確に制御するには、[構造体名][指定] に設定します。表示される追加プロパティを使用して型の特性を制御します。

  • ビット フィールドをもつ構造体を生成するには (組み込みストレージ クラス BitField と同様)、[ビットパック boolean] を選択します。boolean 型、固定小数点型、整数型のデータ項目が、構造体のビット フィールドとして生成されたコードに表示されます。

生成コードにおける初期値の代入の制御

  • 既定の Simulink® Coder™ 初期化手法を使用するには、[データの初期化] を既定値 [自動] に設定します。

    • 生成されたコードは、.c または .cpp ソース ファイルの上部の、関数の外側にある代入ステートメントでパラメーター データを静的に初期化します。

    • 生成されたコードは、モデルの初期化関数 (既定の名前は model_initialize) の一部として信号および状態データを動的に初期化します。

  • データを静的に初期化するには、[データの初期化][静的] に設定します。

  • データを動的に初期化するには、[データの初期化][動的] に設定します。

  • 生成されたコードによるデータの初期化を回避するには、[データの初期化][なし] に設定します。外部コードでデータが初期化される場合は、この設定を使用して、生成されたコードによる初期化の上書きを回避します。この設定は、Initialize Functionブロックで指定したデータには適用されません。

変数に対する読み取りと書き込みの代わりにカスタムのアクセサー関数またはマクロを呼び出す

組み込みストレージ クラス GetSet を使用すると、変数を直接操作する代わりに外部のカスタム関数を呼び出すコードを生成できます。GetSet の一般的な情報については、Access Data Through Functions with Storage Class GetSetを参照してください。

同様のストレージ クラスを作成するには、[タイプ][AccessFunction] に設定します。

  • 外部関数の名前を指定します。

    • 関数 get または関数 set の同じ命名規則をストレージ クラスを使用するデータ項目に適用するには、[関数 Get][関数 Set][指定] に設定します。次に、テキスト ボックスで、「get_myData_$N」などの関数の命名規則を指定します。命名規則でトークン $N を使用して、各データ項目の名前を表します。トークンを使用しない場合、各データ項目では関数 get または関数 set の同じ指定名が使用されるため、コード生成時にモデルでエラーが生成されます。

    • データ項目ごとに異なる関数 get または関数 set の名前を指定するには、[関数 Get] または [関数 Set][インスタンス固有] に設定します。後で、データ項目を作成してストレージ クラスを適用するときに、データ項目のカスタム属性を構成して関数名を指定します。

  • [ヘッダー ファイル] プロパティで、関数 get と関数 set を宣言するヘッダー ファイルの名前を指定します。この場合、[定義ファイル] は意味をもたなくなります。ストレージ クラスのユーザーが意味のない定義ファイルを指定することを防ぐには、[定義ファイル][指定] に設定し、テキスト ボックスを空のままにします。

  • スカラーまたは配列データに対する get メカニズムを関数ではなくマクロとして実装する場合は、そのデータの読み取り時にかっこを省略するコードを生成できます。[アクセス関数の属性] タブで、[マクロによるデータの取得 (かっこを省略)] を選択します。

外部コードのデータを使用するコードの生成

外部コードがデータを定義する場合、重複する定義が生成されないようにするには、既存のデータに対する読み取りと書き込みを行うように生成コードを構成する必要があります。カスタム ストレージ クラス デザイナーで、[データ スコープ][インポート] に設定します。コード ジェネレーターは、グローバル変数またはマクロの定義を生成しません。

  • コードでポインター変数を定義する場合、ポインターを操作するコードを生成するには、[データ アクセス][ポインター] に設定します。

  • [タイプ][FlatStructure] に設定して構造化データを生成する場合、コードで構造体型とグローバル構造体変数を定義する必要があります。

  • コードで状態または信号データを初期化する場合、[データの初期化][なし] に設定して、生成されたコードによる初期化の上書きを回避できます。グローバル変数の初期化コードの重複を防止を参照してください。

データ定義および宣言を含むコード コメントの生成

生成されたコードに表示されるコメントをカスタマイズするには、[コメント] タブで、[コメントの規則][指定] に設定します。各データ項目の宣言と共に表示されるコメントを指定するには、[宣言コメント] ボックスを使用します。定義と共に表示されるコメントを指定するには、[定義コメント] ボックスを使用します。

構造化データの場合 ([タイプ][FlatStructure] に設定)、構造体型定義と共に表示されるコメントを指定するには、[タイプ コメント] ボックスを使用します。

ストレージ クラス構成の検証によるコード生成時のエラーの回避

カスタム ストレージ クラス デザイナーでストレージ クラスを構成する際に、構成にエラーがないかを確認するには、[検証] をクリックします。

たとえば、[信号] がオンになっている状態で誤って [データの初期化][マクロ] に設定した場合、ストレージ クラスを検証すると警告が表示されます。信号は生成されたコードにマクロとして表示できません。

ストレージ クラスを現在のフォルダーの外部で使用可能にする

作成したストレージ クラスを使用するには、定義パッケージを使用可能にする必要があります。現在のフォルダーを、パッケージを含むフォルダーに設定するか、パッケージ フォルダーを含むフォルダーを MATLAB® パスに追加します (MATLAB 検索パスとはを参照)。パッケージを MATLAB パスに追加すると、現在のフォルダーをどこに設定してもストレージ クラスを使用できます。

ストレージ クラスをコード マッピング エディターで使用可能にする

コード マッピング エディターでパッケージベースのストレージ クラスを使用するには、パッケージを Embedded Coder ディクショナリから参照します。パッケージを参照するように Embedded Coder ディクショナリを構成するには、パッケージ内のコード生成定義の参照を参照してください。

パッケージ間でのストレージ クラスの共有

パッケージを作成する際に、組み込みのパッケージ Simulink や作成した異なるパッケージなどの別のパッケージで定義されているストレージ クラスを参照できます。これにより、定義パッケージと任意の参照元パッケージでストレージ クラスを使用できます。ストレージ クラスに変更を加える場合は、定義パッケージで 1 回だけ変更を行います。

別のパッケージで定義されているストレージ クラスを参照するようにパッケージを構成するには、次のようにします。

  1. カスタム ストレージ クラス デザイナーで、[カスタム ストレージ クラス] タブを選択します。

  2. [パッケージの選択] を使用して参照元パッケージを選択します。パッケージは書き込み可能である必要があります。

  3. [カスタム ストレージ クラスの定義] ペインで、下に参照を挿入する既存の定義を選択します。

  4. [新規参照] をクリックします。

    既定の名前とプロパティをもつ新しい参照が、前に選択した定義の下に表示されます。新しい参照が選択されて [リファレンス] タブが表示され、初期プロパティを示します。

  5. [名前] を使用して新しい参照の名前を指定します。名前はインポート パッケージ内で一意である必要がありますが、ソース パッケージでは名前が重複してもかまいません。名前を TLC キーワードにすることはできません。

  6. [パッケージ内のカスタム ストレージ クラスを参照] を設定して、参照するストレージ クラスを含むパッケージを指定します。

  7. [参照するカスタム ストレージ クラス] を設定して、参照するストレージ クラスを指定します。

  8. [OK] または [適用] をクリックします。変更を永続的に保存するには、[保存] をクリックします。

ストレージ クラス ドロップダウン リストの外観の制御

ストレージ クラスをデータ項目に適用する際、ストレージ クラスをドロップダウン リストから選択します。

  • リスト内のカスタム ストレージ クラスの順序を制御するには、カスタム ストレージ クラス デザイナーで、[上] ボタンと [下] ボタンを使用します。ドロップダウン リスト内のストレージ クラスの順序は、カスタム ストレージ クラス デザイナーで指定した順序と一致します。

  • ストレージ クラスのユーザーがパラメーター データまたは信号および状態データにストレージ クラスを適用できないようにするには、[パラメーター] チェック ボックスと [信号] チェック ボックスを使用します。これらのプロパティのいずれかをオフにすると、対応する種類のデータについて、ストレージ クラスがドロップダウン リストに表示されなくなります。

    たとえば、[データの初期化][マクロ] に設定したためにストレージ クラスによって生成コードでマクロが出力される場合は、ユーザーがストレージ クラスを信号データに適用できないようにするために、[信号] をオフにします。

カスタム ストレージ クラスの定義の保護

カスタム ストレージ クラス デザイナーで [保存] をクリックすると、デザイナーによってメモリ セクションとストレージ クラスの定義がパッケージ フォルダー内の csc_registration.m ファイルに保存されます。このファイルの場所を特定するには、カスタム ストレージ クラス デザイナーで、[ファイル名] の値を検査します。

パッケージ全体のストレージ クラス定義の変更を防止するには、csc_registration.m ファイルを MATLAB ファイルから P ファイルに変換します。関数 pcode を使用します。

csc_registration.mcsc_registration.p をパッケージ フォルダー内に保持することをお勧めします。このようにすると、デザイナーを使用してストレージ クラスを変更する場合、csc_registration.p を削除してから変更の終了後に再生成できます。P コード バージョンのファイルが優先されるため、両方のファイルがパッケージに存在する場合、ストレージ クラスは保護され、カスタム ストレージ クラス デザイナーで変更できません。

TLC コードの記述による生成コードのさらなるカスタマイズ

カスタム ストレージ クラス デザイナーでプロパティを操作して独自のストレージ クラスを作成しても要件を満たさない場合は、ストレージ クラスの TLC コードを記述して生成コードを細かく制御できます。カスタム ストレージ クラス デザイナーの詳細モードを使用して、ストレージ クラスの [タイプ][その他] に設定します。ストレージ クラスの TLC コードの記述によるデータ表現の詳細な制御を参照してください。

関連するトピック