信号範囲の指定
Simulink® ブロックでは、それらの出力信号の有効な値の範囲を指定できます。信号範囲を指定すると、データ型の最適化と生成されたコードの向上に役立ちます。
Embedded Coder® がある場合、Simulink Coder™ は、信号とパラメーターに指定する最小値と最大値を考慮することで、モデルから生成するコードを最適化できます。この最適化により、アルゴリズム コードが削除され、SIL やエクスターナル モードなどの一部のシミュレーション モードの結果に影響を与えることがあります。詳細については、Optimize using the specified minimum and maximum values (Embedded Coder)を参照してください。
信号範囲の指定が可能なブロック
次のブロックでは、出力信号の範囲を指定できます。
ブロックの信号範囲の操作
ほとんどのブロックの信号範囲を指定するには、ブロックの [出力の最小値] パラメーターと [出力の最大値] パラメーターを使用して、ブロックの出力信号の有効な値の範囲を指定します。Data Store Memory、Inport、In Bus Element、Outport、Out Bus Element、および Signal Specification の各ブロックについては、信号範囲を指定するために [最小値] パラメーターと [最大値] パラメーターを使用します。信号範囲を指定可能なブロックの一覧は、信号範囲の指定が可能なブロックを参照してください。
これらのパラメーターにアクセスするには、プロパティ インスペクター ([モデル化] タブで [設計] の下で [プロパティ インスペクター] をクリック)、モデル データ エディター ([モデル化] タブで [モデル データ エディター] をクリック)、またはブロックのダイアログ ボックスを使用します。
最小値または最大値を、スカラーの double
データ型の実数に評価される式で指定します。たとえば、以下を使用できます。
98.884
などの数値リテラル。暗黙的にデータ型はdouble
になります。データ型が
double
である数値ワークスペース変数 (変数の作成によるブロック パラメーター値の共有と再利用を参照)。この手法を使用すると、複数のデータ項目の間で最小値または最大値を共有できます。Simulink.ValueType
、Simulink.Signal
、Simulink.BusElement
の各オブジェクトのMin
プロパティまたはMax
プロパティを変数を使用して設定すると、変数の現在の値がオブジェクトに代入されます。オブジェクトのMin
プロパティとMax
プロパティは、以降に変数が変更されても影響を受けません。
指定したスカラー値は合成信号の各要素に適用されます (たとえば信号が非スカラーまたはバスの場合)。スカラー拡張の詳細については、入力とパラメーターのスカラー拡張を参照してください。
信号の最小値または最大値を未指定のままにするには、空行列 []
(既定値) を使用します。
モデル構造の範囲の指定
バス、データ ストア、Stateflow® チャートなどのモデル構造を使用する場合、さまざまな手法で設計範囲情報を指定できます。次の表の情報を使用してください。
ターゲット信号の説明 | 手法と詳細 |
---|---|
数値的な複素信号 | 複素数である信号について、[出力の最小値] または [出力の最大値] を指定すると、指定した最小値および最大値は、複素数の実数部と虚数部に個別に適用されます。複素数の実数部または虚数部の値が最小値より小さいか、最大値より大きい場合、複素数は指定の範囲外になります。 |
バス内の信号要素 | Bus Creator ブロックを使用してバスを構築する場合、Bus Creator ブロックに対して入力を行う上流のブロックで範囲情報を指定できます。 バスの構築に使用する手法にかかわらず、 |
MATLAB Function ブロック内の信号 | [シンボル] ペインとプロパティ インスペクターを使用して、変数の [最小値] および [最大値] プロパティを指定します。一般的な変数のプロパティの設定を参照してください。 |
Stateflow チャート内の信号 | 対応する Stateflow データの [最小値] プロパティと [最大値] プロパティを設定します。制限範囲 (Stateflow)を参照してください。 |
オブジェクト ( |
|
データ ストア (Data Store Memory ブロックまたは | Data Store Memory ブロックの場合、ブロック パラメーター [最小値] および [最大値] を設定します。信号オブジェクトの場合、 |
信号範囲のエラーのトラブルシューティング
Simulink では、[シミュレーション範囲のチェック] という名前の診断機能があり、この機能を使用して、シミュレーション中に信号が指定した範囲を超えた時期を特定できます。この診断機能が有効な場合、Simulink では、ブロックによって出力された信号値と指定した範囲 (ブロックの信号範囲の操作を参照) およびブロック データ型を比較します。つまり、Simulink は次のチェックを実行します。
DataTypeMin ≤ MinValue ≤ VALUE ≤ MaxValue ≤ DataTypeMax
ここで、
DataTypeMin
は、ブロックのデータ型により表される最小値です。MinValue
は、[出力の最小値] などにより指定されたブロックが出力する最小値です。VALUE
は、ブロックが出力する信号値です。MaxValue
は、Output maximum などによって指定される、ブロックから出力される最大値です。DataTypeMax
は、ブロック データ型により表される最大値です。
メモ
特定の範囲を超えた信号をブロックが処理する方法については、条件を指定しすぎる場合があります。たとえば、両方の信号範囲のパラメーターについて値 (既定値以外の値) を指定し、Saturate on integer overflow パラメーターを有効にするとします。この場合、Simulink には、[整数オーバーフローで飽和} パラメーターを無効にするように指示する警告メッセージが表示されます。
シミュレーション範囲のチェックの有効化
[シミュレーション範囲のチェック] 診断を有効にするには、以下のようにします。
モデル ウィンドウの [モデル化] タブで、[モデル設定] をクリックします。
Simulink の [コンフィギュレーション パラメーター] ダイアログ ボックスが表示されます。
[コンフィギュレーション パラメーター] ダイアログ ボックスの左側の [選択] ツリーで、[診断] 、 [データ有効性] カテゴリをクリックします。[信号] の右下で、[シミュレーション範囲のチェック] 診断を
[エラー]
または[警告]
に設定します。[OK] をクリックして、変更を適用して [コンフィギュレーション パラメーター] ダイアログ ボックスを閉じます。
詳細については、シミュレーション範囲のチェックを参照してください。
シミュレーション範囲のチェックを使用したモデルのシミュレーション
信号範囲のエラーまたは警告をチェックするには、以下のようにします。
モデルの [シミュレーション範囲のチェック] 診断を有効にします (シミュレーション範囲のチェックの有効化を参照)。
モデル ウィンドウで [実行] をクリックして、モデルのシミュレーションを実行します。
Simulink によって、モデルのシミュレーションと信号範囲のチェックが実行されます。[シミュレーション範囲のチェック] 診断で
[エラー]
が指定されている場合に信号が指定の範囲を超えると、Simulink のシミュレーションが停止し、エラーが (たとえば診断ビューアーに) 生成されます。また、[シミュレーション範囲のチェック] 診断で
[警告]
が指定されている場合に信号が指定の範囲を超えると、Simulink では MATLAB® コマンド ウィンドウに警告メッセージが生成されます。各メッセージによって、指定した範囲を超えた出力信号のブロックと、このエラーが発生したタイム ステップを把握できます。
バーチャル ブロックの信号範囲の伝播
Inport ブロックや Outport ブロックなどの一部のバーチャル ブロック (非バーチャル ブロックとバーチャル ブロックを参照) では、出力信号の範囲を指定できます。このようなブロックを含んでいるモデルに対して [シミュレーション範囲のチェック] が有効な場合、バーチャル ブロックの信号範囲は、出力信号を受信する非バーチャル ブロックの最初のインスタンスに逆伝播します。非バーチャル ブロックでその範囲に別の値が指定されている場合、Simulink では、可能な最も狭い範囲で信号範囲のチェックを実行します。すなわち、Simulink では、大きい方の最小値と小さい方の最大値の範囲で信号をチェックします。
たとえば、以下のモデルを考えます。
このモデルでは、Constant ブロックでは、その [出力の最大値] パラメーターが 300 に指定され、Inport ブロックでは 100 に設定されています。[シミュレーション範囲のチェック] 診断が有効で、モデルのシミュレーションを実行するとします。Inport ブロックによって、Constant ブロックなどの Inport ブロックより前の非バーチャル ブロックに最大値が逆伝播します。Simulink では、2 つの最大値の小さい方の値を使用して、Constant ブロックによって出力された信号をチェックします。Constant ブロックは最も狭い範囲を超える値 (200) の信号を出力するため、Simulink によってエラーが生成されます。
double
よりも高い精度または広い範囲のデータに対する予期しないエラーまたは警告
データ項目 (信号またはパラメーター) で double
以外のデータ型が使用されている場合、比較する前に、Simulink によってデータ項目および各設計範囲 (指定した最小値または最大値) が double 以外のデータ型にキャストされます。この方法は、誤解を招く不必要なエラーや警告の生成を防ぐために役立ちます。
ただし、Simulink では比較の前に設計範囲が double
として保存されます。データ項目のデータ型が double
よりも高い精度 (語長が 128 ビットで小数部の長さが 126 ビットの固定小数点データ型など) または double
よりも広い範囲をもつ場合で double
によって設計範囲の値を正確に表現できない場合、Simulink によって予期しない警告およびエラーが生成される可能性があります。
double でない型が高い精度をもつ場合、設計範囲を、double
で表現可能なゼロから次に遠い数値に丸めることを検討してください。たとえば、最大値を 98.8847692348509014
に設定した後で、信号によってエラーが生成されると仮定します。double
で表現可能なゼロから次に遠い数値をコマンド プロンプトで計算します。
format long
98.8847692348509014 + eps(98.8847692348509014)
ans = 98.884769234850921
得られた数値 98.884769234850921
を使用して最大値を置き換えます。