NI製品ディスカッション

cancel
Showing results for 
Search instead for 
Did you mean: 

NI-VISAのIVI.VISA.dllをVS2017 C#(WPF)で使用したい

VisualStudio2012 C#(WPF)でNI-VISAを使用していました

最近Windows10に移行したこともあってVS2017 C#(WPF)に開発環境を変更しました

NI-VISAも2017を導入しました

NI-VISAの使用に関してはVisaNS.NETクラスライブラリが非推奨とのコメントがあり、

IVI NI-VISAクラスライブラリに変更しようと思います

ところが新しいクラスライブラリに使用については資料が少なくよい文献が見つかっていません

どなたか紹介いただけないでしょうか

ちなみにメッセージベースの通信とローカル制御程度の使用を予定しています


自分が調べた新旧比較は次のようなものです

・参照DLL

(旧)NationalInstruments.Common.dll、NationalInstruments.VisaNS.dll

(新)Ivi.Visa.dll、NationalInstruments.Visa.dll

・using

(旧)NationalInstruments.VisaNS

(新)Ivi.Visa、NationalInstruments.Visa

・主な使い方

(旧)

MessageBasedSession inst;

inst = (MessageBasedSession)ResourceManager.GetLocalManager().Open(VISAアドレス);

inst.Write(SCPIコマンド);

string response = inst.Query(SCPIコマンド);

(新)

研究中

メッセージベースセッションの作り方が違うみたいです

また、Queryがないみたいなので .RawIO.Writeと.RawIO.ReadString()の組み合わせで

構成する感じ(Keysightと同じ感じ?)

 

0 Kudos
Message 1 of 9
(339 Views)

平素よりNI製品をご愛顧頂きありがとうございます。
日本ナショナルインスツルメンツ技術部の上野です。

 

Ivi.Visaに関するドキュメントおよびサンプルは、デフォルトインストールでしたら下記の場所に保存されています。

 

ヘルプ: C:\Users\Public\Documents\National Instruments\NI-VISA\Documentation
サンプル: C:\Users\Public\Documents\National Instruments\NI-VISA\Examples\.NET

 


そのほかに下記のページも参考になるかと思います。

0 Kudos
Message 2 of 9
(307 Views)

回答ありがとうございます

ご紹介いただきました文献は既に目を通していました

残念ながら内容が薄く、入門者には実用的な資料ではありませんでした

やはり従来のVisaNSに比べると著しく情報が少ないことが理解できました

 

サンプルを参考に次のような記述でそれっぽく動いた感じです

助言ありましたら是非よろしくお願いします

ResourceManager rm = new ResourceManager();

MessageBasedSession inst = (MessageBasedSession)rm.Open(VISAアドレス);

inst.RawIO.Write("*IDN?");

string response = inst.RawIO.ReadString();

 

0 Kudos
Message 3 of 9
(296 Views)

資料不足で申し訳ございません。今後資料を増やすようにしていきたいと思います。

 

コード部分ですが、リソースを解放するDisposeがプログラムの最後に実行されれば問題ないと思いますので、サンプルコードでご確認いただけると幸いです。

0 Kudos
Message 4 of 9
(289 Views)

おじゃまします。

VisaNS.NETクラスライブラリって廃止予定なのですね!
良い勉強になりました。

 

NI-VISA - Windows用19.0 Readme
https://www.ni.com/pdf/manuals/374899k_0112.html

0 Kudos
Message 5 of 9
(269 Views)

IVI NI-VISAクラスライブラリの使用についてここまでの調査結果と疑問点です

・SCPIコマンドによる基本的な通信

MessageBasedSession inst = (MessageBasedSession)(new ResourceManager()).Open(VISAアドレス);

inst.RawIO.Write("*IDN?");

string response = inst.RawIO.ReadString();

inst.Dispose();

上記ではResourceManagerを定義せず一行で表現しています

Queryは直接できないのでWrite+ReadStringで処理する感じでした

(疑問点)

1.RawIOではバッファサイズの指定方法が不明ですが、ReadStringやReadの中で定義すれば良いのでしょうか

2.RawIO以外にFormattedIOというものが存在しますが、どのように使用するのか、何に使用するのか全くわかりません

3.GlobalResourceManagerというものもありますが、上記ResourceManagerとの違いや使い分けが不明です

 

・VISAリソース(GPIB,USB)抽出

int i = 0;

var rs = (new ResourceManager()).Find("(GPIB|USB)?*INSTR");

var resource = new string[rs.Count<string>()];

foreach (string str in rs) resource[i++] = str;

VisaNS.NETクラスライブラリでは、

var resource = ResourceManager.GetLocalManager().FindResources("(GPIB|USB)?*INSTR");

でstring[]形式の情報が取得できたため、互換性を考慮して上記としています

一覧をIEnumerable<string>形式で取得するだけなら2行目のみでお終いです

Findの中身を変えれば好みのものを抽出できます

(疑問点)

1.使用したResourceManagerについて、Disposeの要否が不明です

 

・Local移行(Remote状態の解除)

GPIBの場合

GpibSession gpib = new GpibSession(VISAアドレス);

gpib.SendRemoteLocalCommand(GpibInstrumentRemoteLocalMode.GoToLocal);

gpib.Dispose();

USBの場合

UsbSession usb = new UsbSession(VISAアドレス);

usb.SendRemoteLocalCommand(RemoteLocalMode.Local);

usb.Dispose();

(疑問点)

1.それっぽいコマンドが沢山あって、これが適切なのか不明です

 

・計測器画面ハードコピーデータ(バイナリデータ)の保存

MessageBasedSession inst = (MessageBasedSession)(new ResourceManager()).Open(VISAアドレス);

inst.RawIO.Write(ハードコピー開始SCPIコマンド);

inst.TerminationCharacterEnabled = false;

File.WriteAllBytes(ファイル名, inst.RawIO.Read(最大ファイルサイズ));

inst.TerminationCharacterEnabled = true;

inst.Dispose();

オシロスコープなどを接続していると便利な機能です

最大ファイルサイズ(byte)を指定しないと1byteデータしか読み取らない様です

VisaNS.NETクラスライブラリでは、

MessageBasedSession inst;

inst = (MessageBasedSession)ResourceManager.GetLocalManager().Open(VISAアドレス);

inst.DefaultBufferSize = バッファサイズ;

inst.Write(ハードコピー開始SCPIコマンド)

inst.ReadToFile(ファイル名);

inst.Dispose();

という感じでやってました

(疑問点)

1.最大ファイルサイズは想定されるファイルサイズより大きめの数値を指定しておけば良いのでしょうか

(VisaNS.NETクラスライブラリでも大きめのバッファサイズを指定しないとデータが途中で途切れました)

 

 

0 Kudos
Message 6 of 9
(153 Views)

ご質問の回答は以下のとおりです。

 

・SCPIコマンドによる基本的な通信

A1. バッファサイズを設定するには、RawIOではなくFormattedIOメンバにあるReadBufferSizeやWriteBufferSizeプロパティを使用します。

 

A2. FormattedIOは、データの形式や構文解析、バッファ管理のメソッドやプロパティが含まれていおります。詳細については下記をご参照ください。
http://www.ivifoundation.org/docs/vpp436_2016-06-07.pdf#page=132

NI-VISA .NETライブラリによって提供されるクラスは、IVI Foundationによって提供されるIVI VISA .NETライブラリ(Ivi.Visa)で定義されているインターフェースを実装し、タイプを使用します。 IVI VISA .NETライブラリの詳細については、VPP-4.3.6仕様(http://www.ivifoundation.org/specifications/default.aspx)に記載されています。

 

A3. 同様のご質問が仕様を定義しているIVI Foundationに投稿されております。ベンダーに依存しないコードにしたい場合はGlobalResourceManagerを使用しコードの汎用性を高められるそうです。複数のベンダーを使用していらっしゃらないのでしたらResourceManagerでよいかと思います。 https://forums.ivifoundation.org/questions/794/which-resource-manager-do-you-recommend-to-use-to.htm...

 

 

・VISAリソース(GPIB,USB)抽出
A1. リソースにアクセスする必要がなくなったら、Disposeを呼び出してリソースを解放する必要があります。
これについては、NI-VISA .NET ヘルプファイルの目次タブ>>NI-VISA .NET Class Library >>Using the NI-VISA .NET Class Library >> Key NI-VISA .NET Library Featuresに記載されています。

 


・Local移行(Remote状態の解除)
A1. 記載されているメソッドで間違いありません。

 

 

・計測器画面ハードコピーデータ(バイナリデータ)の保存
A1.Read()は、ENDインジケータまたは終端文字に達するまでバイトを読み取ります。確実に読み取れるバイト数を指定すれば問題ありません。

0 Kudos
Message 7 of 9
(128 Views)

簡潔に回答いただきありがとうございます

文献も沢山紹介いただき助かります

 

・SCPIコマンドによる基本的な通信

単純な通信や、データを受け取った側で解析する場合はRawIOで良いのですね

FormattedIOは使いこなすといろいろできそうな雰囲気を感じます

今後勉強してみたいと思います

バッファサイズについてはRawIO使用時は気にしなくて良いでしょうか

 

・VISAリソース(GPIB,USB)抽出

Disposeを持つものは確実な解放が必要と理解しました

new ResourceManager()で処理するとResourceManagerが残ってしまいますか?

 

 

 

0 Kudos
Message 8 of 9
(69 Views)

> バッファサイズについてはRawIO使用時は気にしなくて良いでしょうか

バッファサイズは事前に設定しておけばいい設定ですので、RawIO使用時は気にしなくていいと思います。

 

> new ResourceManager()で処理するとResourceManagerが残ってしまいますか?

コンストラクタで新しいインスタンスを作成した場合は残りますので、使用し終わったらDisposeするか、実行開始時に開いているセッションをDisposeとしていただければと思います。

 

0 Kudos
Message 9 of 9
(54 Views)