GPIBを介したコンピュータ同士の通信方法

更新しました Jun 23, 2019

使用製品

Driver

  • NI-488.2

問題

2台のコンピュータをGPIBを介して通信させるにはどうすればいいですか?

解決策

下記は、コンピュータ間通信に対するガイドラインとして使用することができる一連の流れです。コンピュータ間のGPIB通信をおこなうには、以下の手順をおこないます。 
 
  1. 両方のコンピュータのGPIB設定をデフォルトにします。一方のコンピュータをコントローラとし、他方のコンピュータを非コントローラと定義します。この時点では設定変更する必要はありません。
  2. コントローラ側のコンピュータで、プライマリアドレスが1である計測器とのセッションを開くかどうかを確認する必要があります。対話式制御(IBIC)で計測器セッションを開くには、以下の手順をおこないます。
    1. ibfind GPIB0コマンドを実行してGPIBボードのセッションを開きます。
    2. ibsicを実行してインタフェースが通信バス上のメッセージをクリアします。
    3. ibsre 1を実行して計測器と通信する度にREN(Remote Enable: リモート有効)ラインをアサートします。
    4. ibdev 0 1 0 13 1 0を実行して非コントローラとのセッションを開きます。最初のパラメータは、アクセスするボードの指標です。2つ目は、デバイスのプライマリGPIBアドレスです。3つ目は、GPIBデバイスのセカンダリアドレスです(通常は0)。4つ目は、I/Oタイムアウト値です。5つ目は、デバイスのEOIモードです。6つ目は、デバイスのEOS文字モードです。これらすべての設定は、NI MAXのGPIBデバイス設定にあります。
    5. ibwrt "HELLO"を実行してデータ文字列を送信します。この場合HELLOを非コントローラに送ります。
  3. IBICを使用してこれらのコマンドをテストします。その後、プログラムにこの手順を実装することが可能です。非コントローラ側のコンピュータで以下の手順をおこないます。
    1. ibfind GPIB0コマンドを実行してGPIBボードのセッションを開きます。
    2. ibrsc 0コマンドを実行してシステム制御を解放します。これにより、コンピュータを非コントローラにします。
    3. ibpad 1コマンドを実行して非コントローラのGPIBプライマリアドレスを0から1に変更します。
    4. ATNラインがアサートされてなく、コンピュータがリスナとして指定されていることを確認します。LACSラインは、コンピュータがリスナの際はステータスワードでHighになります。これを定期的に確認するループを作成することができます。
    5. ibrd #を実行してコントローラから送られたコマンドを読み取ります。ここで#は受け取るバイト数を指定します。この場合、HELLOを送信したので読み取るバイト数は5バイトになります。


コントローラ側の手順に関するメモ: 非コントローラが毎回リスナとして指定されるかどうかを確認するために再アドレスを有効にする必要があります。そうしないと、リスナが見つからないことを示すENOLエラーが発生します。再アドレスを有効にするには、ibconfig ibcreaddr 1コマンドを使用します。これは、コントローラでのみおこなう必要があります。この手順は、ループ内でコードを変更したい場合に必要となります。 

非コントローラ側の手順に関するメモ: 非コントローラがリスナに指定されるまでループで手順dを実行します。これは、コントローラがメッセージを送信し、手順eを実行してメッセージを読み取るためです。書き込みの際にも似たような手法を用いますが、トーカからリスナになる場合に待機する代わりにTACSラインがステータスワードでHighになることを待機します。 
 

下記のコードは、これらの操作を実行するC言語のサンプルソースです。

 

static int noncontroller;
static char buffer[100];
static int panelHandle;

int main ()
{
// GPIB ボードのセッションを開く
noncontroller = ibfind ("gpib0");  

// システム制御を開放する
ibrsc (noncontroller, 0);   

// プライマリアドレスを0から1に変更する
ibpad (noncontroller, 1);   

while (1) 
{
// ステータスを更新する
ibwait (noncontroller, 0);   

// 非コントローラがリスナとなりATNラインがオフになるまで待機する. 
if ((ibsta&LACS)&&(!(ibsta&ATN)))   
{
ibrd (noncontroller, buffer, 100);   // データバイトを読み取る
buffer[ibcnt] = '\n';   // 改行と0を文字列に追加する
buffer[ibcnt + 1] = 0;
printf ("%s",buffer); print buffer
return 0;
}   // 最初のIF文終了

// トーカに指定されたら"I am a talker"と返答を送信する
if ((ibsta&TACS)&&(!(ibsta&ATN)))   
{    
// データを送信
ibwrt (noncontroller, "I am a talker", strlen("I am a talker"));   
return 0;
}   // 2つ目のIF文終了
}   // while文終了
}   // main終了


このコードを実行するには、以下の手順をおこないます。
  1. windows.hヘッダファイルをインクルードします。
  2. ni488.hヘッダファイルをインクルードします。
  3. 使用する言語に沿ったインタフェースファイルをアプリケーションにリンクします。
    1. Microsoft C/C++の場合は、gpib-32.objをリンクします。
    2. Borland C/C++の場合は、borlandc_gpib-32.objをリンクします。



GPIB関数とステータスワードの詳細は、関連リンクを参照してください。

この記事はお役に立ちましたか?

いいえ