Main Content

C コード生成のためのブロックの状態の構成

Unit Delay ブロックの状態など、ブロックの状態は、アルゴリズムの実行サイクル間にある状態値を保持します。コード生成のためモデルを構成する際は、状態データを構成して次のことができます。

  • メモリに格納されるデータの量を最小限に抑える。

  • コード ジェネレーターが状態データをメモリ内のどこに配置するかを制御する。

  • 状態データをモデル インターフェイスにプロモートし、コンポーネントおよびシステムがそのデータにアクセスできるようにする。

  • 生成されたコードの可読性およびトレーサビリティを向上させる。

コード生成のためにモデル ConfigurationInterface についてブロックの状態を構成する方法を、例で説明します。コード マッピング エディター – C またはコード マッピング プログラミング インターフェイス (coder.mapping.api.CodeMapping) を使用してコード マッピングを構成できます。

状態についてのコード構成オプションの選択

コード生成の要件に応じて、状態データを表現する方法を決定します。既定では、モデルの状態は生成されたコードでは model_DW という名前のグローバル データ構造体のフィールドとして表示されます。カスタマイズを構成しない場合、コード ジェネレーターは生成されたコード内の状態の表現を最適化目的で削除するか変更するかを判断します。カスタマイズを構成する場合は、以下を決定します。

  • 既定の構成を設定するかどうか

    (10 より多いなど) 多数の状態へのアクセスを取得する必要がある場合、既定の設定で状態を構成してからその設定を特殊なケースについてオーバーライドするのが効率的です。固有のソース要件、ネーミング要件、または配置要件をもつ少数の状態へのアクセスを取得する必要がある場合は、それらの状態を個別に構成することを検討します。

  • 生成されたコードでの状態データの宣言と取り扱いの方法

    • 個別のグローバル変数として

    • 外部コードで定義されているグローバル変数から入力データを読み取るため

    • アクセス関数への呼び出しとして。Embedded Coder® が必要

    これらのオプションの詳細については、生成コードでのデータと関数インターフェイスの制御を参照してください。

その他の考慮事項には次のものがあります。

状態とそれに対応するストレージ クラスとストレージ クラスのプロパティに関連するインターフェイス要件のリストについては、Choose Storage Class and Storage Class Properties for Data Storesを参照してください。

モデル例 ConfigurationInterface についての状態の要件は次のとおりです。

  • 生成されたコードの実行中のアクセシビリティのため Unit Delay ブロックの状態データを保持する。

  • 状態を別のグローバル変数として表現する。

  • 接頭辞 dtemp_ を、状態を表す変数の名前に適用する。

この例では、生成されたコードでの既定の状態の表現を、static 型修飾子をもつグローバル変数として設定します。次に、Unit Delay ブロックの状態を、既定のストレージ クラスと、必須の接頭辞 dtemp_ を含む一意のコード識別子を使用するよう構成します。コード識別子機能によって、モデルの設計を変更することなくコード生成識別子を指定できます。

状態についての既定のコード生成設定の構成

状態の規定のコード生成設定を使用すると、特に、生成されたコードの実行中にアクセスする状態が多数あるモデルの場合、コード生成のためのモデルの準備作業を軽減できます。構成設定を一度選択すると、コード ジェネレーターによってこれらの設定がモデル全体の状態に適用されます。Simulink® は既定の構成をモデルの一部として保存します。

モデルで固有の要件がない複数の状態を使用する場合や共有の Embedded Coder ディクショナリを使用する場合は、モデルの状態について既定のコード生成設定を構成することを検討してください。

この例では、コード マッピング エディター – C を使用して状態について既定の設定を構成する方法を説明します。コード マッピング エディターを使用して、モデル ConfigurationInterface の状態についての既定のストレージ クラスを FileScope に設定します。ストレージ クラス設定をそのようにすると、コード ジェネレーターは、生成されたコードで状態データを static 型修飾子をもつグローバル変数として表します。

  1. モデル ConfigurationInterface を開きます。

    openExample("ConfigurationInterface")
    

    Simulink model to use for learning how to configure model states for code generation.

  2. Embedded Coder アプリを開きます。

  3. [C コード] タブで、[コード インターフェイス][既定のコード マッピング] を選択します。

  4. コード マッピング エディターで、[信号] の下でカテゴリー [Signals, states, and internal data] を選択します。既定のストレージ クラスを [FileScope] に設定します。

    Code Mappings editor with Data Defaults tab selected, Signals tree node expanded, and storage class for Signals, states, and internal data set to FileScope.

  5. モデルを保存します。

個別の状態に対するコード生成設定の構成

コード生成についての個別の状態を構成できます。たとえば、モデルに固有のコード生成要件をもつ状態が 2 つある場合、状態を個別に構成します。または、状態について既定の設定を構成する場合、特定の状態についてその設定をオーバーライドできます。

モデルが以下の条件のうち少なくとも 1 つを満たす場合、状態に対して個別にコード生成設定を構成することを検討してください。

  • 固有のソース要件、ネーミング要件、または配置要件がある複数の状態を使用する場合。

  • 少数の状態を使用する場合。

  • 状態について既定の構成があり、いくつかの特有の状態についてその構成をオーバーライドする必要がある場合。

この例では、コード マッピング エディターを使用して、既定のストレージ クラス設定をモデル ConfigurationInterface の Unit Delay ブロックの状態 X に適用します。

この例では、その状態に対するコード識別子を構成する方法も説明します。コード生成識別子は、たとえば統合用に、モデル設計の変更を伴わずに指定できます。

  1. まだ実行していない場合は、状態についての既定のコード生成設定の構成の手順を完了します。

  2. コード マッピング エディターで、[信号/状態] タブをクリックします。[States] を展開します。状態のストレージ クラスは Auto に設定されています。これは、コード ジェネレーターが最適化を目的として関連するコードの表現を削除または変更する可能性があることを意味しています。最適化が不可能な場合、コード ジェネレーターはモデルの既定の構成を適用します。この例の場合、モデルの既定の構成はストレージ クラス FileScope を指定します。

    • 最適化を回避し、コード ジェネレーターで既定の構成が強制的に使われるようにするには、ストレージ クラスを [Model default] に設定します。

    • 既定の構成をオーバーライドするには、その状態のコード生成に関する要件を満たすストレージ クラスを指定します。

  3. コード マッピング エディターで、状態 X を選択します。ストレージ クラスを [Model default: FileScope] に設定します。

  4. 接頭辞 dstate_ を含む名前をもつ状態のコード識別子を構成します。コード マッピング エディターで、状態 X を選択します。Icon to configure additional code mapping properties アイコンをクリックして、ストレージ クラス プロパティ [識別子]dstate_X に設定します。

    Code Mappings editor with Signals/States tab selected, States tree node expanded, and storage class for state X set to Model default: FileScope. Mapping Inspector shows Identifier property for state X set to dstate_X.

  5. モデルを保存します。

  6. コードを生成して表示します。たとえば、ConfigurationInterface.c で、状態データのデータ定義を見つけます。

    static MYTYPE dstate_X;
    

    ステップのエントリポイント関数で使用されている状態データの場所を見つけます。

    .
    .
    .
      if (mode) {
        output = (real_T)mp_K1 * dout_Table1;  
      } else {
        output = dstate_X;
      }
    .
    .
    .
       dstate_X = dout_Table2;
    }
    

状態についてのコード生成設定のプログラムでの構成

コード生成のための状態の構成を自動化するには、コード マッピングのプログラミング インターフェイスを使用します。たとえば、カスタム ブロック ライブラリの作成時やアプリケーション テスト環境の作成の一環として、プログラミング インターフェイスを使用してデータの構成を自動化します。

この例では、プログラミング インターフェイスを使用して、モデル ConfigurationInterface の状態を構成する方法を説明します。生成されたコードでの既定の状態の表現を static 型修飾子をもつグローバル変数として設定します。次に、Unit Delay ブロックの状態 X を、既定のストレージ クラスと、必須の接頭辞 dstate_ を含む固有のコード識別子を使用するよう構成します。

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

    openExample("ConfigurationInterface")
    
  2. 関数 coder.mapping.api.get を呼び出してオブジェクト cm を作成します。このオブジェクトは、モデル ConfigurationInterface のデータおよび関数のコード生成構成を保存します。

    cm = coder.mapping.api.get("ConfigurationInterface");
    
  3. 関数 setDataDefault を呼び出して状態の既定の設定を構成します。引数には、次の値を指定します。

    • coder.mapping.api.get で返されるオブジェクト

    • 既定のカテゴリの InternalData

    • プロパティ値 FileScope をもつプロパティ名 StorageClass

    setDataDefault(cm,"InternalData","StorageClass","FileScope");
    
  4. 状態についての既定の構成を検証します。coder.mapping.api.get およびカテゴリ InternalData によって返されるオブジェクトを指定する getDataDefault の呼び出しを発行します。3 番目の引数をプロパティ StorageClass として指定します。

    getDataDefault(cm,"InternalData","StorageClass")
    
    ans =
    
        'FileScope'
    
  5. 状態 X に既定の状態の構成を適用します。

    既定では、Simulink は個別の状態のストレージ クラスを Auto に設定します。コード ジェネレーターは次を行います。

    • 最適化目的で生成されたコードからデータを削除するかどうかを決定する。

    • データを保持する場合、既定の構成設定を考慮して、生成されたコード内でデータを効率的に表す方法を決定する。

    状態の構成を制御するには、関数 setState を呼び出します。

    次を指定する setState への呼び出しを発行します。

    • coder.mapping.api.get によって返されるオブジェクト

    • 状態名 X

    • 状態に対してプロパティ StorageClass およびプロパティ値 Model default を使用して以前に設定された既定のストレージ クラス。

    • プロパティ Identifier およびプロパティ値 dstate_X

    setState(cm,"X","StorageClass","Model default","Identifier","dstate_X");
    
  6. 関数 getState を呼び出して構成の変更を検証します。coder.mapping.api.get によって返されるオブジェクト、状態の名前、プロパティ StorageClass またはプロパティ Identifier を指定します。

    getState(cm,"X","StorageClass")
    
    ans =
    
        'Model default'
    
    getState(cm,"X","Identifier")
    
    ans =
    
        'dstate_X'
    
  7. モデルを保存します。

  8. コードを生成して表示します。たとえば、ConfigurationInterface.c で、状態データについてのデータ定義を見つけます。

    static MYTYPE dstate_X;
    

    ステップのエントリポイント関数で使用されている状態データの場所を見つけます。

    .
    .
    .
      if (mode) {
        output = (real_T)mp_K1 * dout_Table1;  
      } else {
        output = dstate_X;
      }
    .
    .
    .
       dstate_X = dout_Table2;
    }
    

状態のストレージ クラスおよびストレージ クラス プロパティの選択

コード生成の要件に応じて、ブロックの状態に対してコード生成を構成するストレージ クラスを次から選択します。ストレージ クラスのリストは Coder ディクショナリで定義されています。

ヒント

既定のマッピングでは、状態は [Signals, states, and internal data] セクションで構成されます。

要件既定のマッピングのストレージ クラス個別のマッピングのストレージ クラス
生成されたコードで状態を表現する方法をコード ジェネレーターの処理に委ねます。たとえば、最適化の目的で、コード ジェネレーターがデータの表現を削除または変更する可能性があります。 Auto
最適化できないデータ要素の場合、データを標準のデータ構造体のフィールドとして表します。既定値 
最適化によってデータ要素のストレージが削除されるのを防ぎ、データ要素のカテゴリに対して既定のマッピングを使用します。 Model Default
共有 Coder ディクショナリを使用する場合は、コード ジェネレーターで最適化しないデータ要素に対するディクショナリの既定値を選択します。Dictionary Default 
boolean、固定小数点、整数のデータを名前付きビット フィールドに保存する構造体を生成します。 ビットフィールド
volatile 型修飾子をもつグローバル変数の定義と宣言を生成します。Volatile (Const、Volatile、および ConstVolatileを参照)Volatile (Const、Volatile、および ConstVolatileを参照)
グローバル変数の定義と宣言を生成します。ExportedGlobalExportedGlobal
グローバル変数の定義と宣言を指定したファイルに生成します。ExportToFileExportToFile
static 型修飾子をもつグローバル変数の定義と宣言を生成します。FileScope (ローカルおよび共有ローカル データ ストア マッピングのみ)FileScope (ローカルおよび共有ローカル データ ストア マッピングのみ)
カスタムのアクセサー関数を呼び出して、データを処理するコードを生成します。GetSetGetSet
外部コードで定義されたグローバル変数またはグローバル変数のポインターに対して読み取りと書き込みを実行するコードを生成します。ImportedExtern、ImportedExternPointerImportedExtern、ImportedExternPointer
ExportToFileImportFromFileImportFromFile
関数に対してローカルである変数を生成します。LocalizableLocalizable
指定可能な名前をもつグローバル構造体を生成します。 struct
バッファーの再利用を有効にするグローバル変数を生成します。 Reusable
単一インスタンス データに対しては変数、マルチインスタンス データに対しては構造体を生成する。MultiInstanceMultiInstance

使用可能なストレージ クラスのリストには、Embedded Coder ディクショナリで定義された他のプロジェクト固有のストレージ クラスが含まれている可能性があります。リストされているストレージ クラスでは満たされない特別な要件がある場合、Embedded Coder ソフトウェアをお持ちであれば、ストレージ クラスを定義できます。Define Service Interfaces, Storage Classes, Memory Sections, and Function Templates for Software Architectureを参照してください。

個別の状態については、[Identifier] ストレージ クラス プロパティを使用して、生成されたコードで状態を表す変数の名前を構成します。[Identifier] プロパティを空白のままにすると、コード ジェネレーターは状態をもつブロックの [状態名] パラメーターを使用します。このパラメーターが空の場合、コード ジェネレーターはブロック名を使用します。

Embedded Coder を使用し、選択するストレージ クラスに応じて以下のプロパティを構成することもできます。

プロパティ説明ストレージ クラス
DefinitionFile状態および外部コードで読み取られるグローバル データの定義を含むソース定義ファイルExportToFile および Volatile
GetFunction状態は指定した関数 get への呼び出しとして生成されたコードに表示されます。GetSet
HeaderFile状態および外部コードで読み取られるグローバル データの宣言を含むソース ヘッダー ファイルExportToFileGetSetImportFromFile、および Volatile
Memory Section (既定の状態の構成のみ)状態で読み取られるデータを含むメモリ セクションDefault
Ownerコード ジェネレーターは、定義を共有するモデルの階層構造内の複数のモデルのいずれか 1 つに生成されたコード内に状態の定義を配置します。モデル コンフィギュレーション パラメーター [データ定義の配置にデータ オブジェクトからオーナーを使用する] を選択しなければなりません。Control Placement of Global Data Definitions and Declarations in Generated Filesを参照してください。ExportToFile および Volatile
PreserveDimensionsコード ジェネレーターは生成されたコードで多次元配列として表される状態データの次元を保持します。モデル コンフィギュレーション パラメーター [配列のレイアウト][行優先] に設定しなければなりません。Preserve Dimensions of Multidimensional Arrays in Generated Codeを参照してください。ExportToFileFileScopeGetSetImportFromFileLocalizable、および Volatile
SetFunction状態は指定した関数 set への呼び出しとして生成されたコードに表示されます。GetSet
StructName状態用に生成されたコード内の構造体の名前。BitField および Struct

参考

|

関連するトピック