3

National Instrument Ethernet-to-GPIB ブリッジを介して PC に接続された Agilent E4426B RF 信号発生器を備えたテスト フィクスチャがあります。私のソフトウェアは、機器をプリセットし、現在の状態を標準 SCPI コマンド「*SAV x,y」で書き込み可能なすべてのメモリ位置に保存することで、機器をサニタイズしようとしています。

ループはある程度機能しますが、最終的に機器はエラーで応答し、前面ディスプレイに「L」アイコンを表示し続け、下部に「リモート プリセット」メッセージを表示します。その時点で、それ以上のリモート コマンドに応答しなくなり、電源を入れ直すか、LOCAL を押してから PRESET を押す必要があります。この時点で、プリセットが完了するまでに約 3 分かかります。その時点で「L」アイコンはまだ存在し、次の GPIB コマンドが測定器に送信されると、測定器エラー キューに -113 エラー (未定義のヘッダー) が報告されます。

NIスパイを起動して何が起こっているのかを確認したところ、ループの同じポイントでエラーが発生していることがわかりました。この場合は「* SAV 6,2」です。NIスパイから:

送信 (0, 0x0017, "*SAV 6,2", 8 (0x8), NLend (0,0x01))
プロセス ID: 0x00000520 スレッド ID: 0x00000518
ibsta:0xc168 iberr: 6 ibcntl: 2(0x2)

計測器ドライバーのコードは次のとおりです。

int CHP_E4426b::Erase()
{
  if ((m_StatusCode = Initialize()) != GPIB_SUCCESS) // basically just sends "*RST"
    return m_StatusCode;

  m_SaveState = "*SAV %d, %d";

  for (int i=0; i < 10; i++)
    for (int j=0; j < 100; j++) {
      sprintf(m_CmdString, m_SaveState, j, i);
      if ((m_StatusCode = Send(m_CmdString, strlen(m_CmdString))) != GPIB_SUCCESS)
        return m_StatusCode;
    }

  return GPIB_SUCCESS; 
}

内部ループの最後に小さな Sleep() 遅延 (10 ~ 20 ミリ秒) を入れてみましたが、驚いたことに、エラーが遅くではなく早く表示されました。10 ミリ秒ではループが 44.1 でエラーになり、20 ミリ秒ではさらに早くなりました。原因となっている配線や測定器の不具合はすでに排除しました。これと同じタイプのシーケンスは、ハイエンドの信号発生器でエラーなしで機能するため、これを機器のファームウェアのバグと見なしたくなります。

4

1 に答える 1

1

文字列に追加OPC?;してから、読み取りを行って OPC コマンドが完了するのを待ちます。このようにして、プログラムは計測器を「オーバーロード」しません。

int CHP_E4426b::Erase()
{
  if ((m_StatusCode = Initialize()) != GPIB_SUCCESS) // basically just sends "*RST"
    return m_StatusCode;

  m_SaveState = "*SAV %d, %d;OPC?;";

  for (int i=0; i < 10; i++)
    for (int j=0; j < 100; j++) {
      sprintf(m_CmdString, m_SaveState, j, i);
      if ((m_StatusCode = Send(m_CmdString, strlen(m_CmdString))) != GPIB_SUCCESS)
        return m_StatusCode;
      Receive(m_CmdString, sizeof(m_CmdString));
    }

  return GPIB_SUCCESS; 
}
于 2011-07-30T21:10:26.790 に答える