FAQs from Rohde & Schwarz

GPIBのFSE/FSIQトレースデータの構造は?

質問

'TRAC? TRACE1' コマンドを使用してGPIBからのバイナリ・トレース結果を変換するにはどうすればよいですか?

回答

*RST後のデフォルトのフォーマットは、ASCIIフォーマットです。つまり、カンマで区切られた

500個のASCII値が、改行(16進数の0A)で終わる

1つの文字列として返されます(約6 Kバイト)。

浮動小数点フォーマットを使用するには、"FORMAT REAL,32" コマンドを事前に

送信する必要があります。

FSEは、"TRAC? TRACE1" 問合せに対して、500個の浮動小数点値からなるバイナリ・ストリングで

答えを返します。各値は、IEEE 754単精度4バイト(32ビット)フォーマットです。

このフォーマットは、ほとんどすべてのコンパイラで(Visual Basicでも)使用されます。

このため、変換を実行する必要がなく、処理時間を大幅に

削減できます。値はすべて、下位バイトが最初に送信されます。これは、PCの世界における

バイト順序です。HPのワークステーションについては、ご確認ください。

バイナリ・ストリングは、IEEE 488.2規格で定義されている

<固定長任意ブロック応答データ>に従ってフォーマットされます。

このフォーマットは、測定器の応答がバイナリ・フォーマットの場合は、

先行する長さ情報と組み合わせて使用する必要があります。

エンコード構文では、ASCII符号の#の後に非ゼロの桁が続きます。この

桁は、続く桁数を示すと同時に、バイナリ情報の

長さを指定します。FSEの場合、先行する

長さ情報は "#42000..." で、2000バイト(500×4バイト)の

バイナリ情報であること意味します。

以下のCプログラミングの例では、単精度FLOAT型配列を使用して、

IEEEバスからの情報を変換なしに読み取ります。先行する長さ

情報は、6バイト単位のオフセットで配列内をスキップされます。

/* DEFINES ****************************************************************/

#define MAX_NOF_POINTS 500 // max. number of points per sweep

#define MAX_NOF_DATA_BYTES (MAX_NOF_POINTS * sizeof(float) + 100)

/* VARIABLES **************************************************************/

UINT8 sweep_data[MAX_NOF_DATA_BYTES]; // stores the data loaded from FSEx

float *sweep_data_ptr= (float *)sweep_data; // pointer to sweep_data

/* Procedures **************************************************************/

int read_sweep_data(void)

/*

SPECIFICATION: read new data from FSEx

Trace data in binary format are 500 float values (2000 bytes)

preceded by 6 bytes

which are used as a length specifier (IEEE488.2 format):

#42000...

PARAMETERS: none

SIDE_EFFECTS:none

RETURN VALUES: 0 if successful

1 if there was any error

****************************************************************************/

{

if (write_to_analyzer("FORMAT REAL32;:TRAC? TRACE1")) // send data of Trace

1 in binary format

{

sprintf(error_msg, "IEEE-Error: TRAC? TRACE1");

return 1;// there was an error

}

if (read_from_analyzer(sweep_data, MAX_NOF_DATA_BYTES))

{

sprintf(error_msg, "IEEE-Error: reading sweep data");

return 1;// there was an error

}

if ( (ibcnt < 2006) || (ibcnt > 2007) ) // number of received bytes

{

sprintf(error_msg, "IEEE-Error: reading sweep data (incorrect byte count)");

return 1;// there was an error

}

sweep_data_ptr= (float *) &sweep_data[6]; // set pointer to data start

return 0;

}