このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
金宝app®Coder™を所有している場合、バーチャル バスまたは非バーチャル バスを使用できるかどうかは、生成されたコードの効率性、サイズおよび可読性に大きな違いが生じる可能性があります。たとえば、生成されたコードでは非バーチャル バスは構造体で表され、バスを使用するアルゴリズムのコピーが 1 つのみ存在します。モデルとコード間の対応を追跡する際に、生成されたコードの構造体を使用すると便利です。たとえば、ex_bus_logging
モデルの COUNTERBUSCreator ブロック用に生成されたコードを以下に示します。
バーチャル バスは生成されたコードで構造体またはその他のまとまった単位としては示されません。バスを操作するアルゴリズムのコピーが要素ごとに別々に存在します。一般的に、バーチャル バスは生成されたコードに影響しません。
生成されたコードで信号を構造体にグループ化するには、非バーチャル バスを使用します。生成されたコードにおける構造体へのデータの整理(Simulink Coder)を参照してください。
MATLAB®構造体を作成して double ではない信号要素を含むバスを初期化する場合、構造体フィールドの値を設定する必要があります。値を設定するために選択する手法は、生成されたコードの効率性と可読性に影響します。初期条件構造体フィールドのデータ型の制御を参照してください。
参照モデルに対する入力または出力であるバスのコードを生成する場合、コード生成に関するいくつかの制限事項があります。モデル インターフェイスでのバスの使用を参照してください。
バス配列のコード生成では、特定の形式をもつ構造体が作成されます。バス配列のコード生成を参照してください。
MATLAB 構造体を使用して、バス内の信号要素を初期化します。バス要素の初期条件の指定を参照してください。
ターゲット バスの信号要素がdouble
以外の数値データ型を使用する場合、一般的には以下のとおりです。
フィールドのデータ型と信号要素のデータ型を手動で一致させることを回避するには、型なし式を使用してフィールドの値を設定します。モデルを開発し、プロトタイプを迅速に作成する場合は、この手法を使用すると便利です。
より効率的な量産コードを生成し、コード内の浮動小数点のストレージを回避するには、構造体のフィールドのデータ型を対応する信号要素のデータ型と一致させます。
選択する手法は、生成されたコードの効率性と可読性に影響します。
生成されたコードでの調整可能な初期条件に関する例および詳細については、生成されたコードにおける信号および状態の初期化の制御(Simulink Coder)を参照してください。
[既定のパラメーター動作]コンフィギュレーション パラメーターを[インライン]
に設定した場合、既定では、初期条件構造体のフィールド値が生成コード内にインライン化された数値 (調整不可) として表示されます。これらの構造体に対して、型なし式を使用して Simulink でフィールドの値を設定します。構造体は生成されたコードで調整可能ではないため、フィールドの値にはデータ型は必要ない。
ただし、後で[既定のパラメーター動作]を[調整可能]
に設定するか、Simulink.Parameter
オブジェクトを使用して構造体にストレージ クラスを適用する場合は、コードに浮動小数点のストレージ、非効率な明示的型変換とビット シフトを含めることができます。こうした問題を回避するために、構造体フィールドのデータ型を対応する信号要素のデータ型と一致させることを検討してください。
(構造体を変数またはSimulink.Parameter
オブジェクトに保存するのではなく) ブロック ダイアログ ボックスで初期条件構造体を直接指定するか、Simulink.Signal
オブジェクトで、struct('signal1',5,'signal2',7.2)
のような式を使用するとします。この場合、調整可能な構造体をコードで生成するために、[既定のパラメーター動作]を[調整可能]
に設定します。
次の表を使用して、これらの初期条件構造体のフィールドのデータ型を制御する方法を決定します。
目的 | 手法 | |
---|---|---|
非バーチャル バスを使用する。 |
型なし式を使用して、フィールドの値を設定する。 |
|
バーチャル バスを使用する。 |
フィールドのデータ型を信号要素のデータ型と手動で一致させない。 |
型なし式を使用して、フィールドの値を設定する。 |
さらに効率的なコードを生成し、浮動小数点のストレージを避ける。 |
構造体のフィールドのデータ型を信号要素の型と一致させる。型付き式を使用してフィールドの値を設定して、データ型情報を |
ベース ワークスペース内またはデータ ディクショナリで作成する変数またはSimulink.Parameter
オブジェクトに初期条件構造体を保存するとします。たとえば、この手法を使用して複数のブロック間の構造体を共有するか、[既定のパラメーター動作]を[インライン]
に設定している場合は調整可能な構造体を生成します。この場合、次の表を使用して、初期条件構造体のフィールドのデータ型を制御する方法を決定します。
目的 | 手法 | |
---|---|---|
フィールドのデータ型を信号要素のデータ型と手動で一致させない。 |
型なし式を使用して、フィールドの値を設定する。生成されたコードでは、構造体フィールドはデータ型 |
|
さらに効率的なコードを生成し、浮動小数点のストレージを避ける。 |
構造体のフィールドのデータ型を信号要素の型と一致させる。データ型情報を構造体フィールドに保存するか、 モデルアドバイザーを使用して、計算量が多くなる可能性のあるデータ型の不一致があるかどうかモデルを確認するには、バス信号を使った構造体パラメーターの使用のチェックを参照する。 |
|
構造体の配列を使用して参照モデルのバス配列を初期化する。構造体の配列をModelブロックのモデル引数の値として参照モデルに渡す。 |
構造体のフィールドのデータ型を信号要素の型と一致させる。データ型情報を構造体フィールドに保存するか、 構造体を参照モデルにモデル引数として渡さない場合、非バーチャル バスに関する他のガイドラインに従って、データ型の制御方法を決定します。 |
型なし式を使用して、構造体フィールドの値を設定できます。フィールドはデータ型double
を暗黙的に使用します。フィールドの値を設定して、理想的な現実の初期化値を表します。
フィールドのデータ型と対応する信号要素のデータ型を手動で一致させないようにします。ただし、バスの仮想性、初期条件に適用するために使用する方法およびその他の要素によっては、浮動小数点ストレージおよび非効率になりうる型変換を生成されたコードに導入することが可能です。
次の信号要素を使用してバスmyBusSig
を作成するとします。各要素は特定のデータ型を使用します。
myBusSig signalElement1 (int32) signalElement2 (boolean) signalElement3 (single)
初期条件構造体initStruct
を作成します。型なし式を使用して、フィールドの値を指定します。オプションで、Boolean のフィールドsignalElement2
の可読性を向上するために、0
ではなく値false
を使用します。
initStruct.signalElement1 = 3; initStruct.signalElement2 = false; initStruct.signalElement3 = 17.35;
関数Simulink.Bus.createMATLABStruct
を使用して構造体を作成する場合、この関数によってデータ型情報が構造体フィールドに保存されます。構造体を作成すると、必要に応じて型なし式を使用してフィールドの値を変更できます。Simulink.Bus.createMATLABStruct を使用した構造体の作成を参照してください。
データ型情報を構造型フィールドに保存するには、型付き式を使用してフィールド値を設定するか、関数Simulink.Bus.createMATLABStruct
を使用して構造体を作成します。これらの手法を使用して、浮動小数点のストレージと非効率になりうる明示的型変換を取り除くことで効率的なコードを生成します。
対応する信号要素のデータ型を変更するときに新しいデータ型を構造体フィールドに手動で適用しないようにするには、Simulink.Bus
オブジェクトを使用して構造体とバスのデータ型を同時に制御することを検討してください。
型付き式を使用したフィールド値の設定-特定のデータ型を使用する次の要素をもつバスmyBusSig
を作成するとします。
signalElement1 (int32)
signalElement2 (boolean)
signalElement3 (single)
型付き式を使用してフィールドの値を設定して、初期条件構造体initStruct
を作成します。フィールドのデータ型を対応する信号要素のデータ型と一致させます。
initStruct.signalElement1 = int32(3); initStruct.signalElement2 = false; initStruct.signalElement3 = single(17.35);
構造体フィールドにはデータ型情報が保存されます。信号要素のデータ型を後で変更する場合、新しいデータ型を対応する構造体フィールドに手動で適用します。
固定小数点データ型を一致させるには、fi
(Fixed-Point Designer)オブジェクトを使用してフィールド値を設定します。
データ型情報の保持によるフィールド値の変更-既存の初期条件構造体のフィールドの値を変更すると仮定します。データ型情報をフィールドに保持するには、添字付き代入 ((:)
の構文) を使用します。
initStruct.signalElement3(:) = 16.93;
添字を使用した代入を使用しない場合、型付き式を使用してデータ型を忘れずに保持しなければなりません。
initStruct.signalElement3 = single(16.93);
これらの手法のいずれかを使用しないと、フィールドのデータ型情報は失われます。
initStruct.signalElement3 = 16.93;% Field data type is now 'double'.
Simulink.Bus.createMATLABStruct
を使用した構造体の作成-関数Simulink.Bus.createMATLABStruct
を使用して、すべてのフィールドの値がグラウンド値 (通常は0
) である構造体を作成します。この関数を使用する前に信号要素のデータ型を設定する場合 (たとえば信号要素を生成するブロックの出力データ型を設定する)、出力構造体の各フィールドでは対応する信号要素と同じデータ型が使用されます。フィールドには、型付き式を使用して値が設定されたものとしてデータ型情報が保存されます。
関数に部分構造体を渡すことで、グラウンド値以外の値を使用して信号要素の一部を初期化できます。この部分構造体を作成する場合、型付き式を使用して各フィールドのデータ型を対応する信号要素のデータ型と一致させます。詳細と例については、Simulink.Bus.createMATLABStruct
を参照してください。
構造体のフィールドの値を後で変更する場合、以下のいずれかの手法を選択して新しい値を設定します。
型なし式。フィールド値にはデータ型情報が保存されません。
型付き式または添字を使用した代入。フィールド値にはデータ型情報が引き続き保存されます。
データ型情報を構造体フィールドに保存するか、型なし式を使用してフィールド値を設定する場合、初期条件全体のデータ型としてSimulink.Bus
オブジェクトを使用します。するとフィールド値とデータ型を別個に管理できます。
この手法を使用する場合は、型なし式を使用してフィールド値を設定することを検討してください。そうすると、信号要素のデータ型を変更するときにフィールドのデータ型を手動で一致させる必要はありません。フィールドと信号要素のデータ型を制御するには、Bus
オブジェクトの要素のDataType
プロパティを使用します。
Bus Creatorブロックを使用して、次の要素をもつバスmyBusSig
を作成するとします。
signalElement1 (int32)
signalElement2 (boolean)
signalElement3 (single)
バス エディターを開きます。
buseditor
バスに対応するBus
オブジェクトmyBus
を作成します。
初期条件構造体initStruct
を作成します。フィールド値の設定に型なし式を使用しました。フィールドsignalElement2
の可読性を向上させるために、0
ではなくブール値false
を使用します。
initStruct.signalElement1 = 3; initStruct.signalElement2 = false; initStruct.signalElement3 = 17.35;
構造体を表すには、Simulink.Parameter
オブジェクトを作成します。
initStruct = Simulink.Parameter(initStruct);
パラメーター オブジェクトを使用して、バスの初期条件を指定します。たとえば、Unit Delayブロック ダイアログ ボックスで、[初期条件]をinitStruct
に設定します。
Bus
オブジェクトを使用して、パラメーター オブジェクトのデータ型を指定します。
initStruct.DataType ='Bus: myBus';
Bus
オブジェクトを使用して、バスのデータ型を指定します。たとえば、Bus Creatorブロック ダイアログ ボックスで、[出力データ型]を[Bus: myBus]
に設定します。
シミュレーション中および生成されたコードでは、構造体フィールドと信号要素はBus
オブジェクトで指定されたデータ型を使用します。シミュレーションおよびコード生成の前に、パラメーター オブジェクトは構造体フィールドをBus
オブジェクトで指定されたデータ型にキャストします。
Bus
オブジェクトに関する基本的な情報については、Simulink.Bus オブジェクト データ型でのバス プロパティの指定を参照してください。
データ型情報を構造体のすべてのフィールドから削除するには、フィールド値をdouble
型で置き換えるカスタム関数を作成します。サンプル関数castStructToDbl
をテンプレートとして使用します。
double を使用する構造体をデータ型情報を保存する構造体に変換するには、関数Simulink.Bus.createMATLABStruct
を使用して参照構造体を作成できます。カスタム関数を作成して、フィールド値を参照構造体のデータ型にキャストできます。サンプル関数castStructFromDbl
をテンプレートとして使用します。
構造体フィールドのデータ型が関連付けられたバス要素と一致していないことを検出するには、モデル アドバイザーを使用します。
[モデル化]タブで[モデル アドバイザー]をクリックします。
[OK]をクリックします。
[タスク別]、[バスによる信号およびパラメーターのモデル化]で、[バス信号を使った構造体パラメーターの使用のチェック]を選択します。
[このチェックを実行]ボタンをクリックします。
バス配列を含むモデルに対してコードを生成する場合、基になるバス型を表すtypedef
が、*_types.h
ファイルに表示されます。
コード生成では、構造体の配列を使用するレガシ C コードと統合できる C 構造体の配列が生成されます。バス変数 (配列) のコードは、必要に応じて以下の構造体で生成されます。
ブロック IO
状態
外部入力
外部出力
次にバス配列に対して生成されたコードの単純な例を示します。
コードでは構造体として表示される、非バーチャル バスのコード生成の基本的な情報については、生成されたコードにおける構造体へのデータの整理(Simulink Coder)を参照してください。