Main Content

ブロック パラメーターのデータ型の制御

Gain ブロックの [ゲイン] パラメーターなどのブロック パラメーターは、信号がデータ型をもつのと同じようにデータ型をもちます (信号のデータ型の制御を参照)。ブロック パラメーター値の設定に使用する MATLAB® 変数、Simulink.Parameter オブジェクト、および他のパラメーター オブジェクトもデータ型をもちます。ブロック パラメーターのデータ型を制御して、次を可能にします。

  • ハードウェアでの制御アルゴリズムの実行を正確にシミュレーションできる。

  • 効率的なコードを生成できる。

  • 生成されたコードをカスタム コードと統合できる。

  • ターゲットのハードウェアでサポートされないデータ型の使用を回避できる。

データ型の継承による保守労力の軽減

既定では、ブロック パラメーター、データ型 double を使用する数値 MATLAB 変数、および Simulink.Parameter オブジェクトは、継承された状況依存のデータ型指定によりデータ型を取得します。たとえば、Gain ブロックの入力信号と出力信号がデータ型 single を使用する場合、[ゲイン] パラメーターは通常同じデータ型を使用します。Simulink.Parameter オブジェクトを使用して、ブロック パラメーターの値を設定する場合、既定ではオブジェクトがパラメーターと同じデータ型を使用します。この継承を利用して、パラメーターのデータ型を明示的に指定するのを回避できます。

一部の継承ルールでは、対応する信号が使用するデータ型以外のパラメーターのデータ型が選択されます。たとえば、次の場合を仮定します。

  • Gain ブロックの入力信号と出力信号は、2 進小数点のみのスケーリングで固定小数点データ型を使用する。

  • [パラメーター属性] タブで、[パラメーターのデータ型][継承: 内部ルールによる継承] (既定) に設定します。

  • [パラメーター属性] タブで、[パラメーターの最小値] および [パラメーターの最大値] を使用してパラメーターの最小値と最大値を指定している。

データ型設定 [継承: 内部ルールによる継承] により、ブロックでは、信号が使用するデータ型とは異なるデータ型を、異なる語長またはスケーリングで選択できます。パラメーターに指定した最小値と最大値は、ブロックが選択するスケーリングに影響します。

内部ルール ([継承: 内部ルールによる継承]) を選択して Simulink® でのデータ型の選択を有効にする場合は、シミュレーションまたはコードの生成前に、ターゲット ハードウェアの特性を設定します。内部ルールでは、これらの設定を使用して、効率的な生成コードを生成するデータ型を選択できます。

状況依存データ型指定

MATLAB 変数または Simulink.Parameter オブジェクトを使用してブロック パラメーターの値を設定する場合は、"状況依存" データ型指定を使用するように変数またはパラメーター オブジェクトを設定できます。シミュレーションまたはコードの生成を実行する場合、変数またはパラメーター オブジェクトはブロック パラメーターと同じデータ型を使用します。この手法では、変数またはパラメーター オブジェクトのデータ型をブロック パラメーターのデータ型と一致させることができます。ブロック パラメーターおよび変数またはオブジェクトのデータ型を制御するには、ブロック パラメーターのデータ型のみを指定します。

状況依存データ型指定を使用するには、MATLAB 変数の値を double 値に設定します。Simulink.Parameter オブジェクトの場合は、double 値を使用して Value プロパティを設定し、DataType プロパティを auto (既定値) に設定します。

構造体フィールドに対する状況依存データ型指定

関連するブロック パラメーター定義を構造体に整理で説明したように、複数のブロック パラメーター値を 1 つの構造体に整理することができます。

パラメーター構造体のフィールドでは、状況依存データ型指定はサポートされません。しかし、フィールドのデータ型をモデル内の別のデータ項目のデータ型と一致させるため、バス オブジェクトとデータ型オブジェクトを使用できます。

  1. Simulink.Bus オブジェクトを構造体のデータ型として使用します。

  2. Simulink.AliasType オブジェクトまたは Simulink.NumericType オブジェクトを、バス オブジェクトの要素のデータ型およびターゲット データ項目のデータ型として使用します。

パラメーターのデータ型を明示的に指定する手法

離散時間シミュレーションとコード生成でサポートされる多くのブロック (組み込みの Discrete ライブラリのブロックなど) を使って、パラメーターのデータ型を明示的に指定できます。たとえば、n-D Lookup Table ブロックのダイアログ ボックスの [データ型] タブで、[テーブル データ] パラメーターを使用してルックアップ テーブル データのデータ型を指定できます。Gain ブロックのダイアログ ボックスで、[パラメーター属性] タブを使用して [パラメーターのデータ型] を設定します。これは [ゲイン] パラメーターのデータ型を制御します。

Continuous ライブラリ内のブロックなど、一部のブロックでは、パラメーターのデータ型を指定できません。これらのブロック パラメーターは内部ルールを使用してデータ型を選択します。このようなパラメーターのデータ型を間接的に制御するには、代わりにデータ型を Simulink.Parameter オブジェクトに適用します。

Simulink.Parameter オブジェクトまたは他のパラメーター オブジェクトを使用してブロック パラメーターの値を設定する場合は、オブジェクトの DataType プロパティを使用してデータ型を指定できます。

モデル引数を使用すると、次のデータ型を指定できます。

  • モデル ワークスペースに保存するモデル引数。

  • 一部のブロック (Discrete ライブラリのブロックなど) では、モデル引数を使用するブロック パラメーター。

  • Model ブロックで指定する引数値。

通常、これらのデータ型の既定の設定では継承と状況依存データ型指定を使用します。たとえば、Simulink.Parameter オブジェクトの DataType プロパティの既定値は auto です。この場合、パラメーター オブジェクトはオブジェクトを使用するブロック パラメーターからデータ型を取得します。

データ型を明示的に指定するには、ブロックのダイアログ ボックスとプロパティのダイアログ ボックスでデータ型アシスタントを使用できます。データ型アシスタントの詳細については、データ型アシスタントを利用したデータ型の指定を参照してください。

一括編集のためのモデル データ エディターの使用

モデル データ エディター ([モデル化] タブで [モデル データ エディター] をクリック) を使用して、複数のブロック パラメーターに同じデータ型を一度に指定できます。[パラメーター] タブで、[ビューの変更] ドロップダウン リストを [設計] に設定し、[データ型] 列を使用してデータ型を指定します。

詳細については、モデル データ エディターを参照してください。

調整可能なブロック パラメーターに最適な精度の固定小数点スケーリングの計算

モデルに固定小数点データ型を適用する際は、データ型アシスタントと固定小数点ツールを使用して、調整可能なブロック パラメーターに最高精度のスケーリングを計算できます。ブロック パラメーター、Simulink.Parameter オブジェクトまたはその他のパラメーター オブジェクトは、生成されたコードにメモリ内に格納されている変数として表示される場合は "調整可能" です。

選択されるスケーリングは、パラメーターに代入する値の範囲に対応しなければなりません。ツールで適切なスケーリングを計算できるようにするには、ブロックまたはパラメーター オブジェクトで範囲情報を指定します。その後、次のいずれかの方法を使用してスケーリングを計算します。

  • 固定小数点ツールを使用して、モデルまたはサブシステム全体をオートスケールします。このツールは、ブロック パラメーター、Simulink.Parameter オブジェクト、信号、状態などのデータ項目に対して固定小数点データ型を推奨して適用することができます。

  • それぞれのスケーリングを計算するように個々のブロック パラメーターまたはパラメーター オブジェクトを構成します。

    この手法を使用すると、後でパラメーターの値の範囲を変更した場合に、モデル全体をオートスケールせずにユーザーまたはモデルがスケーリングを再計算することができます。ただし、パラメーターの値の範囲を変更すると関連する信号の値の範囲も変わる場合は、信号の新しいスケーリングを手動で計算して適用するか、固定小数点ツールを使用してモデルまたはサブシステムをオートスケールしなければなりません。

固定小数点データ型、ブロック パラメーターおよびその他のツールや概念の基本情報については、次の表の情報を使用してください。

トピック詳細
固定小数点データ型とスケーリングSimulink における固定小数点数 (Fixed-Point Designer)
ブロック パラメーターとパラメーター オブジェクトの値の範囲情報を指定する方法ブロック パラメーターの最小値と最大値の指定
データ型アシスタントを使用する方法データ型アシスタントを利用したデータ型の指定
生成コードにおける調整可能性とブロック パラメーターの表現 生成されたコードによる内部信号、状態、パラメーター データの保存方法 (Simulink Coder)および生成されたコードにおける調整可能なキャリブレーション パラメーターの作成 (Simulink Coder)

固定小数点ツールを使用したモデル全体のオートスケーリング

固定小数点ツールを使用すると、モデル内のデータ項目をオートスケールできます。このデータ項目には、調整可能なパラメーターや、そのパラメーターに応じて異なる値をもつ信号が含まれます。この手法を使用する場合は、次のようにします。

  • パラメーターを調整可能に構成するには、[モデル パラメーター設定] ダイアログ ボックスではなくパラメーター オブジェクト (Simulink.Parameter など) を使用します。固定小数点ツールではパラメーター オブジェクトはオートスケールできますが、[モデル パラメーター設定] ダイアログ ボックスで選択した数値変数はオートスケールできません。

    モデルで既に [モデル パラメーター設定] ダイアログ ボックスを使用している場合は、代わりに、関数 tunablevars2parameterobjects を使用してパラメーター オブジェクトを作成します。

  • Simulink.Parameter オブジェクトを使用してブロック パラメーター値を設定するときは、ブロックではなくオブジェクトで値の範囲情報を指定します。固定小数点ツールは、各オブジェクトの範囲情報を使用して、そのオブジェクトのデータ型を推奨します。

  • 構造体のフィールドとして保存したパラメーター値をツールでオートスケールできるようにするには、Simulink.Bus オブジェクトを構造体全体のデータ型として使用します。バス オブジェクト内の対応する要素の Min プロパティと Max プロパティを使用して、各フィールドの範囲情報を指定します。これにより、ツールで DataType プロパティを使用して各要素にデータ型を適用できるようになります。

    バス オブジェクトをパラメーター構造体のデータ型として使用するには、パラメーター オブジェクトの作成によるフィールドのデータ型と特性の制御を参照してください。

  • 固定小数点ツールが推奨するデータ型を適用する前に、データ型がツールによって変更されないようにする必要があるパラメーターとパラメーター オブジェクトに対する推奨をクリアします。たとえば、次のエンティティに対する推奨をクリアします。

    • ImportedExtern などのストレージ クラスを適用してユーザー作成のコードから生成コードにインポートしたパラメーター オブジェクト。

    • モデル ワークスペース内の Simulink.Parameter モデル引数。

      あるいは、モデルのオートスケーリングを行う前に、これらのパラメーター オブジェクトを MATLAB 数値変数に置き換えて、固定小数点ツールによってオートスケーリングが実行されないようにすることを検討してください。

      ツールでモデル引数をオートスケールできるようにすると、モデル引数の値 (親モデル内の Model ブロックで指定した値)、モデル ワークスペース内のモデル引数、モデル内のクライアント ブロック パラメーターの間でデータ型の意図しない不一致が生じるリスクが高くなります。

    • DataType プロパティが auto (状況依存) に設定されているパラメーター オブジェクト。パラメーター オブジェクトで引き続き状況依存データ型指定を使用する場合は、推奨をクリアします。

固定小数点ツールを使用した Simulink.Parameter オブジェクトのオートスケーリングの詳細については、固定小数点ツールを使用したデータ オブジェクトのオートスケーリング (Fixed-Point Designer)を参照してください。

個々のパラメーターに最適な精度のスケーリングの計算

それぞれに最高精度のスケーリングを計算するようにブロック パラメーターまたは Simulink.Parameter オブジェクトを構成できます。まず、ターゲット パラメーターまたはパラメーター オブジェクトの値の範囲情報を指定します。次に、データ型アシスタントまたは関数 fixdt を使用して、パラメーターまたはオブジェクトにデータ型を適用します。これらの手法は、固定小数点ツールでモデルをオートスケールしない場合に使用します。

ブロック パラメーターによる最高精度のスケーリングの自動計算の有効化.  一部のブロック (通常は Discrete ライブラリ内のブロック) のパラメーターで、最高精度の固定小数点スケーリングが自動的に計算されるようにすることができます。この手法は、範囲とデータ型の情報をパラメーター オブジェクトではなくモデルに格納するために使用します。この手法を使用すると、後で範囲情報を変更した場合に、ブロック パラメーターで最高精度のスケーリングが自動的に再計算されます。

ブロック ダイアログ ボックスで関数 fixdt を使用して、スケーリングが指定されていない固定小数点データ型を指定します。たとえば、ルックアップ テーブル データに最適な精度のスケーリングを使用して、そのデータを 16 ビット ワードに格納します。

  1. n-D Lookup Table ブロックの [データ型] タブの [最小値] 列と [最大値] 列で、テーブル データの要素の値の範囲を指定します。

  2. [データ型] 列で、テーブル データ型を fixdt(1,16) に設定します。

  3. 調整可能な Simulink.Parameter オブジェクトを使用してテーブル データ パラメーターの値を設定する場合は、そのオブジェクトの DataType プロパティを auto に設定します。生成されたコードでは、パラメーター オブジェクトはブロック パラメーターと同じスケーリングを使用します。

コードをシミュレートまたは生成するとき、ルックアップ テーブル データは、指定した範囲情報に応じて異なる 2 進小数点スケーリングをもつ 16 ビットの符号付き固定小数点データ型を使用します。スケーリングの計算により、固定小数点型が範囲内の値を表現できるようになります。後で最小値または最大値を変更すると、コードをシミュレートまたは生成するときに、ブロックでスケーリングが再計算されます。

パラメーター オブジェクトのスケーリングの計算.  Simulink.Parameter オブジェクトを使用して複数のブロック パラメーターの値を設定している場合に、それらのブロック パラメーターで異なるデータ型 (異なる固定小数点スケーリングを含む) が使用されているときは、そのオブジェクトの DataType プロパティを auto (既定の設定) に設定することはできません。代わりに、オブジェクトで範囲とデータ型の情報を指定して、パラメーター オブジェクトに最適な精度の固定小数点スケーリングを計算することができます。この手法は、範囲とデータ型の情報をブロック ダイアログ ボックスではなくパラメーター オブジェクトに格納するためにも使用できます。この手法を使用すると、後で範囲情報を変更した場合に、データ型アシスタントを使用して最高精度のスケーリングを再計算しなければなりません。

たとえば、値 15.25 を表すパラメーター オブジェクトを作成するとし、その値の設計範囲が 0.0032.00 であるとします。最高精度のスケーリングを計算するには、データ型アシスタントを使用します。

  1. コマンド プロンプトで、値が 15.25 のパラメーター オブジェクトをベース ワークスペースに作成します。

    myParam = Simulink.Parameter(15.25);

  2. MATLAB ワークスペース ブラウザーでオブジェクト myParam をダブルクリックします。プロパティ ダイアログ ボックスが開きます。

  3. オブジェクトで範囲情報を指定します。たとえば、[最小値]0.00[最大値]32.00 に設定します。

  4. [データ型]fixdt(0,16,0) に設定します。

  5. データ型アシスタントを展開して [最高精度のスケーリングを計算] をクリックします。

    データ型が fixdt(0,16,0) から fixdt(0,16,10) に変わります。

スケーリングの計算 (小数部の長さ 10 ビット) により、固定小数点データ型が指定の範囲内のパラメーター値を表現できるようになります。

範囲とデータ型の情報をパラメーター オブジェクトで指定する場合は、そのオブジェクトを使用するブロックから範囲とデータ型の情報を削除することを検討してください。固定小数点ツールなどの一部のツールでは、ブロックで指定した範囲情報は無視され、パラメーター オブジェクト内の情報のみが使用されます。ブロックから情報を削除すると、混乱やユーザー エラーを防ぐことができます。

たとえば、Gain ブロック ダイアログ ボックスの [パラメーター属性] タブで、[パラメーターの最小値][パラメーターの最大値][] に設定します。[パラメーターのデータ型][継承: 'Gain' から継承] などの継承されたデータ型に設定して、ブロック パラメーターでパラメーター オブジェクトと同じデータ型が使用されるようにします。

量子化とオーバーフローによる数値精度の問題の検出

ブロック パラメーター、MATLAB 変数またはパラメーター オブジェクトのデータ型で、指定した値を表すことができない場合、データ型は、数値精度を下げながら、値を量子化します。たとえば、32 ビットの浮動小数点データ型 single (C コードでは float) はパラメーター値 1.73 を正確に表すことができません。データ項目の実際値が、データ型で表すことができる値の範囲外にある場合、オーバーフローによって情報が失われる可能性があります。

これらの問題を検出するには、[コンフィギュレーション パラメーター][診断][データ有効性][パラメーター] で診断コンフィギュレーション パラメーターを使用します。これらの診断コンフィギュレーション パラメーターの値を [警告] または [エラー] に設定します。

  • ダウンキャストの検出

  • 桁落ちの検出

  • アンダーフローの検出

  • オーバーフローの検出

パラメーター データのカスタム C データ型の再利用

モデルで、既存の C コードで定義されている構造体などのカスタム C データ型に適合するパラメーター データを作成できます。このデータを使用して以下を実行します。

  • 既存の C コードを Simulink モデルで置き換える。

  • Simulink でのシミュレーション用の C コードを統合する (たとえば、レガシ コード ツールを使用)。

  • 既存のコードと統合できるコードの生成を準備する (Simulink Coder™)。

以下の手法を使用してカスタム データ型を一致させます。

  • 構造体型の場合は、Simulink.Bus オブジェクトを作成します。このオブジェクトを Simulink.Parameter オブジェクトに保存する構造体のデータ型として使用します。関連するブロック パラメーター定義を構造体に整理を参照してください。

  • 列挙型の場合は、列挙型クラスを作成してブロック パラメーターのデータ型として使用します。Simulink モデルでの列挙型データの使用を参照してください。

  • プリミティブ数値データ型のエイリアスを表す typedef ステートメントを一致させるには、Simulink.AliasType オブジェクトをブロック パラメーターのデータ型として使用します。Simulink.AliasType を参照してください。

これらのクラスとオブジェクトを作成するには、関数 Simulink.importExternalCTypes を使用します。

モデル内の MATLAB Function ブロックまたは Stateflow® チャートに、インポートされた列挙型または構造体型が使用されている場合、モデル コンフィギュレーション パラメーターが外部ヘッダー ファイルから型定義をインクルードする (#include) ように構成します。インポートされたバスと列挙型定義の制御(MATLAB Function ブロックの場合)、およびStateflow チャート内のカスタム コードの変数および関数へのアクセス (Stateflow)、およびStateflow チャートのカスタム構造体の統合 (Stateflow)(チャートの場合) を参照してください。

数式のデータ型

数式を使用してブロック パラメーターを指定する場合、ブロックは MATLAB および Simulink のデータ型ルールを組み合わせて使用して最終的なパラメーターのデータ型を判断します。

たとえば、int8ParamdoubleParam の 2 つのパラメーター オブジェクトを定義し、これらのオブジェクトを使用して Constant ブロックで [定数値] パラメーターを指定するとします。

int8Param = Simulink.Parameter(3);
int8Param.DataType = 'int8';

doubleParam = Simulink.Parameter(9.36);
doubleParam.DataType = 'double';

Constant ブロックは、以下の手順を使用して [定数値] パラメーターのデータ型を判断します。

  1. 各パラメーター オブジェクトは指定された数値を指定されたデータ型にキャストします。

    パラメーター オブジェクトデータ型数値結果
    int8Paramint83int8(3)
    doubleParamdouble9.36double(9.36)

  2. ブロックは、MATLAB ルールを使用して指定された式 int8Param * doubleParam を評価します。

    double データ型と別の型を含む式は、別の型の結果を返します。したがって、式 int8(3) * double(9.36) の結果は int8(28) となります。

パラメーター オブジェクト (Simulink.Parameter など) の値を設定するのに式を使用している場合、その式の中に使用されているパラメーター オブジェクトは異なるデータ型ルールに従います。DataType プロパティの auto 設定は、少し異なる意味を持ちます。数式を使用した変数値の設定を参照してください。

生成されたコードにおけるブロック パラメーターのデータ型

生成されたコードにおけるパラメーターのデータ型の制御の詳細については、生成されたコードにおけるパラメーターのデータ型 (Simulink Coder)を参照してください。

関連するトピック