Main Content

このページは前リリースの情報です。該当の英語のページはこのリリースで削除されています。

生成される C++ クラス インターフェイスのカスタマイズ

モデル コンフィギュレーション パラメーター [コード インターフェイスのパッケージ化][C++ クラス] に設定することで、モデル コードに C++ クラス インターフェイスを生成できます。生成されたインターフェイスは必要なモデル データを C++ クラスの属性にカプセル化し、モデル エントリ ポイント関数を C++ クラスのメソッドにカプセル化します。C++ クラスのカプセル化の利点には、次のようなものがあります。

  • モデル データへのアクセスのより厳密な制御

  • モデル クラスの多重インスタンス化

  • モデル コードの C++ プログラミング環境への簡単な統合

C++ クラスのカプセル化は、右クリックによる非バーチャル サブシステムのビルドにも機能します(適用される要件の詳細については、非バーチャル サブシステムの C++ クラス インターフェイスの設定を参照してください)。

モデル コードに C++ クラス インターフェイスを生成するには、次のようにします。

  1. MathWorks® が提供する ERT ベースのシステム ターゲット ファイルを使用するようにモデルを設定します。

  2. [コンフィギュレーション パラメーター] ダイアログ ボックスで、[言語][C++] に設定します。

  3. オプションで、グラフィカル ユーザー インターフェイス (GUI) またはアプリケーション プログラミング インターフェイス (API) を使用して、モデル コードに関連する C++ クラス インターフェイスの設定を行います。

  4. モデル コードを生成し、結果を確認します。

コード例の使用を開始するには、C++ クラスの制御の簡単な使用例を参照してください。モデル コードの C++ クラス インターフェイスの設定方法の詳細については、グラフィカル インターフェイスを使用した C++ クラス インターフェイスのカスタマイズおよびプログラムによる C++ クラス インターフェイスのカスタマイズを参照してください。適用される制限については、C++ クラス インターフェイス コントロールの制限を参照してください。

C++ クラス コード生成の例については、C コードで呼び出される生成された C++ コードへのインターフェイスのカスタマイズを参照してください。

C++ クラスの制御の簡単な使用例

この例では、[C++ クラス] コード インターフェイスのパッケージ化の簡単な使用例を説明します。既定の設定に大きな変更を加えることなく、モデル例から C++ クラス コード インターフェイスを生成します。

C++ クラス パラメーターの詳細については、本例の後にある、グラフィカル インターフェイスを使用した C++ クラス インターフェイスのカスタマイズ以降の節を参照してください。

Simulink® モデルに C++ クラス インターフェイスを生成するには、次のようにします。

  1. C++ クラス コード インターフェイスを生成するモデルを開きます。この例では、モデル rtwdemo_counter を使用します。書き込み可能な場所にモデルのコピーを保存します。

  2. MathWorks が提供する ERT ベースのシステム ターゲット ファイルを使用するよう、モデルを設定します。

  3. モデル コンフィギュレーション パラメーター [言語][C++] に設定します。モデル コンフィギュレーション パラメーター [コード インターフェイスのパッケージ化] の設定が [C++ クラス] に変わります。[適用] をクリックして、モデル コンフィギュレーションの変更を保存します。

    メモ

    関連するモデル コンフィギュレーション オプションを調整することなく、既定のスタイルの C++ クラス コードをすぐに生成するには、ステップ 4 ~ 8 を省略してください。

  4. [コンフィギュレーション パラメーター] ダイアログ ボックスの [インターフェイス] ペインを開き、[コード インターフェイス] セクションを確認します。モデルに [C++ クラス] のコード インターフェイスのパッケージ化が選択されているとき、[コード インターフェイス] セクションに追加の C++ クラス インターフェイス コントロールが表示されます。これらのコントロールの説明については、C++ コード インターフェイス パラメーターの設定を参照してください。インターフェイスの要件に合わせてパラメーター設定を変更します。

  5. [C++ クラス インターフェイスの設定] ボタンをクリックし、[C++ クラス インターフェイスの設定] ダイアログ ボックスを開きます。ダイアログ ボックスを使用して、生成したモデル クラスの step メソッドを設定します。ダイアログ ボックスには最初、モデル クラスに [既定の step メソッド] を設定するためのビューが表示されます。このビューで、モデルにモデル クラス名、step メソッド名、名前空間を指定できます。

    これらのコントロールの説明については、モデル クラスへの step メソッドの設定を参照してください。

    既定のインターフェイスのスタイルで要件が満たされる場合、ステップ 6 ~ 8 は省略してください。

  6. モデルのルートレベルの入出力を step メソッドの引数にするには、[関数の仕様][I/O 引数 step メソッド] に設定します。ダイアログ ボックスに、モデル クラスに I/O 引数スタイルの step メソッドを設定するためのビューが表示されます。コントロールの詳細については、モデル クラスへの step メソッドの設定を参照してください。

  7. [既定のコンフィギュレーションを取得] ボタンをクリックします。[C++ クラス インターフェイスの設定] サブペインが表示されます。サブペインに、モデルの初期のインターフェイス設定が表示されます。コントロールの詳細については、I/O 引数の受け渡しを参照してください。

  8. モデルの step メソッドに対して生成された I/O 引数の設定を行う場合、step メソッドの設定に満足するまでインターフェイスの変更と検証を続けます。ダイアログ ボックスのコントロールを使用して、I/O 引数の属性を設定します。たとえば、[C++ クラス インターフェイスの設定] サブペインの [Input] 引数の行で、[カテゴリ] の値を [Value] から [Pointer] に変更して、[型修飾子] の値を [none] から [const *] に変更できます。行った変更を反映してプレビューが更新されます。[検証] ボタンをクリックして、変更したインターフェイス設定を検証します。変更を保存するには、[適用][OK] を順にクリックします。

    I/O 引数の設定を行わない場合は、[キャンセル] をクリックしてダイアログ ボックスを閉じます。

  9. モデルのコードを生成します。[コード] ビューで、生成されたコードを確認します。必要なモデル データが C++ クラス属性にカプセル化され、モデルのエントリポイント関数が C++ クラス メソッドにカプセル化されたことを確認します。たとえば、ファイル rtwdemo_counter.h を選択し、モデルのクラス宣言を確認します。

モデルの step メソッドにカスタムの I/O 引数を設定した場合 (オプションのステップ 8)、rtwdemo_counter.h および rtwdemo_counter.cpp の step メソッドについて生成されたコードを確認します。引数に変更が反映されている必要があります。たとえば、Input 引数に提案された変更を行った場合、入力引数は const int32_T *arg_Input となっているはずです。

グラフィカル インターフェイスを使用した C++ クラス インターフェイスのカスタマイズ

C++ 言語の選択

C++ クラス インターフェイスを生成するようにモデルを設定するには、モデル コンフィギュレーション パラメーターの [言語][C++] に設定します。

このパラメーター設定では、次のようになります。

  • [C++ クラス] がサポートしていないモデル コンフィギュレーション パラメーターが無効化されます。詳細については、C++ クラス インターフェイス コントロールの制限を参照してください。

  • 追加の C++ クラス インターフェイス パラメーターを追加します。

C++ コード インターフェイス パラメーターの設定

[C++ クラス] のコード インターフェイスのパッケージ化を選択するようモデルを設定すると、[インターフェイス] ペインに C++ インターフェイスに適用されるパラメーターが表示されます。

  • マルチインスタンス コードのエラーの診断

    モデルがマルチインスタンス コード生成の要件に違反した場合に表示される、診断の重大度のレベルを指定します。

    • なし — 診断メッセージを表示しないでビルドを続行します。

    • 警告 — 警告メッセージの表示後にビルドを続行します。

    • エラー (既定の設定) — エラー メッセージの表示後にビルドを停止します。

  • リアルタイム モデル データ構造のエラー ステータス フィールドを削除

    生成されたリアルタイム モデルのデータ構造体 rtModel からエラー ステータス フィールドを省略するかどうかを指定します (既定ではオフになっています)。このオプションをオンにすると、メモリ使用量が削減されます。

    このオプションを選択すると、コード ジェネレーターで生成コードからデータ構造体 rtModel が省略されます。

  • モデル クラスにモデル タイプを含める

    モデルのクラスの名前空間内にモデル タイプの定義を含めます。モデル タイプの定義には次があります。

    • ルートレベルの Inport および Outport

    • ブロックの入力と出力

    • DWork ベクトル

    • ブロック パラメーターと定数パラメーター

    • 連続状態

    • リアルタイム モデル データ構造体 (rtM)

    生成コードは MISRA 7-3-1 違反を削減します。

  • パラメーターの可視性

    ブロック パラメーター構造体を C++ モデル クラスの publicprivate、または protected データ メンバーとして生成するかどうかを指定します (既定の設定は private です)。

  • パラメーターのアクセス

    C++ モデル クラスのブロック パラメーターにアクセス メソッドを生成するかどうかを指定します (既定の設定は [なし] です)。インライン化されないアクセス メソッド ([メソッド]) かインライン化されたアクセス メソッド ([インライン化されたメソッド]) を選択できます。

  • 外部 I/O のアクセス

    C++ モデル クラスのルートレベル I/O 信号にアクセス メソッドを生成するかどうかを指定します (既定の設定は [インライン化された構造体ベースのメソッド] です)。アクセス メソッドを生成する場合、次のオプションがあります。

    • インライン化されないアクセス メソッドを生成するか、もしくはインライン化されたアクセス メソッドを生成する。

    • "信号単位" のアクセス メソッドを生成するか、もしくは "構造体ベース" のアクセス メソッドを生成する。一連の set メソッドと get メソッドを信号単位で生成することもできますが、引数として外部入力構造体のアドレスを受け取る set メソッドを 1 つだけ生成し、(該当する場合) 外部出力に、参照を外部出力構造体に返す get メソッドを 1 つだけ生成することもできます。構造体ベースのアクセス メソッドで生成されるコードの一般的な形式は次のとおりです。

      class ModelClass {
      ...
         // Root inports set method
         void setExternalInputs(const ExternalInputs* pExternalInputs);
      
         // Root outports get method
         const ExternalOutputs & getExternalOutputs() const;
      }

    このパラメーターは、モデル クラスに既定のスタイルの step メソッドを使用している場合にのみ、生成コードに影響します。I/O 引数スタイルの step メソッドを使用してルートレベル I/O 信号の引数を明示的に受け渡している場合は、"影響しません"。詳細については、既定の引数の受け渡しおよびI/O 引数の受け渡しを参照してください。

  • 外部 I/O の可視性

    ルートレベルの I/O 構造体を C++ モデル クラスの publicprivate、または protected データ メンバー (既定の設定は private) として生成するかどうかを指定します。

  • C++ クラス インターフェイスの設定

    [C++ クラス インターフェイスの設定] ダイアログ ボックスを開きます。モデル クラスに step メソッドを設定できます。詳細については、モデル クラスへの step メソッドの設定を参照してください。

関連はしているがあまり使用されないインターフェイス パラメーターは、[詳細設定パラメーター] の下に表示されます。

  • 終了関数の生成

    model_terminate メソッドを生成するかどうかを指定します (既定の設定はオンです)。この関数にはモデルの終了コードが含まれ、システム シャットダウンで呼び出さなければなりません。

  • 信号と状態の構造の統合

    生成コードでグローバル ブロック信号とグローバル状態データを組み合わせて 1 つのデータ構造体にするかどうかを指定します (既定の設定はオフです)。このパラメーターをオンにすると、RAM の使用量が削減され、生成コードの可読性が高まります。

  • 内部データの可視性

    ブロック I/O、DWork ベクトル、ランタイム モデル、ゼロクロッシング、連続状態などの内部データ構造体を C++ モデル クラスの publicprivate、または protected データ メンバーとして生成するかどうかを指定します (既定の設定は private です)。

  • 内部データのアクセス

    C++ モデル クラスの内部データ構造体 (ブロック I/O、DWork ベクトル、ランタイム モデル、ゼロクロッシング、連続状態など) にアクセス メソッドを生成するかどうかを指定します (既定の設定は [なし] です)。インライン化されないアクセス メソッド ([メソッド]) かインライン化されたアクセス メソッド ([インライン化されたメソッド]) を選択できます。

  • デストラクターの生成

    C++ モデル クラスのデストラクターを生成するかどうかを指定します (既定の設定はオンです)。

  • Model ブロックのインスタンス化に動的メモリ割り当てを使用

    Model ブロックを含むモデルについて、生成コードがモデルのオブジェクトの登録中に動的メモリ割り当てを使用して、C++ クラス インターフェイスで設定された参照モデルのオブジェクトをインスタンス化するかどうかを指定しなければなりません (既定の設定はオフです)。このパラメーターをオンにすると、モデル参照階層の最上位モデルのオブジェクトのインスタンス化中に、生成コードは演算子 new を使用して、参照モデルのオブジェクトをインスタンス化します。

    このパラメーターをオンにすると、親モデルは直接の子以下の参照モデルの情報を維持する必要がなくなります。このパラメーターをオフにすると、親モデルは直接および間接の子を含む参照モデルの情報を維持します。

    • このパラメーターをオンにする場合、new の使用中にメモリ不足のエラーが発生したときに、C++ で標準的な bad_alloc 例外が表示され可能性があります。最上位モデルのオブジェクトの作成中に、new 呼び出しでメモリ不足エラーが発生した場合の bad_alloc 例外をキャッチし、処理するコードを記述してください。

    • [Model ブロックのインスタンス化に動的メモリ割り当てを使用] がオンで、ベース モデルに Model ブロックが含まれている場合、ビルド プロセスはモデル クラスのプライベート セクションでコピー コンストラクターと代入演算子の関数を生成することがあります。この関数の目的は、モデル クラス内のポインター メンバーが他のコードによってコピーされないようにするためです。詳細については、モデル クラスのコピー コンストラクターと代入演算子を参照してください。

モデル クラスへの step メソッドの設定

モデル クラスに step メソッドを設定するには、[コード生成][インターフェイス] ペインで [C++ クラス インターフェイスの設定] ボタンをクリックします。このボタンは、モデルで [C++ クラス] コード インターフェイスのパッケージ化が選択されているときに有効になります。[C++ クラス インターフェイスの設定] ダイアログ ボックスが表示されたら、次の 2 つのスタイルのいずれかを使用してモデル クラスに step メソッドを設定します。

[既定の step メソッド] は、シングルレート モデルとマルチレート モデルをサポートします。モデルをシングルタスク処理に設定することも、マルチタスク処理に設定することもできます。このメソッドは、境界を超えるバーチャル バスもサポートしています。

[I/O 引数 step メソッド] は、シングルレート モデルとマルチレート モデルをサポートします。モデルはシングルタスク処理に設定できます。

既定の引数の受け渡し-  [C++ クラス インターフェイスの設定] ダイアログ ボックスには最初、モデル クラスに [既定の step メソッド] を設定するためのビューが表示されます。

  • step メソッド名

    メソッド名を既定値 step 以外のものに指定できます。

  • クラス名

    モデルのクラス名を既定値 modelModelClass 以外のものに指定できます。

  • 名前空間

    モデル クラスに名前空間を指定できます。指定した場合、その名前空間がモデル クラスの生成コードに出力されます。[名前空間] パラメーターは、C++ モデル クラスをスコープ化する手段を提供します。モデル参照階層内で、各参照モデルに異なる名前空間を指定できます。

  • ステップ関数のプレビュー

    現在の設定内容に基づき、モデルのステップ関数のプロトタイプのプレビューが表示されます。現在の設定内容を検証すると、プレビューの表示が動的に更新されます。

    ステップ関数の引数のリストには、モデルのルートレベルの I/O 端子ごとに 1 つのエントリが表示されます。このリストには、モデルが参照モデルとして使用されたときに生成コードに含まれる可能性のあるモデル パラメーター引数は含まれません。たとえば、モデル sldemo_mdlref_counter_paramargs には、引数名が arg_input の入力端子と、引数名が arg_output の出力端子と、限度値としてワークスペース パラメーターの引数名 lower_saturation_limit および upper_saturation_limit をもつ Saturation ブロックが含まれます。

    このモデルのステップ関数プレビューは次のようになります。

    sldemo_mdlref_counter_paramargsModelClass :: step ( arg_input, * arg_output )

    生成されるコードの関数プロトタイプはプレビューとは異なります。生成されるコードのプロトタイプ (追加のモデル パラメーター引数を含む) は次のようになります。

    sldemo_mdlref_counter_paramargsModelClass::step (
       real_T arg_input,
       real_T *arg_output,
       real_T rtp_lower_saturation_limit,
       real_T rtp_upper_saturation_limit)
    
  • 検証

    現在のモデル ステップ関数の設定を検証します。[検証] ペインにステータスとエラーの説明が表示されます。

I/O 引数の受け渡し-  [関数の仕様] メニューで [I/O 引数 step メソッド] が選択された場合、ダイアログ ボックスにはモデル クラスに I/O 引数スタイルの step メソッドを設定するためのビューが表示されます。

  • 既定のコンフィギュレーションを取得

    このボタンをクリックすると、カスタマイズの開始点として使用できる初期状態のインターフェイス設定を取得できます。

  • ステップ関数のプレビュー

    現在の設定内容に基づき、モデルのステップ関数のプロトタイプのプレビューが表示されます。設定を変更すると、プレビューは動的に更新されます。

  • 検証

    現在のモデル ステップ関数の設定を検証します。[検証] ペインにステータスとエラーの説明が表示されます。

[既定のコンフィギュレーションを取得] をクリックすると、ダイアログ ボックスに、初期状態のインターフェイス設定を示す [C++ クラス インターフェイスの設定] サブペインが表示されます。以下に例を示します。

  • step メソッド名

    メソッド名を既定値 step 以外のものに指定できます。

  • クラス名

    モデルのクラス名を既定値 modelModelClass 以外のものに指定できます。

  • 名前空間

    モデル クラスに名前空間を指定できます。指定した場合、その名前空間がモデル クラスの生成コードに出力されます。[名前空間] パラメーターは、C++ モデル クラスをスコープ化する手段を提供します。モデル参照階層内で、各参照モデルに異なる名前空間を指定できます。

  • 次数

    各引数の数値的位置が表示されます。[上] ボタンと [下] ボタンを使用して、引数の順序を変更します。

  • 端子名

    各引数の端子名が表示されます (このダイアログ ボックスを使用して設定することはできません)。

  • 端子タイプ

    各引数の端子タイプが InportOutport で表示されます (このダイアログ ボックスを使用して設定することはできません)。

  • カテゴリ

    各引数の引き渡しメカニズムが表示されます。引数の引き渡しメカニズムを変更するには、引数の [カテゴリ] メニューから [Value][Pointer][Reference] のいずれかを選択します。

  • 引数名

    各引数の名前が表示されます。引数の名前を変更するには、引数の [引数名] フィールドをクリックしてテキスト入力カーソルを配置し、新しい名前を入力します。

  • 型修飾子

    各引数の const 型修飾子が表示されます。引数の修飾子を変更するには、引数の [型修飾子] メニューから使用可能な値を選択します。可能な値は次のとおりです。

    • none

    • const (値)

    • const* (ポインターによって参照される値)

    • const*const (ポインターによって参照される値とポインターそのもの)

    • const & (参照によって参照される値)

ヒント

モデルに参照モデルが含まれ、参照モデルに指定されたステップ関数インターフェイスのルート入力引数の const 型修飾子が none に設定され、参照モデルの親のソース信号の修飾子が none 以外の値に設定されている場合、コード生成は const 型修飾子をソース信号から破棄する型キャストを生成することによって参照モデルのインターフェイス仕様を守ります。この動作をオーバーライドするには、参照モデルに const 型修飾子を追加します。

名前空間を使用した C++ モデル クラスのスコーピング

Embedded Coder® は、C++ クラスのコード インターフェイスのパッケージ化を使用して生成されたモデル クラスをスコープ化するために、名前空間の制御を提供しています。[C++ クラス インターフェイスの設定] ダイアログ ボックスで、[名前空間] パラメーターを使用してモデル クラスに名前空間を指定します。指定した場合、その名前空間がモデル クラスの生成コードに出力されます。モデル参照階層内の C++ モデル クラスをスコープ化するには、参照モデルごとに異なる名前空間を指定することができます。

名前空間の制御の例については、モデル例 rtwdemo_cppclass を参照してください。このモデルでは、名前空間が次のように割り当てられています。

  • 最上位モデル rtwdemo_cppclass には TopNS

  • 参照モデル rtwdemo_cppclass_refmid には MiddleNS

  • 参照モデル rtwdemo_cppclass_refbot には BottomNS

既定の設定でモデルをビルドすると、各モデルに対して生成されるヘッダー ファイルとソース ファイルを調べて、名前空間がどこに出力されるか確認できます。たとえば、モデル rtwdemo_cppclass_refmid[名前空間] の設定を以下に示します。その後に、このモデルのヘッダー ファイルとソース ファイルに出力された名前空間コードの抜粋を示します。

42   // Class declaration for model rtwdemo_cppclass_refmid
43   namespace MiddleNS {
44     class MiddleClass {
45       // public data and function members
46      public:
47       // Model entry point functions
...
52       // model step function
53       void StepMethod(const real_T *arg_In1, const real_T &arg_In2, real_T
54                       *arg_Out1, real_T *arg_Out2);
...
87     };
88   }
15   #include "rtwdemo_cppclass_refmid.h"
16   #include "rtwdemo_cppclass_refmid_private.h"
17   
18   namespace MiddleNS
19   {
20     // Model step function
21     void MiddleClass::StepMethod(const real_T *arg_In1, const real_T &arg_In2,
22       real_T *arg_Out1, real_T *arg_Out2)
23     {
...
43     }
...
83   }

非バーチャル サブシステムの C++ クラス インターフェイスの設定

次の要件が満たされている場合、Simulink モデルで、非バーチャル サブシステムの右クリックによるビルドで C++ クラス インターフェイスを設定できます。

  • モデルは [C++] 言語と [C++ クラス] コード インターフェイスのパッケージ化用に構成されています。

  • サブシステムは関数 Model を使用して Simulink.SubSystem.convertToModelReference ブロックに変換可能です。参照モデルの変換要件は、Simulink のリファレンス ページ Simulink.SubSystem.convertToModelReference を参照してください。

要件を満たすサブシステムの C++ クラス インターフェイスを構成するには、以下を実行します。

  1. 含まれているモデルを開いて Subsystem ブロックを選択します。

  2. 次の MATLAB® コマンドを入力します。

    RTW.configSubsystemBuild(gcb)

    ここで、gcb は Simulink 関数 gcb で、現在のブロックの絶対ブロック パス名を返します。

    このコマンドは、前の節モデル クラスへの step メソッドの設定で詳しく説明した [C++ クラス インターフェイスの設定] ダイアログ シーケンスに相当するサブシステムを開きます (MATLAB コマンドの使い方の詳細については、RTW.configSubsystemBuild を参照してください)。

  3. [C++ クラス インターフェイスの設定] ダイアログ ボックスを使用して、サブシステムの C++ クラスの設定を行います。

  4. サブシステムを右クリックし、[C/C++ コード][このサブシステムをビルド] を選択します。

  5. サブシステムのビルドが完了した後、生成されたファイル内の C++ クラス インターフェイスと HTML コード生成レポートを調べることができます。

プログラムによる C++ クラス インターフェイスのカスタマイズ

モデルで [コード インターフェイスのパッケージ化] オプションの [C++ クラス] を選択すると、C++ クラス インターフェイス制御関数 (C++ クラス インターフェイス コントロール関数に一覧を記載) を使用して、プログラムによりモデル クラスの step メソッドを設定できます。

これらの関数の一般的な使用法には以下が含まれます。

  • Simulink モデルの既定の設定情報を開始点として、新しい step メソッド インターフェイスを作成して検証する

    1. obj = RTW.ModelCPPDefaultClass または obj = を使用してモデル固有の C++ クラス インターフェイスを作成します。ここで obj は、新しく作成された空の C++ クラス インターフェイスへのハンドルを返します。

    2. attachToModel を使用して、読み込まれた ERT ベースの Simulink モデルに C++ クラス インターフェイスを追加します。

    3. getDefaultConf を使用して、モデルから既定の C++ クラス インターフェイス設定情報を取得します。

    4. C++ クラス インターフェイス コントロール関数にリストされている関数 GetSet を使用して、モデルのクラス名とモデルの step メソッド名をテストまたはリセットします。さらに、I/O 引数スタイルの step メソッドを使用している場合、引数名、引数の位置、引数のカテゴリ、引数の型修飾子をテストおよびリセットできます。

    5. runValidation を使用して C++ クラス インターフェイスを検証します (検証に失敗した場合、runValidation によって返されるエラー メッセージ情報を使用して問題に対処してください)。

    6. モデルを保存してから、関数 rtwbuild を使用してコードを生成します。

  • Simulink モデル用の既存の step メソッド インターフェイスを変更して検証する

    1. 読み込まれた ERT ベースの Simulink モデルに付加されたモデル固有の既存の C++ クラス インターフェイスへのハンドルを obj = RTW.getClassInterfaceSpecification(modelName) を使用して取得します。ここで、modelName は読み込まれた ERT ベースの Simulink モデルの名前を指定する文字ベクトルであり、obj は指定されたモデルに付加された C++ クラス インターフェイスへのハンドルを返します。付加された C++ クラス インターフェイス設定をモデルがもっていない場合、関数は [] を返します。

    2. C++ クラス インターフェイス コントロール関数にリストされている関数 GetSet を使用して、モデルのクラス名とモデルの step メソッド名をテストまたはリセットします。さらに、返されたインターフェイスで I/O 引数スタイルの step メソッドが使用されている場合、引数名、引数の位置、引数のカテゴリ、および引数の型修飾子をテストしてリセットできます。

    3. runValidation を使用して C++ クラス インターフェイスを検証します (検証に失敗した場合、runValidation によって返されるエラー メッセージ情報を使用して問題に対処してください)。

    4. モデルを保存してから、関数 rtwbuild を使用してコードを生成します。

同じモデル固有の C++ クラス インターフェイス コントロール オブジェクトを複数のモデルで使用しないでください。使用する場合、あるモデルの step メソッド設定に対して行う変更が他のモデルに伝播します。通常、これは望ましくありません。

C++ クラス インターフェイス コントロール関数

関数説明
attachToModelモデル固有の C++ クラス インターフェイスを読み込まれた ERT ベースの Simulink モデルに付加
getArgCategoryモデル固有の C++ クラス インターフェイスから Simulink モデル端子の引数カテゴリを取得
getArgNameモデル固有の C++ クラス インターフェイスから Simulink モデル端子の引数名を取得
getArgPositionモデル固有の C++ クラス インターフェイスから Simulink モデル端子の引数の位置を取得
getArgQualifierモデル固有の C++ クラス インターフェイスから Simulink モデル端子の引数の型修飾子を取得
getClassNameモデル固有の C++ クラス インターフェイスからクラス名を取得
getDefaultConfモデル固有の C++ クラス インターフェイスの既定の設定情報を、そのインターフェイスが付加されている Simulink モデルから取得
getNamespaceモデル固有の C++ クラス インターフェイスから名前空間を取得
getNumArgsモデル固有の C++ クラス インターフェイスから step メソッドの引数の数を取得
getStepMethodNameモデル固有の C++ クラス インターフェイスから step メソッド名を取得
getPreviewモデル固有の C++ クラス インターフェイス ステップ関数プロトタイプのプレビューを取得
RTW.configSubsystemBuild指定されたサブシステムを右クリックでビルドできるように、GUI を開いて C 関数プロトタイプまたは C++ クラス インターフェイスを設定
RTW.getClassInterfaceSpecificationモデル固有の C++ クラス インターフェイス コントロール オブジェクトへのハンドルを取得
runValidationモデル固有の C++ クラス インターフェイスを、そのインターフェイスが付加されている Simulink モデルに対して検証
setArgCategoryモデル固有の C++ クラス インターフェイスで Simulink モデル端子の引数カテゴリを設定
setArgNameモデル固有の C++ クラス インターフェイスで Simulink モデル端子の引数名を設定
setArgPositionモデル固有の C++ クラス インターフェイスで Simulink モデル端子の引数の位置を設定
setArgQualifierモデル固有の C++ クラス インターフェイスで Simulink モデル端子の引数の型修飾子を設定
setClassNameモデル固有の C++ クラス インターフェイスでクラス名を設定
setNamespaceモデル固有の C++ クラス インターフェイスで名前空間を設定
setStepMethodNameモデル固有の C++ クラス インターフェイスで step メソッド名を設定

モデル クラスの step メソッドの設定

次のサンプル MATLAB スクリプトでは、C++ クラス インターフェイス コントロール関数を使用して、rtwdemo_counter モデル クラスの step メソッドを設定します。

%% Open the rtwdemo_counter model
rtwdemo_counter

%% Select ert.tlc as the System Target File for the model
set_param(gcs,'SystemTargetFile','ert.tlc')

%% Select C++ as the target language for the model
set_param(gcs,'TargetLang','C++')

%% Set required option for I/O arguments style step method (cmd off = GUI on)
set_param(gcs,'ZeroExternalMemoryAtStartup','off')

%% Create a C++ class interface using an I/O arguments style step method
a=RTW.ModelCPPArgsClass

%% Attach the C++ class interface to the model
attachToModel(a,gcs)

%% Get the default C++ class interface configuration from the model
getDefaultConf(a)

%% Move the Output port argument from position 2 to position 1
setArgPosition(a,'Output',1)

%% Reset the model step method name from step to StepMethod
setStepMethodName(a,'StepMethod')

%% Change the Input port argument name, category, and qualifier
setArgName(a,'Input','inputArg')
setArgCategory(a,'Input','Pointer')
setArgQualifier(a,'Input','const *')

%% Validate the function prototype against the model
[status,message]=runValidation(a)

%% if validation succeeded, generate code and build
if status
    rtwbuild(gcs)
end

モデル クラスのコピー コンストラクターと代入演算子

コード生成では、ポインター メンバーを安全に処理するために必要な場合に、コピー コンストラクターと代入演算子が C++ クラス宣言に自動的に追加されます。次の条件がどちらも存在する場合、コンストラクターと演算子はプライベート メンバー関数として追加されます。

  • モデル コンフィギュレーション パラメーター [Model ブロックのインスタンス化に動的メモリ割り当てを使用] が設定されている。

  • ベース モデルに Model ブロックが含まれている。Model ブロックは、ブロック パラメーター [関数のパッケージ化][再利用可能な関数] に設定されているサブシステム内に直接的または間接的に存在しません。

こうした状況下では、ソフトウェアはプライベートなコピー コンストラクターと代入演算子を生成し、モデル クラス内のポインター メンバーが他のコードによってコピーされるのを防ぎます。

これらの関数の生成を回避するには、パラメーター [Model ブロックのインスタンス化に動的メモリ割り当てを使用] をクリアすることを検討してください。

下のコード例は、ポインター メンバーをもつモデル クラス用に生成された model.h コードを示しています (MiddleClass_ptr のインスタンスを検索)。コピー コンストラクターおよび代入演算子の宣言は太字で表示されています。

class MiddleClass;    // class forward declaration for <S1>/Bottom model instance
typedef MiddleClass* MiddleClass_ptr;
...

// Class declaration for model cppclass_top
class Top {
...
  // private data and function members
 private:
  // Block signals
  BlockIO_cppclass_top cppclass_top_B;

  // Block states
  D_Work_cppclass_top cppclass_top_DWork;

  // Real-Time Model
  RT_MODEL_cppclass_top cppclass_top_M;

  // private member function(s) for subsystem '<Root>/Subsystem'
  void cppclass_top_Subsystem_Init();
  void cppclass_top_Subsystem_Start();
  void cppclass_top_Subsystem();

  //Copy Constructor
  Top(const Top &rhs);

  //Assignment Operator
  Top& operator= (const Top &rhs);

  // model instance variable for '<S1>/Bottom model instance'
  MiddleClass_ptr Bottom_model_instanceMDLOBJ1;
};

C++ クラス インターフェイス コントロールの制限

  • スカラー出力が値で渡され、条件付き実行コンテキストで更新されるカスタム モデル ステップ関数がモデルに存在する場合、出力がポインターで渡されるように設定します。モデルの [C++ クラス インターフェイスの設定] ダイアログ ボックスで、[カテゴリ][Pointer] に設定します。条件付き実行コンテキストの例には次が含まれます。

    • モデルが参照モデルとして使用される場合、出力のサンプル時間はモデルの基本レートより遅くなる。

    • 条件付き実行サブシステムは出力を変更する。

    • S-Function は出力を変更する。

    • Hit Crossing ブロックは出力を変更する。

    • Rate Transition ブロックは出力を変更する。

  • モデル コンフィギュレーション パラメーター [コード インターフェイスのパッケージ化][C++ クラス] 値は一部の Simulink モデル コンフィギュレーション パラメーターをサポートしません。[C++ クラス] を選択することで次のパラメーターが無効になります。

    • [Identifier] ペインの [識別子の書式の制御] サブペイン

    • [テンプレート] ペインの [ファイル カスタマイズ テンプレート] パラメーター

      [テンプレート] ペインのコードとデータのテンプレートは [C++ クラス] コード生成でサポートされます。ただし、次のテンプレート ファイルの機能は他の言語選択ではサポートされますが、C++ クラスの生成コードではサポートされません。

      • テンプレート セクション外での自由形式テキスト

      • カスタム トークン

      • TLC コマンド (<! > トークン)

    • [コード配置] ペインの [グローバル データ配置] サブペイン

    [C++ クラス] を選択することで、コード マッピング エディターも無効になります (Configure Default C Code Generation for Categories of Data Elements and Functionsを参照)。既定のストレージ クラス、メモリ セクション、または関数テンプレートをモデルに適用することはできません。

  • [コンフィギュレーション パラメーター] ダイアログ ボックスの [インターフェイス] ペインで使用可能なデータ交換インターフェイスの中で、[C++ クラス] のコード生成には C API インターフェイスのみがサポートされます。[エクスターナル モード] または [ASAP2 インターフェイス] を選択した場合は、コード生成が検証エラーで失敗します。

  • step メソッド仕様の I/O 引数スタイルはシングルレート モデルとマルチレート シングルタスク モデルをサポートしますが、マルチレート マルチタスク モデルはサポートしません。

  • Stateflow® ライセンスをお持ちの場合、[I/O 引数 step メソッド] の関数仕様を使用するように設定されたルート モデルに存在し、モデルのルート Inport 値を使用するかモデルのルート Inport 値を使用するサブシステムを呼び出す Stateflow チャートに対しては、次のいずれかを実行してコードを生成します。

    • Stateflow チャートで、[初期化時に指定されたチャートを実行 (入力)] チェック ボックスをオフにします。

    • Simulink Signal Conversion ブロックをルート Inport の直後に挿入します。Signal Conversion ブロック パラメーターのダイアログ ボックスで、['ブロック削減' の最適化からこのブロックを排除する] を選択します。

  • モデルのルート Inport の値が Simscape™ 変換ブロックに接続されている場合、Simulink Signal Conversion ブロックをルート Inport と Simscape 変換ブロックの間に挿入します。Signal Conversion ブロック パラメーターのダイアログ ボックスで、['ブロック削減' の最適化からこのブロックを排除する] を選択します。

  • C++ クラス インターフェイスを生成するように設定されている参照モデルをビルドする際、次のとおりです。

    • 組み合わせた出力/更新関数を参照モデルがもつことができない場合には、C++ クラス インターフェイスを使用しないでください。これには連続サンプル時間をもつか、状態を保存するモデルが含まれます。

    • 参照モデルが I/O 引数 step メソッドを使用する場合は、参照モデルに対する入力または出力としてバーチャル バスを使用しないでください。バス信号が参照モデルの境界を越える場合は、非バーチャル バスを使用するか、既定の step メソッドを使用してください。

  • C++ カプセル化インターフェイスが既定ではない場合、その値は [コード生成で固定サイズのスカラーのルート入力を値渡しで行う] パラメーターで無視されます。詳細については、コード生成で固定サイズのスカラーのルート入力を値渡しで行うを参照してください。

C コードで呼び出される生成された C++ コードへのインターフェイスのカスタマイズ

モデルから生成した C++ コードを C コードまたは C++ コードから呼び出すためのインターフェイスをカスタマイズします。C++ コードを C コードから呼び出すには、生成コードで C++ クラス インターフェイスをカプセル化します。

カスタムの C++ カプセル化インターフェイスをもつモデルを構成します。

新しいモデルで開始する場合、次のようにします。

  1. 少なくとも 1 つの入力端子と少なくとも 1 つの出力端子をもつモデルを作成します。

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

  3. モデル コンフィギュレーション パラメーター [言語]C++ に設定します。

  4. モデル コンフィギュレーション パラメーター [コード インターフェイスのパッケージ化] を [C++ class] に設定します。

  5. [モデル コンフィギュレーション パラメーター] ダイアログ ボックスの [コード生成]、[インターフェイス] ペインで、[C++ クラス インターフェイスの設定] をクリックします。必要に応じてインターフェイスをカスタマイズします。生成される C++ クラス インターフェイスのカスタマイズを参照してください。

C++ カプセル化インターフェイスについて

生成される C++ クラスによって、モデルのデータとメソッドがカプセル化されます。Embedded Coder® を使用すると、モデルに依存しないコンフィギュレーション パラメーターとモデル固有のコンフィギュレーションによって、カプセル化インターフェイスを構成可能になります。このインターフェイスは、2 種類のモデル step メソッド インターフェイス、つまり既定の step メソッドと I/O 引数の step メソッドをサポートしています。I/O 引数スタイル インターフェイスを使用して、step メソッド プロトタイプをカスタマイズします。既定の step メソッド スタイル インターフェイスを使用して、モデル境界を越えるバーチャル バスやマルチタスク インターフェイスなど、サポート対象の機能セットを最大限にします。

open_system('rtwdemo_cppclass');

コード生成

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

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

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

  4. コードを生成します。

  5. 生成されたソース コードを確認します。少なくとも、rtwdemo_cppclass.cpp ファイルの中のカスタマイズされたモデル ステップおよび初期化クラス ModelClass::step_method および ModelClass::initialize を確認します。

  6. インターフェイス設定を表示します。モデル内で、[View Interface Configuration] というラベルの付いた黄色のボタンをダブルクリックします。あるいは、[モデル コンフィギュレーション パラメーター] ダイアログ ボックスの [コード生成][インターフェイス] ペインで、[C++ クラス インターフェイスの設定] をクリックします。ステップ関数のカスタマイズされた引数と、それらの引数が生成コードにどのように関係しているかを確認します。

既定の引数への変更とモデルのリビルド

新しいモデルで開始する場合、C++ クラス インターフェイスに初期コンフィギュレーションを与えます。

  1. [モデル インターフェイス] ダイアログ ボックスで [既定のコンフィギュレーションを取得] をクリックします。

  2. [モデル インターフェイス] ダイアログ ボックスを閉じます。

  3. [モデル コンフィギュレーション パラメーター] ダイアログ ボックスを閉じます。

  4. コードを生成します。

  5. コード生成レポートを使用して、ファイル rtwdemo_cppclass.cpp 内にあるカスタマイズされたモデル ステップと初期化クラス ModelClass::step_method および ModelClass::initialize を検証します。ステップ関数の既定の引数と、それらの引数が生成コードにどのように関係しているかを確認します。

カスタム引数の適用とモデルのリビルド

  1. モデル内で、[View Interface Configuration] というラベルの付いた黄色のボタンをダブルクリックします。あるいは、[モデル コンフィギュレーション パラメーター] ダイアログ ボックスの [コード生成][インターフェイス] ペインで、[C++ クラス インターフェイスの設定] をクリックします。

  2. [C++ クラス インターフェイスの設定] ダイアログ ボックスで、端子名 Out1 を順序の一番上に移動させ、その [カテゴリ]Value に設定します。

  3. [C++ クラス インターフェイスの設定] ダイアログ ボックスを閉じます。

  4. [モデル コンフィギュレーション パラメーター] ダイアログ ボックスを閉じます。

  5. コードを生成します。

  6. 生成されたファイル rtwdemo_cppclass.cpp で、カスタマイズされたモデル ステップと初期化クラス ModelClass::step_method および ModelClass::initialize を検証します。カスタム引数が生成コードに表示されることを確認します。

既定のインターフェイス (最大のサポート) と I/O 引数インターフェイスの比較

rtwdemo_cppclass モデルには、C++ クラスのインターフェイスの関数仕様を、既定の step メソッド (マルチタスク モード) と I/O 引数の step メソッドとの間で切り替えるボタンが用意されています。

  1. [Use Default Interface in MultiTasking Mode] というラベルの付いた黄色のボタンをダブルクリックして、既定の step メソッドの関数仕様を設定します。

  2. コードを生成します。

  3. 生成されたコード内で、モデル ステップと初期化クラスを検証します。

  4. [Use I/O Arguments Interface] というラベルの付いた黄色のボタンをダブルクリックして、I/O 引数の step メソッドの関数仕様を設定します。

  5. コードを生成します。

  6. 生成されたコード内で、モデル ステップと初期化クラスを検証します。

参照モデルをもつ C++ クラス インターフェイスの適用

rtwdemo_cppclass_refmid モデルは、モデル例 rtwdemo_cppclass 内の参照モデルです。この参照モデルでは、モデル参照階層にある参照モデル用に生成されたコードへのカスタマイズ可能な C++ クラス インターフェイスを生成する方法を説明します。

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

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

  3. Subsystem_with_MdlRef_blks ブロックをダブルクリックします。次に、middle_instance_1 ブロックをダブルクリックします。

  4. rtwdemo_cppclass_refmid モデルのインターフェイス設定を表示します。[View Interface Configuration] というラベルの付いた黄色のボタンをダブルクリックします。あるいは、[モデル コンフィギュレーション パラメーター] ダイアログ ボックスの [コード生成][インターフェイス] ペインで、[C++ クラス インターフェイスの設定] をクリックします。参照モデルのクラス インターフェイスの構成が最上位モデルのクラス インターフェイスと異なることを確認します (たとえば、名前空間が異なるなど)。

open_system('rtwdemo_cppclass_refmid');

モデル参照階層での混合 C/C++ インターフェイス スタイルの適用

rtwdemo_cppclass_refc モデルは、モデル例 rtwdemo_cppclass 内の参照モデルです。この参照モデルでは、モデル参照階層内で混合インターフェイス スタイルを使用する方法を説明します。このモデルは、同じモデルの階層構造内の他のモデルが C++ クラス インターフェイスを使用している場合でも、(C++ コンパイラでコンパイルされる) C コード インターフェイス スタイルを使用します。

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

  2. Subsystem_with_MdlRef_blks ブロックをダブルクリックします。次に、ref_c_instance ブロックをダブルクリックします。

  3. Embedded Coder アプリを開きます。最上位モデル rtwdemo_cppclass 用またはアクティブ モデル rtwdemo_cppclass_refc 用のコードを生成するかどうかを確認するダイアログ ボックスが表示されます。

  4. [アクティブ モデルを最上位モデルとして開く] ボタンをクリックします。

  5. モデル rtwdemo_cppclass_refc 用に開かれる Simulink エディター ウィンドウで、Embedded Coder アプリを開きます。

  6. モデル コンフィギュレーション パラメーター [コード インターフェイスのパッケージ化] の設定を確認します。[再利用できない関数] (C 関数のプロトタイプ) に設定されています。次に、[モデル コンフィギュレーション パラメーター] ダイアログ ボックスを閉じます。

  7. [コード マッピング - C] タブをクリックします。

  8. コード マッピング エディターで、[Functions] タブをクリックします。

  9. コード マッピングの更新ボタンをクリックします。

  10. ステップ関数の関数プロトタイプのプレビューがテーブルに表示されます。

  11. モデルを閉じます。

open_system('rtwdemo_cppclass_refc');

詳細

詳細と制限については、Embedded Coder® ドキュメンテーションの生成される C++ クラス インターフェイスのカスタマイズを参照してください。