Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

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

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

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

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

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

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

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

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

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

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

  • [パラメーター属性] タブで、[パラメーターのデータ型][Inherit: Inherit via internal rule] (既定) に設定します。

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

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

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)
ブロック パラメーターとパラメーター オブジェクトの値の範囲情報を指定する方法ブロック パラメーターの最小値と最大値の指定
データ型アシスタントを使用する方法データ型アシスタントを利用したデータ型の指定
生成コードにおける調整可能性とブロック パラメーターの表現 How Generated Code Stores Internal Signal, State, and Parameter Data (Simulink Coder)およびCreate Tunable Calibration Parameter in the Generated Code (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 設定は、少し異なる意味を持ちます。数式を使用した変数値の設定を参照してください。

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

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

関連するトピック