C#外部機器と通信2 GPIB

C#外部機器通信の2回目はC#とGPIBです。C#とその他の通信インターフェースのプログラムを知りたい方は以下のリンクから見つけてください。
計測器でGPIBは最も歴史が長い通信インターフェースですので、多分一番多くの計測器に装備されています。
そのため、いまだにGPIBを使っている人は一番多いでしょう。
この記事ではC#でGPIB接続を使って外部機器と通信する方法を紹介ます。
1 GPIBの情報について
2018年現在でGPIBのデファクトスタンダードになっているのはNatinal Instruments社(NI社)のGPIB-USB-HSでしょうか。
この他にはKeysight社などが有名ですが、日本企業ではContec社などあります。
ContecのGPIBボードをこの前使いましたが、使い勝手は良いなと思いした。
GPIBをプログラミングしたいと思った人はGoogle検索したと思いますが、その情報の少なさに驚いたと思います。
日本語で唯一、C#とGPIBのプラグラムについて説明しているサイトはNI社のこのサイトです。
ちょっとこれだけだと初めての人にはきついですねー。私もかなりつらい思いをした記憶があります。
皆が何度も同じことを調べなくてもいいように、このブログでできるだけ簡単に、最短距離でGPIBプログラムができるように説明をしたいと思います。
2 ドライバインストール
この記事ではGPIBのインターフェースはGPIB-USB-HSを使うことを前提に説明します。
GPIB-USB-HSを使用する前にドライバーのインストールが必要です。もし、購入時のCDを持っていればそのCDが使えます。
もし持っていなければNI社のHPからNI-488.2というドライバーをダウンロードします。
NI-488.2はNI-488.3とかないです。NI-488.2しかないので間違いようがありません。もっとシンプルな名前でいい気がするんですけどね。
NIのサイトからOSとバージョンを選んでダウンロードします。(最新で130MBあります)
ダウンロードできたらNI-488.3を実行してください。
インストールの途中でインストールする機能の選択があります。
この時、必ず.NET Frameworkの最新版をインストールしてください。
階層の深いところにいますので気が付かず通り過ぎてしまうかもしれません。

これ以外ではデフォルトの設定のまま、インストールを行ってください。
3 クラスライブラリの追加
Visual Studioを起動して、新しプロジェクトを開きます。
プロジェクトの右上のソリューションエクスプローラツリーの中のソリューションの中のアプリケーションの中に参照設定と呼ばれるカテゴリがあります。

新規のリファレンスを追加するには、参照設定カテゴリを右クリックして参照の追加を選択します。
NIのGPIBライブラリを使用するには、NationalInstruments.CommonとNationalInstruments.VisaNSをプロジェクトに追加します。この二つのファイルはドライバやwindowsのバージョンによって場所が違うのでwindowsで検索してください。
4 コードの追加
コードエディタの画面に移動します。
ファイルの一番上にusing~の行が並んでいるのでその一番下に次の行を追加します。
using NationalInstruments.VisaNS;
上記の行を書き終わった後に赤線が出なければ多分問題はありません。
次はデザイナーに戻ってritchTextBoxとbuttonを追加します。

button1をダブルクリックしてコードエディタに移ります。
コードエディタのpublic partial class Form1 : Formの下に次の行を追加します。
private MessageBasedSession mbSession;
これはGPIBの通信に使うクラスで、上記はクラスの宣言を行っています。
次にbutton1_Clickなどの中に以下の3行を書きます。
mbSession=(MessageBasedSession)ResourceManager.GetLocalManager().Open("GPIB0::17::INSTR"); string responseString = mbSession.Query("*IDN?"); mbSession.Dispose();
上記のコードの1行目はGPIB経由で外部機器との通信を準備(Open)しています。
上の例ではGPIBのアドレスが17になっていますが、外部機器の設定に合わせて変えてください。
次にmbsession.Query()で外部機器へコマンドを送ります。
上の例では*IDN?コマンドを送りました。
これはGPIBの標準コマンドどの機器にも共通で使えます。
外部機器がこのコマンドを受け取ると機器の名前とシリアル番号が返信されます。
外部機器からの返信はそのままmbSession.Queryの引き数になり、responseStringに代入されます。
最後のmbSession.Dispose()で通信を終了します。
通常は通信の実行部分は突然の遮断に備えてtryで括ります。ここまでのプログラムを通して表示するとこのようになります。
using System; ・ ・ using System.Windows.Forms; using NationalInstruments.VisaNS; namespace WindowsFormsApplication1 { public partial class Form1 : Form { private MessageBasedSession mbSession; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { try { mbSession = (MessageBasedSession)ResourceManager.GetLocalManager().Open("GPIB0::17::INSTR"); richTextBox1.Text = mbSession.Query("*IDN?"); mbSession.Dispose(); } catch { MessageBox.Show("通信エラー"); } } } }
private MessageBasedSession mbSessionとtry,catchの中が追加した部分です。
5 実行
やっと実行です。
このプログラムを実行すると外部機器の情報とファームウェアバージョンなどが分かります。

まとめ
この記事ではC#とGPIB経由の外部機器との通信の方について紹介しました。
今回は機器のコマンドはとりあえずとして、C#で外部機器との通信をする部分のみ説明したので、まだ外部機器での測定はできていません。
次回は外部機器の機種を限定して具体的なプログラミングを説明します。
おまけ
プロジェクトを新規に作成してプログラムを作った場合「 アセンブリ参照が不足しています。 」とエラーが出ることがあります。
これはアプリケーションを右クリックしてプロパティの選択し、その中のフレームワークを「.NET Framework 4 Client Profile」から「.NET Framework 4」に変えると解決する場合があります。

ディスカッション
コメント一覧
はじめまして
プログラミング超初心者です。
こちらの記事の通りに実行を試みましたが、
実行画面でbutton1をクリックするとフリーズ(bottunが反応せず、実行画面を閉じることもできない)してしまいました。
一時停止して確認すると、
「ネイティブ フレームが呼び出し履歴の最初にあるため、式を評価できません。」
とありました。
シリアル番号が接続機器と異なる場合はこの現象は起こらずただ通信エラーとなります。
ケーブルや機器を変えて試しましたが同様の結果でした。
どのようにすればきちんと実行できるのでしょうか
こんにちは。
「ネイティブ フレームが呼び出し履歴の最初にあるため、式を評価できません。」というエラーですが、正直私もであったことが無く、答えを出せないでいます。
ただいくつかのWEBサイトの記述からすると、C#のデバッガがデバック情報を得られなかった時のメッセージ?かもしれません。そうだとするとフリーズの原因はまた別にありそうです。
実はこのページの情報は少し古くなっています。もしNIのGPIBケーブルを使われているなら最新版は別のコマンドが推奨されています。以下の記事で紹介してます。この際、最新のやり方を試してみてはいかがでしょうか。
https://kesoku-blog.com/?p=2011
またほかの記事ではプロジェクトのファイル一式を配布してますのでこれを土台に作ってみるのも手です。
https://kesoku-blog.com/?p=1949
(両方とも問題の直接的な解決法ではないですが、ごめんなさい)
返信ありがとうございます。
実は1か月ほど前まではこのプログラムで正常に作動していました。
ご指摘の通りどうやらvisual studioの更新が原因のようです。
https://kesoku-blog.com/?p=2011
このページ通りに試みようとしているのですが、それにあたって質問です。
(ここのページで質問してしまってすみません)
・ケーブルは新規に購入はしていないのでUSB-GPIB-HS+ではなくUSB-GPIB-HSです。
NI-488.2のversion20.0をこちらからインストールすればよいのでしょうか
https://www.ni.com/ja-jp/support/downloads/drivers/download.ni-488-2.html#345631
それ以降は同じ手順でできるのでしょうか
・Queryがなくなり、ReadとWriteで2段階に分けて書く、という認識であってますか?
USB-GPIB-HSでも同様の手順です。Version20.0でも(試していませんが、)同じだと思います。
またQueryが無い件についてはご認識されているやり方で問題ないはずです。
誤字です
通信新た―フェース
おっと。修正しました。