C#外部機器との通信4 LXI

2020年1月28日

このブログでは計測器+プログラミングの技術を紹介しています。今までシリアル、GPIB、USB接続のプログラミング方法を紹介してきました。

この記事ではLANによる通信方式であるLXI(LAN eXtentions for Instrumentation)にについて説明します。

LXIとは

LXIとは2005年にアジレントテクノロジー(現キーサイトテクノロジー)が中心となって策定した計測器の通信規格です。計測器の通信では長らくGPIBが使われていますが、GPIBのコネクタはバックパネルを占有する面積が大きく、最近の小型化している計測器への搭載が難しくなっています。

GPIBの他の通信方式にはシリアルとUSBがありますが、どちらも1対1通信にしか対応していないので、GPIBの代替とはなりませんでした。

そこで現れたのがLXIです。LXIはLANを使用しているのでハブで分配することができます。またRJ-45端子を使いますので占有面積も小さいです。また、すでに普及したデバイスを使用しているので新たなコストがかからないというメリットもあります。

アライアンスの中心のKeysightからはLXIの10のメリットという文書もリリースされています。

策定が2005年で、すでに15年たちましたので、そろそろ不具合もでつくし、いいころになっているのでしょうか。

LXIのプログラムの前にネットワークについて考える

LXIは通信プロトコルですが、TCP/IPの使用が前提です。LXIで機器間通信をする前にTCP/IPのネットワークを構築する必要があります。少なくとも以下の項目を計測器に設定しなければなりません。

  • 固定IPかDHCPか?
  • IPアドレス
  • サブネットマスク
  • デフォルトゲートウェイ

例えばPCと計測器を1対1で接続します。1対1の接続でも手順としては小さいネットワークを作るのと同じです。ネットワークアドレスが10.0.0.0、PCが10.0.0.1、計器が10.0.0.2の場合はそれぞれの設定は次のようにします。

(10.0.0.0はクラスAなのでネットマスクは8ビットが良い作法かもしれませんが。)

1対1で接続する場合はIP addressとnetmaskとgatewayが設定されていれば原理的には通信できます。その他は空欄でOKです。ただし、機器の仕様でDNSなども設定されていないと動かないものもあります。

1台計測器を足して1台のPCで2台の計測器を制御する場合は次のようになります。一番異なるのはハブを使うことです。1対1の場合はクロスケーブルが必要でしたが、ハブの場合はすべてストレートケーブルを使います。

この例では10.0.0.1~10.0.0.3のIP Addressを使いましたが、この値は何でも構いません。このようなサブネットだと192.168.0.1がよく使われます。

C#のLXI通信プログラム

LXIの通信プログラムは実はGPIBの書き方とほとんど一緒です。最近GPIB用のC#の書き方が変わりましたので同じようにLXI用のC#の書き方も変わりました。GPIBの変更については以下のリンクを参照してください。

LXIではセッションOpen時のアドレス表記がGPIBの場合と異なります。具体的には以下のようになります。GPIB通信をするときのセッションOpenは次のように記述されます。

//GPIB
MessageBasedSession mbsession = (MessageBasedSession)(new ResourceManager()).Open("GPIB::10::INSTR");

これがLXIの時は次のようになります。

//LXI
MessageBasedSession mbsession = (MessageBasedSession)(new ResourceManager()).Open("TCPIP0::10.0.0.2::inst0::INSTR");

後ろの方の.Open()の中が違うだけです。GPIBからLXIへのプログラムの変更は思ったよりも簡単です。参考のためLXIでデジタルマルチメータを制御するためのサンプルコードを紹介します。

LXIのサンプルコード

サンプルではKeysightの34461A(デジタルマルチメータ)を使って1回だけ計測を行うプログラムを作ります。はじめにPCのアドレスを10.0.0.1/255.255.255.0に設定します。

次に34461AのIO設定でIPアドレスを10.0.0.2/255.255.255.0と設定します。

PCと34461AはクロスのLANケーブルかネットワークハブとストレートケーブルを使って接続します。

次にプログラムはVisual StudioでC#のフォームアプリケーションを作ってフォームにボタン(名前は”buttonStart”)を作り次のようにコードを書きます。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using NationalInstruments.Visa;

namespace LXIsample
{
    public partial class Form1 : Form
    {
        MessageBasedSession mbsession;

        public Form1()
        {
            InitializeComponent();
        }

        private void buttonStart_Click(object sender, EventArgs e)
        {
            mbsession = (MessageBasedSession)(new ResourceManager()).Open("TCPIP0::10.0.0.2::inst0::INSTR");
            mbsession.RawIO.Write(":MEAS?");
            buttonStart.Text = mbsession.RawIO.ReadString();
            mbsession.Dispose();
        }
    }
}

Visual Studioの参照の追加に次のライブラリを追加します。この手順はGPIBと同じです。

  • C:\Program Files (x86)\IVI Foundation\VISA\Microsoft.NET\Framework32\v2.0.50727\VISA.NET Shared Components 5.11.0\Ivi.Visa.dll
  • C:\Program Files (x86)\IVI Foundation\VISA\Microsoft.NET\Framework32\v4.0.30319\NI VISA.NET 19.0\NationalInstruments.Visa.dll

プログラムを実行し、ボタンを押すと34461Aの測定値がボタンに表示されます。

このサンプルではNational Instruments社(以下NI社)のドライバを使っています。これは私がいつもNI社のUSB-GPIB-HSというUSBのGPIBアダプタを使っているからです。しかしLXIの場合はこのアダプタは使わないのでNI社のドライバは必要ないかもしれません。

まとめ

この記事では計測器通信の方式であるLXIを紹介しました。LXIの特徴は次のようなものになります。

  • LANケーブルを使うので計測器のバックパネルを占有しない。ケーブルの取り回しが楽。
  • GPIBと同じように1対多の通信が可能
  • LANのデバイスを使うので高価な機器を買わなくて良い。
  • プログラムの前に計測器にネットワークの設定をする必要がある。
  • LXIのC#プログラムはGPIBのプログラムと大きな差が無い。

LXIはほとんどの計測器に搭載されるようになりましたのでもしかするとGPIBにとって代わるかもしれません。もうちょっと使い込んで良い点、悪い点を確認しようと思います。