【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ライブラリファイルを追加する。
インターフェースのセットアップ
PCと繋ぐインターフェースを計測機器側で設定しておくこと。
RS232C,USB,GPIBなど、機器ごとに接続できるインターフェースが決まっている。
SCPIコマンド
基本のコマンドみたいなものがある。
IEEE488.2共通コマンド
*CLS | ステータスデータ構造体をクリアします。 |
---|---|
*ESE | イベントステータスイネーブルレジスタビットを設定します。 |
*ESR | イベントステータスレジスタを問い合わせます。 |
*IDN | 識別ストリングを問い合わせます。(製造業者の情報) |
*OPC | 待機中が検出された装置のすべての動作が終了すると、装置は操作完了メッセージをイベントステータスレジスタに生成します。 |
*RCL | メモリに保存した内容を読み出します。 |
*RST | 装置のリセット。 |
*SAV | 現在の設定をメモリに保存します。 |
*SRE | サービスリクエストイネーブルレジスタビットを設定します。 |
*STB | ステータスバイトとマスタサマリステータスビットを読み取ります。 |
*TRG | トリガコマンド |
*TST | 自己診断の実行 |
*WAI | 待機中の動作なしフラグが「真」になるまで、以降のコマンドやクエリを実行しないようにします。 |
この共通コマンド以外にその計測器の独自のコマンドがあります。
それは、取説やユーザーマニュアル等に記載されています。
サンプルコード
今回は、菊水製の電子負荷装置をUSB接続した場合のサンプルコードを載せます。
画面デザイン
ソースコード
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できますよ。