【C#】【VISA】計測機器をPCから制御するVISA入門

C#.NET

ad2

【C#】【VISA】計測機器をPCから制御するVISA入門

計測機器をPCから制御

計測器インターフェース規格のVISA(Virtual Instrument Software Architecture)ライブラリを用いて、

PCから計測機器を制御することができる。

VISAライブラリを使えば計測機器(オシロスコープ、周波数発振器、安定化電源、などなど)をPCから制御できる。

簡単なサンプルコードをご紹介します。

VISAライブラリをインストールする

IVI.netを取得する。

インストールすると、デフォルトで下記のdllファイルが作成される。

C:\Program Files\IVI Foundation\VISA\VisaCom64\Primary Interop Assemblies\Ivi.Visa.Interop.dll

使用する計測機器によってそのメーカー毎にVISAライブラリがインストールできる。

・National Instruments製⇒NI-VISA

・菊水製⇒KI-VISA

・Keysight Technologies製⇒Keysight VISA

・Rohde & Schwarz製⇒R&S VISA

参照に追加する

C#.NETでプロジェクトの参照を追加するに上記のDLLライブラリファイルを追加する。

sansyoutuika_ivivisa

インターフェースのセットアップ

PCと繋ぐインターフェースを計測機器側で設定しておくこと。

RS232C,USB,GPIBなど、機器ごとに接続できるインターフェースが決まっている。

SCPIコマンド

基本のコマンドみたいなものがある。

IEEE488.2共通コマンド

*CLS ステータスデータ構造体をクリアします。
*ESE イベントステータスイネーブルレジスタビットを設定します。
*ESR イベントステータスレジスタを問い合わせます。
*IDN 識別ストリングを問い合わせます。(製造業者の情報)
*OPC 待機中が検出された装置のすべての動作が終了すると、装置は操作完了メッセージをイベントステータスレジスタに生成します。
*RCL メモリに保存した内容を読み出します。
*RST 装置のリセット。
*SAV 現在の設定をメモリに保存します。
*SRE サービスリクエストイネーブルレジスタビットを設定します。
*STB ステータスバイトとマスタサマリステータスビットを読み取ります。
*TRG トリガコマンド
*TST 自己診断の実行
*WAI 待機中の動作なしフラグが「真」になるまで、以降のコマンドやクエリを実行しないようにします。

 

この共通コマンド以外にその計測器の独自のコマンドがあります。

それは、取説やユーザーマニュアル等に記載されています。

サンプルコード

今回は、菊水製の電子負荷装置をUSB接続した場合のサンプルコードを載せます。

画面デザイン

sample_screendesign

ソースコード

using Ivi.Visa.Interop;
using System;
using System.Data;
using System.Globalization;
using System.Linq;
using System.Windows.Forms;

namespace Sample_VISA
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public const string vid = "0x0B3E";  //ベンダーID 菊水
        

        /// <summary>
        /// ロード  オン
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            ResourceManager rm = new ResourceManager();
            FormattedIO488 msg = new FormattedIO488();

            //USB接続の場合で、I/Oリソースを探してリストの最初のものを接続できるようにした。
            string[] instruments = rm.FindRsrc("USB[0-9]?*::INSTR");
            var visaad = instruments.Where(usbid => usbid.Contains(vid)).ToList();  //ベンダーIDを元に指定検索
            //Open
            msg.IO = (IMessage)rm.Open(visaad[0], AccessMode.NO_LOCK, 0, "");   //1つ目の計測機器visaad[0],2つ目visaad[1]・・・

            //I/Oリソース表示
            textBox1.Text = visaad[0];

            //ID問合せ
            msg.WriteString("*IDN?");   //IEEE488.2共通コマンド *IDN?・・・ID(識別番号)問合せ

            //responseデータ取得
            string response = msg.ReadString();  //読出し

            //response結果表示
            textBox2.Text = response;

            //Close
            msg.IO.Close();

        }

        /// <summary>
        /// ロードON
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            ResourceManager rm = new ResourceManager();
            FormattedIO488 msg = new FormattedIO488();

            string[] instruments = rm.FindRsrc("USB[0-9]?*::INSTR");
            var visaad = instruments.Where(usbid => usbid.Contains(vid)).ToList();  //ベンダーIDを指定検索
            msg.IO = (IMessage)rm.Open(visaad[0], AccessMode.NO_LOCK, 0, "");
            
            msg.WriteString("FUNC:MODE CC");    //モード設定
            msg.WriteString("CURR:RANG HIGH");  //レンジ設定
            msg.WriteString("CURR 10.0");       //電流値設定
            msg.WriteString("INP 1");           //ロードON

            msg.IO.Close();
        }

        /// <summary>
        /// ロードOFF
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            ResourceManager rm = new ResourceManager();
            FormattedIO488 msg = new FormattedIO488();

            string[] instruments = rm.FindRsrc("USB[0-9]?*::INSTR");
            var visaad = instruments.Where(usbid => usbid.Contains(vid)).ToList();  //ベンダーIDを指定検索
            msg.IO = (IMessage)rm.Open(visaad[0], AccessMode.NO_LOCK, 0, "");

            msg.WriteString("INP 0");             //ロードOFF

            msg.IO.Close();
        }


        /// <summary>
        /// 電流、電力、電圧の測定
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button4_Click(object sender, EventArgs e)
        {
            ResourceManager rm = new ResourceManager();
            FormattedIO488 msg = new FormattedIO488();

            string[] instruments = rm.FindRsrc("USB[0-9]?*::INSTR");
            var visaad = instruments.Where(usbid => usbid.Contains(vid)).ToList();  //ベンダーIDを指定検索
            msg.IO = (IMessage)rm.Open(visaad[0], AccessMode.NO_LOCK, 0, "");

            //////////////////////
            /// SampleCommand ////
            //////////////////////

            //電流値測定
            msg.WriteString("MEAS:CURR?");            //書込み
            string response_curr = msg.ReadString();  //読出し
            //電力値測定
            msg.WriteString("MEAS:POW?");             //書込み
            string response_pow = msg.ReadString();   //読出し
            //電圧値測定
            msg.WriteString("MEAS:VOLT?");            //書込み
            string response_volt = msg.ReadString();  //読出し

            //Close
            msg.IO.Close();

            //実数(指数)で返ってくる場合は、整数に変換する。
            decimal res_curr = decimal.Parse(response_curr, NumberStyles.Float);
            decimal res_pow = decimal.Parse(response_pow, NumberStyles.Float);
            decimal res_volt = decimal.Parse(response_volt, NumberStyles.Float);

            //Result
            textBox3.Text = res_curr.ToString();
            textBox4.Text = res_pow.ToString();
            textBox5.Text = res_volt.ToString();
        }
    }
}

 

*IDNコマンドを送信すると、

(例) 形名PLZ164W、製造番号AB123456、ROMバージョン1.00の場合

KIKUSUI,PLZ164W,AB123456,1.00

というレスポンス結果が返ってきます。

おまけ 接続インターフェース別の接続子方法

GPIB GPIB[board]::PrimaryAddress[::SecondaryAddress][::INSTR] 例:GPIB0に接続されたプライマリアドレス3の計測器の場合
GPIB0::3::INSTR
シリアル
(RS232C)
ASRL[board][::INSTR] 例:シリアルポートCOM1に接続された計測器の場合
ASRL1::INSTR
USB USB[board]::VendorID::ProductID::SerialNumber[::InterfaceNumber][::INSTR] 例:ベンダーID(VID)2878、プロダクトID(PID)4121、シリアルナンバー”00000001”を持つUSNTMC計測器の場合
USB0::0x0B3E::0x1019::00000001::INSTR

msg = rm.Open(“GPIB0::1::INSTR”, AccessMode.NO_LOCK, 0, “”)     ‘GPIBの書き方例

‘msg = rm.Open(“ASRL1::INSTR”, AccessMode.NO_LOCK, 0, “”)  ‘RS232Cを使用した例

‘msg = rm.Open(“USB0::0x0B3E::0x1019::00000001::INSTR”, AccessMode.NO_LOCK, 0, “”)  ‘USBを使用した例

‘msg = rm.Open(“MYDEV1”, AccessMode.NO_LOCK, 0, “”)  ‘VISAエイリアスを使用した例

まとめ

今回は、計測機器をPCから制御するVISA規格のSCPIコマンドについてご紹介しました。

業務で計測機器を使用することが多い人は、PCからの制御を作って置けば、簡単に計測が出来て、データもいちいちUSBなどで機器から吸い出さなくても、PCに飛んでくるのですぐに保存できたり、CSV出力できるようにプログラムを組んでおけばデータ分析も簡単になり、業務効率UPできますよ。