VISAを使ってPCからオシロスコープ(DS1054Z)を制御する

DS1054Zからデータをリアルタイムに取得したくなったので、色々探してみたら「VISA」というものを使って計測器を制御したり計測器からデータを取得できるようです。
VISAといってもクレジットカードではなくて、「Virtual Instrument Software Architecture」の略みたいです。

DS1054ZはPythonで制御されているものが多く見られましたので、とりあえずPythonで動かしてみます。
あと、ナショナルインスツルメンツ等から提供されているVISAのライブラリを使えばC#等でも制御できるのでそれもやってみました。

スポンサーリンク

Rigol DS1054Z のプログラミングガイド

計測器、ここではオシロスコープ、にコマンドを送ることで制御したり、データを取得することができます。
本記事のプログラムで使っている *IDN? というのがオシロスコープに送るコマンドで、このコマンドであればIDを取得することができます。
通信が確立しているかの確認でよく使われています。
計測器によって固有の命令があるので各計測器の資料を見ることをおすすめします。
今回はRigolのDS1000Zシリーズですので、そのプログラミングガイドを見て命令を選びます。

Pythonでオシロスコープを制御する

Pythonであれば、PyVISAというパッケージがあります。

リファレンスもしっかりしているので制御が出来るようになるまでが非常に簡単でした。

以下は上記のリファレンスに載っているサンプルとは違いますが、自動でUSB接続されている機器のリソース名を取得してIDを表示するプログラムです。

import visa
rm = visa.ResourceManager()
instruments = rm.list_resources()
usb = filter(lambda x: 'USB' in x, instruments)
if len(usb) != 1:
	print 'Bad instrument list', instruments
	sys.exit(-1)
scope = rm.open_resource(usb[0])
print(scope.query("*IDN?"))

これでエラーが出なければ制御やデータ取得は簡単にできます。
query を使えばはデータの取得ができ、write を使えば機器の制御ができます。

C#でオシロスコープを制御する

ナショナルインスツルメンツ(NI-VISA)やキーサイト・テクノロジーのVISAライブラリ(IOライブラリ・スイート)を使えば、C#でも制御できます。

ただ、私の環境ではなぜかNI-VISAが使えなかったので、キーサイトの方を使いました。
NI-VISAの方はなぜか資料がほとんど見つけられませんでしたし、そもそも必要なdllが存在しないという・・・。
キーサイトの方は日本語で公式から資料を出してくれているので簡単にプログラムを作ることができました。

投げやりで申し訳ないですが、詳細は上記リンクを見てもらえれば導入から使い方までほとんどがわかると思います。

前述のPythonのプログラムと同じように自動でIDを取得するには下記のようなプログラムにします。

private void button1_Click(object sender, EventArgs e)
{
  ResourceManager rm = new ResourceManager();
  FormattedIO488 inst = new FormattedIO488();
  String[] instruments = rm.FindRsrc("?*::INSTR");
  inst.IO = rm.Open(instruments[0]);
  inst.WriteString("*IDN?");
  Trace.WriteLine(inst.ReadString());
}

このままコピペするだけでは動きませんが、だいたいこんな感じだと思って下さい。

C#で製作中のロガー

現在はC#を用いて簡単なロガーを製作中です。
製作中のアプリケーション
取得するデータやオシロの設定を選べるようになっていますが、最低限のものしか入れない予定です。

オシロを使ったロガーであれば、電圧と同時に周波数なども取得ができるので便利だと思います。
ただスケールが適切でないとちゃんと測定できないので、周波数応答などの自動測定は難しそうです。

スポンサーリンク

Leave a Comment

  • 長谷田

    はじめまして.
    本記事に掲載されていたプログラムを参考にさせていただいた,長谷田と申します.
    私もDS1054Zを所有しており,USB対応のIDN取得スクリプトを探していたので,大変ありがたく思っております.
    さて,スクリプトについてですが,7行目のusb=・・・の部分は,4行目のif len(usb)・・・の前に記述した方が良いのではと考えます.
    ご記載のスクリプトを試したところ,usbが定義されていないとのデバッグエラーが表示されましたので,上述した処置をとったところ,無事プログラムが機能しました.
    それでは、失礼致します.

    1. たまさ Post author

      ご指摘ありがとうございます。
      修正致しました。