XDAファイルからの演算シグナルのインポート:MDA V7とMDA V8での演算シグナルの違い

MDA V8.3.3以降、XDAファイルから演算シグナルをインポートできるようになりました。ただし内部処理の差異により、MDA V8での演算シグナルの演算結果は、MDA V7のものと異なる場合があります。ここではその相違点について説明します。

  • MDA V7とMDA V8とでは、式を評価する際に使用する演算エンジンが異なります。MDA V7はPerlインタープリタを、MDA V8はC言語に似た演算エンジンを使用しています。このため、演算精度の違いなどにより、異なった演算結果が得られる場合があります。MDA V8は、演算結果に応じて、内部的に複数のデータ型(int8、uint8、int16、boolean、doubleなど)を使用します。
  • 演算シグナルの型として、MDA V8は Boolean、Double、自動(Automatic)のみをサポートしています。それに対してMDA V7は、各種整数型(uint16、sint32など)もサポートしています。これらすべての整数型をインポートする際には、自動(Automatic)が適用されます。そのため、MDA V7において整数値を得るために作成した整数型の演算シグナルの値が、MDA V8においては浮動小数点値になってしまう場合があります。
  • MDA V7はバイナリ演算(Binary_AND()など)において、自動的にdecimal()関数を使用します。MDA V8においてこの処理は、Raw()関数を呼び出すことによってエミュレートされます。つまり、MDA V8で演算シグナルを使用する際には物理値が使用されます。
  • 剰余演算子(%)を処理する際、MDA V7は10進値を使用します。それに対してMDA V8は、物理値を使用します。
  • 演算シグナル用の新規ユーザー関数を定義するPerlスクリプトは、MDA V8ではサポートされていません。これらの関数を使用する演算シグナルがインポートされると、その式にエラーが表示されます。
  • 現在の式に含まれないラスタ設定内のシグナルを参照する際には、MDA V8は「複合レート」(マージされた複数のラスタ)を使用します。
  • MDA V8は文字列変換(Verbal conversion)の情報をサポートしておらず、それらを無視します。
  • MDA V7の 限界値の監視(Limit monitoring)タイプの演算シグナルはインポートされますが、文字列変換に関する情報は無視されます。そのため、シグナルの型はMDA V8においては文字列ではなく論理値になります。このシグナルはインポート時にオシロスコープから削除されます。削除されたシグナルは、オシロスコープの論理ストリップに手動で割り当ててください。このシグナルはイベントリストにも割り当てることもできます。この方法によって、MDA V7のイベントストリップと似たビューが得られます。
  • 関数 TableMap1 および TableMap2 はMDA V8ではサポートされておらず、エラーが発生します。

定数

MDA V7

MDA V8への変換結果

BIRTHDAY

MDA V8では使用不可

DATE

MDA V8では使用不可

E

2.71828182845905

EPOCH

MDA V8では使用不可

G

9.80665

LOG2_E

1.44269504088896

LOG10_E

0.434294481903252

LOG_2

0.693147180559945

LOG_10

2.30258509299405

PI

3.14159265358979

PI_DIV_2

1.5707963267949

PI_DIV_4

0.785398163397448

ONE_DIV_PI

0.318309886183791

ONE_DIV_SQRT_2

0.707106781186548

SEC_PER_DAY

86400.0

SEC_PER_HOUR

3600.0

SEC_PER_MIN

60.0

SQRT_2

1.4142135623731

TWO_DIV_PI

0.636619772367581

TWO_DIV_SQRT_PI

1.12837916709551

TWO_PI

6.28318530717959

標準的な演算

MDA V8の「既知の問題点」として、標準的な演算が定義された演算シグナルをインポートすることによって演算結果に以下のような不具合が生じることが挙げられています。

  • MDA V7とMDA V8では、rint / RoundInt関数の値が異なります。MDA V7のrint関数の丸め規則は特殊な「非対称な切り上げ」ですが、MDA V8は「対称的な切り上げ」です。
  • MDA V7は、シフト(>>、<<)とバイナリ演算(&、|、^)においてシグナルの生値(raw value)を使用します。それに対してMDA V8は、Raw()関数を呼び出すことによりこれをエミュレートします。このエミュレーションは、ネストされた演算シグナル、つまり測定シグナルから演算される演算シグナルが引数に含まれる演算シグナルに対しては、正しく機能しません。
  • MDA V7の整数型の演算シグナルは、MDA V8ではdouble型に変換されます。そのため、算術オーバーフローの処理に違いが生じます。たとえば、-1は、MDA V7においてはuint32の-1、つまり4294967295.00として表現されますが、MDA V8ではrealの-1.00になります。

シングルビット演算

 

演算

MDA V7

MDA V8への変換結果

注釈

Single Bit

double((long(rint(signal)) >> shift_value) & and_value)

測定シグナルの場合:

Raw(signal) >> shift_value & and_value

値の場合:

value >> shift_value & and_value

測定シグナルはすべてRaw関数でラップされます。

ビットマスク演算

 

演算

MDA V7

MDA V8への変換結果

注釈

Bitmask

double((long(rint(signal)) >> shift_value) & and_value)

測定シグナルの場合:

Raw(signal) >> shift_value & and_value

値の場合:

value >> shift_value & and_value

測定シグナルはすべてRaw関数でラップされます。

限界値監視演算

MDA V7では、あるシグナルが所定の値を超えているかを監視するために、複数の演算シグナルを組み合わせて使用することができます。監視する上下の限界値ごとに条件を定義し、それを超えた時に表示するメッセージを定義することもできます。

このような処理は、MDA V8ではBooleanタイプの演算シグナルに変換されます。シグナルに割り当てられたメッセージは変換されません。

例:

XDAファイルに以下の3つの演算シグナルが含まれているとします。

1

MyLimitMonitor1?1 = ${'C:_Data\INCA-NG_Sample Files\Coldstart2.dat:DG0:CG0:N10'}>1000

2

MyLimitMonitor1?2 = ${'C:_Data\INCA-NG_Sample Files\Coldstart2.dat:DG0:CG0:N10'}<100

3

MyLimitMonitor = ${'MyLimitMonitor1?1'} + ${'MyLimitMonitor1?2'}

上記の3つの演算シグナルは、MDA V8では以下のような1つの演算シグナルに変換されます。

名前

MyLimitMonitor

(N10 > 1000) || (N10 < 100)

タイプ

Boolean