データ構成アプローチの選択
モデルからコードを生成すると、信号、状態、パラメーターなどの設計データがコードに含まれ、アプリケーション コードから読み取りや書き込みを行うことができます。このデータを生成コードでどのように表現するかを決める際は、次の点について検討します。
モデルでどのタイプのデータ要素を使用するか
データをどこに格納するか
コード生成の目的は何か
データをどのように構成すればコード生成の目的を満たせるか
これらの問いに対する答えは、モデルのアーキテクチャ (スタンドアロン モデル、スタンドアロンの参照モデル階層、または複数コンポーネントのシステム)、アプリケーションのタイプ (再呼び出し可能または単一インスタンス)、およびコードを既存の外部コードと統合しているかどうかによって異なります。
データ要素のカテゴリ
モデルに含まれる可能性があるデータ要素は、次の表にリストされたデータ要素のタイプに分類されます。
| データ要素のタイプ | 説明 |
|---|---|
| Inports | Inport ブロックや Bus Element In ブロックなど、モデルのルートレベルの入力端子。 |
| Outports | Outport ブロックや Bus Element Out ブロックなど、モデルのルートレベルの出力端子。 |
| モデルスコープのパラメーター |
|
| 外部パラメーター | ベース ワークスペースまたはデータ ディクショナリ内でオブジェクトとして定義するパラメーター。アプリケーションの複数のモデルがこれらのパラメーターを使用できます。 |
| データ ストア |
|
| 内部データ | 内部信号やブロック状態などのローカル データ。ローカル データ ストアも含まれます。 |
| 定数 | モデル内の定数パラメーターと定数値のブロック出力。 |
データに使用できるコード構成オプションは、構成するデータのカテゴリに依存します。データを格納する場所によって、データ オブジェクトを使用して構成するか、モデルと共に保存されているコード マッピングを使用して構成するかが決まります。
モデルで使用するデータ要素の格納場所
モデルのデータを格納する場所は、使用しているモデルのアーキテクチャやモデル化の目的に応じて選択できます。
MATLAB® ベース ワークスペース — モデル化手法を試す際にデータの一時的なストレージとして使用します。
モデル ワークスペース — 単一のモデルのローカルなデータを永続的に格納するために使用します。データがモデルと共に格納されるため、このワークスペースを使用するとモデルの移植性が向上します。モデル ワークスペースは、パラメーター、引数、数値変数の格納に主に使用されます。次の要素は、一般にモデル ワークスペースには格納されません。
信号オブジェクト — モデル ワークスペースの信号オブジェクトはコード生成用に構成できません。コード生成用に信号を構成するために信号オブジェクトを定義する必要はありません。
データ型オブジェクト。
Simulink® データ ディクショナリ — グローバル データ、データ型、およびモデル間で共有されるデータを永続的に格納するために使用します。
詳細については、Simulink モデルの変数とオブジェクトの保存場所の決定を参照してください。
コード生成用にデータ要素を構成する状況
コード生成用にデータの生成をカスタマイズするかどうかは、生成コードの目的によって決まります。カスタマイズを構成しない場合、コード ジェネレーターは生成されたコード内のデータの表現を最適化目的で削除するか変更するかを判断します。
データ項目を構成することを選ぶ理由はいくつかあります。データを構成すると、データ項目が最適化によって生成コードから削除される可能性を防止したり、データ項目を生成コードでどのように格納および定義するかを構成したりできます。たとえば、データ項目を構成すると次のことができます。
パラメーターを調整する。
実行中に信号や状態を監視する。
データのメモリ内の配置を構成する。
データを外部コードとの間で交換する。
生成コードの可読性とトレーサビリティを高める。
コード生成用のデータ要素の構成
コード生成用にデータを構成するには、ストレージ クラスを適用します。ストレージ クラスは、生成コード内でのデータ要素の外観や配置を制御したり、そのデータ要素のストレージが最適化によって削除される可能性を防止したりできるコード生成設定です。Simulink Coder™ および Embedded Coder® で利用できるストレージ クラスを使用できます。それらのストレージ クラスでは満たされない特別な要件があり、ERT ベースのターゲット向けのコードを生成している場合、新しいストレージ クラスを定義して使用できます。ストレージ クラスおよびストレージ クラスのプロパティの詳細については、生成されたコードでのデータ表示を制御するストレージ クラスの選択を参照してください。
データ オブジェクトを使用してデータを構成する状況
モデルが保有するほとんどのデータについては、コード マッピング エディターまたはコード マッピング API を使用してストレージ クラスをデータ項目に直接マッピングできます。モデルで使用する一部のデータについては、コード生成用に構成する際にデータ オブジェクトを使用する必要があります。これには以下が含まれます。
パラメーター — ベース ワークスペース、モデル ワークスペース、またはデータ ディクショナリのパラメーターが含まれます。パラメーターは
Simulink.Parameterオブジェクトを使用して構成します。グローバル データ ストア — 信号オブジェクトを使用して構成します。
コード生成用に数値変数を構成する場合は、その前に Simulink.Parameter オブジェクトに変換する必要があります。
モデルが保有するデータのコード マッピングを使用した構成
モデルが保有するデータは、Outport ブロック、信号線、ブロック状態、およびモデル ワークスペース内のパラメーター オブジェクトで構成されます。このデータについては、Coder アプリでコード マッピング エディターを使用するかコード マッピング API を使用してストレージ クラスをデータ項目にマッピングできます。便宜上、外部データ オブジェクトもコード マッピング エディターで構成できますが、外部データ オブジェクトについては、モデルではなくデータ オブジェクトにストレージ クラスが格納されます。これらのオブジェクトを表示するには、エディターでカテゴリ名の右側にある [リフレッシュ] リンクをクリックします。
モデルが保有するデータを構成するには、最初にデータ要素のカテゴリに対する既定のコード生成設定を構成します。既定のマッピングを使用すると、特定のカテゴリの要素を多数含むモデルの場合は特に、時間が節約でき、コードでエラーが発生するリスクを抑えることができます。
[C コード] タブで、[コード インターフェイス]、[既定のコード マッピング] を選択します。
[データの既定の設定] タブで、データのカテゴリを選択し、そのカテゴリに対する既定のストレージ クラスを選択します。カテゴリに対してストレージ クラスを指定しない場合、
Defaultストレージ クラスが適用されます。この場合、コード ジェネレーターはデータ要素のカテゴリのコードを標準の構造体に配置します。他のストレージ クラスのオプションには以下が含まれます。ExportedGlobalなど、関連する組み込みのストレージ クラス。ImportFromFileなど、利用可能なパッケージ内の関連するストレージ クラス (Embedded Coder が必要です)。Embedded Coder ディクショナリで定義されたストレージ クラス (Embedded Coder が必要です)。使用できるストレージ クラスの詳細については、生成されたコードでのデータ表示を制御するストレージ クラスの選択を参照してください。
プロパティ インスペクターで、そのストレージ クラスのプロパティを構成します。(たとえば、ヘッダー ファイルや定義ファイルなど)。
詳細については、C Data Code Interface Configuration for Model Interface Elementsを参照してください。
入力端子、出力端子、データ ストア、ブロック状態など、特定のカテゴリのデータについては、既定のマッピングだけ構成すれば、ほとんどの場合、それ以外の構成は必要ありません。ただし、パラメーターや内部信号などのデータ要素については、データが最適化によって削除されるのを防ぐために個別のマッピングの指定が必要になることがあります。個々のデータ要素にストレージ クラスを適用するには、次のようにします。
コード マッピング エディターの対応するカテゴリのタブでデータ要素を見つけます (たとえば、個々のパラメーターを構成するには [パラメーター] タブを選択します)。
データ要素のストレージ クラスを選択します。既定の構成を適用するには、ストレージ クラス
[Model default]を選択します。プロパティ インスペクターで、そのストレージ クラスのプロパティを構成します。(たとえば、ヘッダー ファイルや定義ファイルなど)。
詳細については、C Data Code Interface Configuration for Model Interface Elementsを参照してください。
外部データの構成
コード マッピング エディターまたはモデル エクスプローラーを使用して、コード生成用に外部データ オブジェクトを構成します。[コンテンツ] ペインでデータ オブジェクトを選択します。次に、[ダイアログ] ペインの [コード生成] タブで、ストレージ クラスを選択し、そのストレージ クラスのプロパティを設定します。便宜上、外部データ オブジェクトもコード マッピング エディターで構成できます。これらのオブジェクトを表示および構成するには、エディターでカテゴリ名の右側にある [リフレッシュ] リンクをクリックします。
外部データ オブジェクトはプログラムで構成できます。たとえば、ストレージ クラス ExportedGlobal を適用してコード生成用に Simulink.Parameter オブジェクトを構成するには、次のようなコードを使用できます。
P = Simulink.Parameter; P.Value = 5; P.DataType = 'int32'; P.CoderInfo.StorageClass = 'ExportedGlobal';
Embedded Coder ディクショナリへのストレージ クラス パッケージの読み込み
Simulink 以外のストレージ クラス パッケージ (作成したパッケージなど) からストレージ クラスを適用するには、次のようにします。
Embedded Coder アプリを開きます。
Embedded Coder ディクショナリを開きます。[C コード] タブで [コード インターフェイス] 、 [Embedded Coder ディクショナリ] を選択します。
Embedded Coder ディクショナリで、[ストレージ クラス] をクリックします。
[ストレージ クラス] のテーブルの下にある [パッケージの管理] をクリックします。
[パッケージの管理] ダイアログ ボックスで、パッケージを選択します。目的のパッケージがリストにない場合は、[リフレッシュ] をクリックします。次に、パッケージを選択します。
[読み込み] をクリックします。
Embedded Coder ディクショナリを閉じます。
コード マッピング エディターまたはコード マッピング API を使用して、モデルのインターフェイス要素を構成します。
詳細については、Embedded Coder ディクショナリ、コード マッピング エディター – C、および coder.mapping.api.CodeMapping を参照してください。
データ オブジェクト (必須パラメーター) を使用してストレージ クラスを適用するには、Simulink.Signal オブジェクトまたは Simulink.Parameter オブジェクトを作成する代わりに、myPackage.Signal オブジェクトまたは myPackage.Parameter オブジェクトを作成します。パッケージからデータ オブジェクトを作成するには、他のデータ クラス パッケージからのデータ オブジェクトの作成を参照してください。独自のストレージ クラスを作成して適用する方法を示す例については、ユーザー定義パッケージで定義されたストレージ クラスの作成と適用を参照してください。
参考
コード マッピング エディター – C | coder.mapping.api.CodeMapping