Main Content

C コード生成のためのルートレベルの Outport ブロックの構成

モデルから生成するコードを使用するには、生成されたエントリポイント関数を呼び出します。呼び出しの環境と生成される関数は、たとえばグローバル変数や関数の引数として、入力データと出力データを交換します。ルートレベルの Outport ブロック (出力端子) がインターフェイスの出力データを構成します。生成されたコードをより大きなアプリケーションに統合して展開するため、出力データの宣言と取り扱いの方法を含め、コード ジェネレーターがインターフェイス コードを生成する方法をカスタマイズできます。カスタマイズにより、次のことができます。

  • 既存のコードに行う変更の最小化。

  • モデルに変更を行う場合に、変更しない、あるいは最小限の変更しか行わない、安定したインターフェイスの生成。

  • データをより効率的に交換するコードの生成 (たとえば、非スカラー データに対するポインターおよび参照渡しの引数の使用による)。

コード生成について、この例ではモデル rtwdemo_configrpinterface について Outport インターフェイスをカスタマイズする方法を説明します。コード マッピング エディター – C またはコード マッピング API (coder.mapping.api.CodeMapping) を使用してコード マッピングを構成できます。

Outport インターフェイスのカスタマイズ オプションの選択

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

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

    モデルに多数 (たとえば 10 より多い) のルートレベルの Outport が含まれている場合、それらの Outport を既定の設定で構成して、それから特殊な場合についてその設定をオーバーライドすることがより効率的です。モデルに固有のソース、名前、または配置要件をもつ少数の Outport が含まれている場合は、その Outport を個別に構成することを検討します。

  • 生成されたインターフェイスで Outport データを宣言し取り扱う方法

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

    • 外部コードで定義されているグローバル変数に出力データを書き込む

    • 参照モデルの Outport の場合にグローバル変数 (void-void) として

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

    • エントリポイント関数の引数として。Embedded Coder が必要

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

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

対応するストレージ クラスとストレージ クラス プロパティをもつ Outport に関連するインターフェイス要件のリストについては、生成されたコードでのデータ表示を制御するストレージ クラスの選択を参照してください。

モデル例 rtwdemo_configrpinterface の Outport のインターフェイス要件は次のとおりです。

  • ルートレベルの Outport Out1 のデータを外部ヘッダー ファイルに書き込む。Out1 で書き込まれたデータは Switch ブロックについて生成されたコードの出力です。

  • 生成されたコードで Outport を表す変数は output という名前でなければならない。

この例では、rtwdemo_configrpinterface の Outport を構成して、これらのコード生成要件を満たすようにします。

ルートレベルの Outport に対する既定のコード生成設定の構成

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

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

モデル例 rtwdemo_configrpinterface には 1 つのルートレベルの Outport が含まれています。この例では、コード マッピング エディター – C を使用して、ルートレベルの Outport について既定の設定を構成する方法を説明します。コード ジェネレーターが、生成された外部ヘッダー ファイルと定義ファイルのルート Outport を表す変数を宣言し定義することを指定します。

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

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

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

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

  4. コード マッピング エディターの [Inports and Outports] でカテゴリ [出力端子] を選択します。既定のストレージ クラスを [ExportedGlobal] に設定します。

    Code Mappings editor with Data Defaults tab selected, Inports and Outports tree node expanded, and storage class for Outports set to ExportedGlobal.

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

個別のルートレベル Outport に対するコード生成設定の構成

コード生成について、個別のルートレベルの Outport を構成できます。たとえば、固有のコード生成要件をもつルートレベルの Outport がモデルに 2 つある場合には、Outport を個別に構成します。または、Outport に対して既定の設定を構成する場合、個別の Outport を、既定の設定を使用するか、または固有の設定を使用するよう構成します。

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

  • 固有の要件をもつ Outport を複数使用する。

  • 使用する Outport が少数である。

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

この例では、コード マッピング エディターを使用して、モデル rtwdemo_configrpinterface の Outport に既定のコード生成構成を適用する方法を説明します。前の例で、Outport の既定のストレージ クラスを ExportedGlobal に設定しました。

この例では、コード ジェネレーターが、生成されたコードで Outport に名前を付けるために使用する識別子を構成する方法も説明します。コード生成識別子は、たとえば統合用に、モデル設計の変更を伴わずに指定できます。

  1. まだ実行していない場合は、ルートレベルの Outport に対する既定のコード生成設定の構成の手順を完了します。

  2. コード マッピング エディターで、[出力端子] タブをクリックします。エディターに、モデル内の Outport ブロックの名前とバス要素の名前がリストされます。端子が信号オブジェクトに関連付けられる場合、信号オブジェクトへの関連付けアイコンが要素名の右側に表示されます。モデル例の Outport のストレージ クラスは Auto に設定されています。これは、最適化を目的として、コード ジェネレーターが関連するコードの表現を削除または変更する可能性があるということを意味します。最適化が不可能な場合、コード ジェネレーターはモデルの既定の構成を適用します。この例の場合、モデルの既定の構成はストレージ クラス ExportedGlobal を指定します。

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

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

  3. コード ジェネレーターを構成し、既定のストレージ クラス設定が Outport Out1 に適用されるようにします。Outport の行を選択します。ストレージ クラスを [Model default:ExportedGlobal] に設定します。

    Code Mappings editor with Outports tab selected, outport Out1 selected, and storage class being set to Model default: ExportedGlobal.

    選択した Outport のストレージ クラスが [Model default:ExportedGlobal] に変更されます。

  4. Outport のコード識別子を構成して、生成されたコードでのインターフェイス引数名が外部コードで使用されるインターフェイス引数名と一致するようにします。コード マッピング エディターで、Outport の行を選択します。Icon to configure additional code mapping properties アイコンをクリックして、[識別子] プロパティを output に設定します。

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

  6. コードを生成して表示します。たとえば、ファイル rtwdemo_configrpinterface.c で、ステップ エントリポイント関数内で変数 output が使用されている場所を見つけます。

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

ルートレベルの Outport についてのプログラムでのコード生成設定の構成

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

この例では、プログラミング インターフェイスを使用して、モデル rtwdemo_configrpinterface についてルートレベルの Outport の既定の設定を構成する方法を説明します。ルートレベルの Outport は、出力を別個のグローバル変数に書き込みます。

Outport について識別子を構成して、生成されたコードでのグローバル変数名が外部コード インターフェイスの変数名と一致するようにします。

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

    open_system('rtwdemo_configrpinterface')
    
  2. 関数 coder.mapping.api.get を呼び出してオブジェクト cm を作成します。オブジェクトには、モデル rtwdemo_configrpinterface のデータ要素についてのコード生成の構成が格納されます。

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

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

    • 既定のカテゴリの Outports

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

    setDataDefault(cm,'Outports','StorageClass','ExportedGlobal')
  4. Outport の既定の構成を検証します。coder.mapping.api.get によって返されるオブジェクト、カテゴリ Outports、および StorageClass を指定する getDataDefault の呼び出しを発行します。

    getDataDefault(cm,'Outports','StorageClass')
    
    ans =
    
        'ExportedGlobal'
    
  5. 既定の Outport の構成を Outport Out1 に適用します。

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

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

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

    Outport の構成を制御するには関数 setOutport を呼び出します。

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

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

    • Outport ブロック名 Out1

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

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

    setOutport(cm,'Out1','StorageClass','Model default','Identifier','output');
    
  6. 関数 getOutport を呼び出して構成の変更を検証します。coder.mapping.api.get によって返されるオブジェクト、Outport ブロックの名前、およびプロパティ StorageClass または Identifier を指定します。

    getOutport(cm,'Out1','StorageClass')
    
    ans =
    
        'Model default'
    
    getOutport(cm,'Out1','Identifier')
    
    ans =
    
        'output'
    
  7. モデルを保存します。

  8. コードを生成して表示します。たとえば、ファイル rtwdemo_configrpinterface.c で、ステップ エントリポイント関数内で変数 output が使用されている場所を見つけます。

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

ルートレベルの Outport に対するストレージ クラスとストレージ クラス プロパティの選択

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

要件ストレージ クラス
より効率的なコードを生成するように、最適化を有効にします。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)を参照してください。

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

参考

|

関連するトピック