C#外部機器との通信3 USB

2020年1月30日

C#で計測器と通信する3回目はUSB接続です。

これまでシリアル接続とGPIB接続のプログラムを紹介しました。そちらの記事も興味のある方は下のリンクから探してみてください。

C#外部機器との通信

USBはいまや一番メジャーなインターフェースになりました。USB接続で通信をするなら特に何も買い足す必要はないでしょう。

でもこのUSBをC#でプログラミングするというのはなかなか簡単ではありません。

なぜならUSBはもともと計測器との通信用のインターフェースではないため、USBを使って外部機器を制御する方法は1つに限定できないからです。

このような状況にあって、計測器のメーカーの大手、Keysight(旧アジレント(旧HP))はほとんどの新製品にUSBポートを装備し、USB接続を簡単に制御する方法を提供しています。

(その代わりにGPIBはあまり積極的に開発されなくなってしまいました)

この記事ではアジレント製の機器に限定して、USB接続経由で、外部機器を制御する方法を紹介します。

1 USBライブラリスイートのインストール

キーサイトの機器をwindowsパソコンから制御するためにはキーサイトが提供しているキーサイトIOライブラリスイートをインストールする必要があります。

IOライブラリスイートは計測器に同梱しているか、キーサイトのHPからダウンロードできます。

IOライブラリスイートはキーサイトのUSB接続可能な機器のほぼすべてのドライバが入っています。

のはずなんですが、IOライブラリスイートのマイナーバージョンではいくつかのライブラリが省略されているようです。

IOライブラリスイートはインストールする前に、自分の機器に対応しているか確認が必要そうです。

インストールファイルが入手できたら実行してインストールをしましょう。設定はデフォルトのままで大丈夫そうですが、インストールに時間がかかります。心して待ちましょう。

2 C#経由のUSB接続

IOライブラリスイートをインストールするとサンプルコードがインストールされます。

バージョンにもよりますが、私はC:\ユーザー¥パブリック¥ドキュメントNational Instrumentsの下にありました。

このプロジェクトの中を掘っていくと手順が分かります。

またキーサイトの資料でUSBとC#の接続の説明がありました。

Visual Basic C#による計測・統計機能を用いたGO-NOGOサンプルプログラムガイド

こちらも参考にしてください。

GPIBの通信プログラムと同じようにフォームにリッチテキストボックスとボタンを配置してください。

2-1 参照の追加

初めに画面右上のソリューションエクスプローラから参照の追加を行います。

参照の項目を右クリックして参照の追加…を選択してください。

参照するファイルはIvi.Visa.Interop.dllです。

すごい場所にありますよ。

C:\Windows\assembly\GAC_64\Ivi.Visa.Interop\5.9.0.0__a128c98f1d7717c1\

2-2 名前空間の追加

ファイル開始のusing~の群れの最後に以下の行を追加します。

using Ivi.Visa.Interop;

これができたら少し下にあるpublic partial class Form1 : Formの{のすぐあとに次の行を追加します。

private ResourceManager ioMgr = new ResourceManager();
private FormattedIO488 instrument = null;
string usbAdd = "USB0::2399::36999::MY59999999::0::INSTR";

usbAddの後ろの呪文はUSBの機器本体に表示させるものですのでマニュアル読んで表示させて書き写してください。機器のよって違います。

次にデザイナーでボタンをダブルクリックしてbutton1_Clickを作って、そこへカーソルを移動します。{}の中に次の行を書き込んでください。

instrument.IO = (IMessage)ioMgr.Open(usbAdd);
instrument.WriteString("*IDN?");
richTextBox1.Text = instrument.ReadString();
instrument.IO.Close();

上のコードですが、一行目は通信の準備をしています。

2行目は外部機器に対して*IDN?コマンドを送っています。これは外部機器IDを問い合わせるコマンドです。

3行目は外部機器からの返信をリッチテキストボックスに表示しています。

4行目で通信を終了しています。

普通は通信エラーに備えてtry・catchで括ります。

全体は次のようになります。

using System;
using System.Windows.Forms;
using Ivi.Visa.Interop; //追加したところ

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        private ResourceManager ioMgr = new ResourceManager(); //追加したところ
        private FormattedIO488 instrument = null;
        string usbAdd = "USB0::2399::36999::MY59999999::0::INSTR";

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try //追加したところ
            {
                instrument.IO = (IMessage)ioMgr.Open(usbAdd);
                instrument.WriteString("*IDN");
                richTextBox1.Text = instrument.ReadString();
                instrument.IO.Close();
            }
            catch
            {
                MessageBox.Show("通信エラー");
            }
        }
    }
}

実行すると外部機器のIDがリッチテキストボックスに表示されたでしょうか。

3 まとめ

この記事ではC#でUSB接続の外部機器と通信する方法を紹介しました。

GPIBの時と同じですが、コマンドは*IDN?しか使ってません。これ以外のコマンドについてはまた改めて紹介します。

関連記事

C#外部機器との通信