条件に合ったサンプルのみに対して計算を行う
特定の条件を満たすサンプルに対してのみ計算を行うには、いくつかの方法があります。
最も一般的な方法は、If-Then-Else演算を用いて、定義された条件の判定結果(true/false)に応じた処理を行う方法です。
このIf-Then-Else演算を利用して特定のサンプルを計算から除外することもできます。
If-Then-Else演算には、結果がtrueまたはfalseになる条件文が必要です。
Thenはtrueの場合に行う処理を表し、Elseはfalseの場合に行う処理を表します。
Result = Condition ? True Case : False Case
If-Then-Elseは、以下の3つの部分を含む式として構成されます。 Condition: 各サンプルが計算対象であるか否かを判定するための条件式 True case: 条件式の結果がtrueの場合の処理 False case: 条件式の結果がfalseの場合の処理True caseとFalse caseには、複合的な式のほか、入力シグナルや定数を割り当てることができます。
以下に、テスト走行における登坂時のエンジンパワーを演算する例をご紹介します。
Uphill condition = Gradient (Altitude) > 0
True case = EngineSpeed * Load
False case = 0
Power_Uphill = Gradient (Altitude) > 0 ? EngineSpeed * Load [* Factor] : 0
ここでは、予想されるPowerの単位と、与えられたEngineSpeedとLoadの単位に応じて、適切な単位変換を行うための係数(Factor)が必要です。
True caseとFalse caseのいずれかにおいて「ニュートラル値」を使用することで、If-Then-Elseでより複雑な演算を定義することができます。ニュートラル値として使用される一般的な値は、加算と減算の場合は0、乗算と除算の場合は1です。
-
ここでは、40~80km/hの速度範囲におけるCO2排出量の合計を求めるものとします。合計を求めるには、CO2の排出流量(g/s)を積分します。
-
速度範囲を判定する条件式:(Speed > 40) AND (Speed <= 80)
-
trueの場合の処理:CO2排出量を積分
-
falseの場合の処理:ニュートラル値(0)を積分
CO2_Amount = Accumulate_Prefix_Integral ( ( (Speed > 40) AND (Speed <= 80) ) ? CO2_Emission : 0 )
Accumulate_Prefix_Integralは、第1サンプルから開始される積分演算の名前です。
-
-
40〜80km/hの速度範囲で走行した距離を計算します。
距離は、速度シグナルの積分として計算することができます。ここでは、与えられた速度範囲内のみが考慮されます。
-
速度範囲を判定する条件式:(Speed > 40) AND (Speed <= 80)
-
True caseの処理:速度分を積分
-
falseの場合の処理:ニュートラル値(0など)を積分
Distance = [Factor *] Accumulate_Prefix_Integral ( ( (Speed > 40) AND (Speed <= 80) ) ? Speed : 0 )
速度の単位をkm/h、距離の単位をkmとすると、単位変換用の係数(Factor)は1/3600になります。
-
-
40〜80km/hの速度範囲で走行した時間を求めます。
Duration = Accumulate_Prefix_Integral ( (Speed > 40) AND (Speed <= 80) )
ここでは条件自体が1または0の値であるため、純粋な積分演算を行います。If-Then-Else演算は使用できません。
上記の式により、時間は秒単位で得られます。
上記の例では、If-Then-Else関数により、特定の条件に基づいて結果を計算しています。ここでは条件を満たさないサンプルも含め、すべてのサンプルに対して計算が行われます。条件を満たさないサンプルについては適切な「ニュートラル値」を使用することで、計算結果には影響を与えず、タイムスタンプごと、つまり入力サンプルごとに値が存在するようにすることができます。この結果は、オシロスコープにおいては連続したカーブとして描画されます。
しかし場合によっては、計算結果のニュートラル値を見つけるのが困難なこともあります。その場合は、条件を満たさないサンプルを計算時に無視することができれば便利です。たとえば平均値計算の場合、適切なニュートラル値というものは存在しないため、条件を満たさないサンプルは除外する必要があります。
サンプルを完全に除外するには、サンプルを削除するのではなく、除外するサンプルにNo Valueというフラグをセットします。No Valueフラグはそのサンプルが無効であることを示すもので、
No Valueフラグには、以下のような2とおりの使用方法があります。
-
40〜80km/hの速度範囲の統計データを取得するには、以下のいずれかの方法があります。範囲外の速度のサンプルを計算から除外するため、それらのサンプルにNo Valueフラグをセットします。
-
速度範囲を判定する条件式:(Speed > 40) AND (Speed <= 80)
-
trueの場合の処理:Speedのサンプル値をそのまま保持
-
falseの場合の処理:SpeedのサンプルにNo Valueフラグをセット
Selected_Samples = (Speed > 40) AND (Speed <= 80) ? Speed : NoValue (0)
Selected_Samplesシグナルを統計データウィンドウに割り当てると、定義された速度範囲のサンプルのみが統計値として使用されます。
シグナルをオシロスコープウィンドウに割り当てると、値のカーブは、定義された速度範囲内のサンプルが存在する範囲のみ描画されます。
注記:NoValue ( 0 )は、サンプル値を0にして、No Valueフラグをセットすることを意味します。
または
上記の方法以外に、別の方法でNo Valueフラグをサンプルにセットして、特定のサンプルを除外することができます。
ここでは、どのサンプルを除外するかがより明確になるように、条件を定義する必要があります。
-
除外する速度範囲の条件:(Speed <= 40) Or (Speed > 80)
(上記のTrue条件と反対の条件)
-
特定されたサンプル(速度40~80kmの範囲外のサンプル)を No Value ステートにする:
SetNoValueStatus ( Speed, ( (Speed <= 40) Or (Speed > 80) )
これは以下と同等の演算になります。
Selected_Samples = (Speed > 40) AND (Speed <= 80) ? Speed : NoValue (Speed)
ここでは、NoValue (signal)により、除外されるシグナルの元の値は保持されたまま、NoValueフラグがセットされます。
選択された速度シグナルのサンプルは、記録開始からの平均値計算などに用いられます。
Average_Speed = Accumulate_Prefix_Average ( Selected_Samples )
-
-
No Value フラグは、上述の距離計算などにおいて、オシロスコープ上の描画を抑制する目的にも利用できます。
Interrupted_Distance_Curve = (Speed > 40) AND (Speed <= 80) ? Distance : NoValue (0)
距離計算:Distance = [Factor *] Accumulate_Prefix_Integral ( ( (Speed > 40) AND (Speed <= 80) ) ? Speed : 0 )
注記:
Accumulate_Prefix_Integral ( ( (Speed > 40) AND (Speed <= 80) ) ? Speed : NoValue (0) )
上記の計算を用いても、ギャップ(空白部)を含むInterrupted_Distance_Curveシグナルを描画できますが、期待される結果とは異なる可能性があります。
これには、積分関数の処理が影響しています。サンプルがない場合やNo Valueフラグがセットされている場合は、次のサンプルが得られるまで、最後に得られた有効なサンプル値が積分計算に使用されるためです。
If-Then-Elseを用いてNaNステートのサンプルを除外する
記録されたサンプル値の中には、Not a Number(NaN)値が含まれるものもあります。
一般的に、このような「NaNサンプル」は計算できないため、これらのサンプルを計算から除外する必要があります。
-
NaNサンプルを除外するには、NaNサンプルを見つけ、そのサンプルにNo Valueフラグをセットします。
NaNの条件:InputSignal != InputSignal
入力シグナルの現在時刻のサンプルがNaNサンプルであれば、計算が不可能であるため、上記の評価結果はtrueになります。
ここでは、If-Then-Elseを用いた長い計算式の代わりに、SetNoValueStatusフラグを使用することができます。
InputSignal_without_NaN = SetNoValueStatus (InputSignal, InputSignal != InputSignal)
InputSignal_without_NaNを用いてヒストリ計算(Average、Minimum、Maximumなど)を行えば、NaNサンプルを除外した計算結果が得られます。
-
NaNサンプルを除外した積分計算を行う。
上述のように、No Valueステートは、積分計算に対して好ましくない影響を与えます。
そのため、If-Then-Elseを使用してNaNサンプルに積分計算用の中立値(0)をセットし、積分計算からNaN値を除外する必要があります。
Integral_excl_NaN = Accumulate_Prefix_Integral ( InputSignal != InputSignal ? 0 : InputSignal)
参照