Main Content

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

モデルが固有の要件がない複数の状態を使用する場合は、モデルの状態について既定のコード生成設定を構成することを検討します。

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

  1. モデル rtwdemo_configrpinterface を開きます。書き込み可能な場所にモデルのコピーを保存します。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  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: ExportedGlobal. Mapping Inspector shows Identifier property for state X set to dstate_X.

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

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

    real_T dstate_X;                        
    

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

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

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

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

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

  1. サンプル モデルを開きます。

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

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

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

    • 既定のカテゴリの InternalData

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

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

    getDataDefault(cm,'InternalData','StorageClass')
    
    ans =
    
        'ExportedGlobal'
    
  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. コードを生成して表示します。たとえば、rtwdemo_configrpinterface.c で、状態データについてのデータ定義を見つけます。

    real_T dstate_X;                        
    

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

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

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

コード生成の要件に応じて、ブロックの状態に対してコード生成を構成するストレージ クラスを次から選択します。

要件ストレージ クラス
生成されたコードで状態を表現する方法をコード ジェネレーターの処理に委ねます。たとえば、最適化の目的で、コード ジェネレーターがデータの表現を削除または変更する可能性があります。Auto (個別のマッピングのみ)
最適化できないデータ要素の場合、データを標準のデータ構造体のフィールドとして表します。既定値 (既定のマッピングのみ)
最適化によってデータ要素のストレージが削除されるのを防ぎ、データ要素のカテゴリに対して既定のマッピングを使用します。Model Default (個別のマッピングのみ)、Dictionary Default (個別のマッピングのみ)
グローバル変数の定義と宣言を生成します。ExportedGlobal
外部コードで定義されたグローバル変数またはグローバル変数のポインターに対して読み取りと書き込みを実行するコードを生成します。ImportedExtern、ImportedExternPointer

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

個別の状態については、[Identifier] ストレージ クラス プロパティを使用して、生成されたコードで状態を表す変数の名前を構成します。

参考

|

関連するトピック