NI製品ディスカッション

キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

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 件の賞賛
メッセージ1/11
7,594件の閲覧回数

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

 

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

 

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

 


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

0 件の賞賛
メッセージ2/11
7,562件の閲覧回数

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

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

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

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

 

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

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

ResourceManager rm = new ResourceManager();

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

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

string response = inst.RawIO.ReadString();

 

0 件の賞賛
メッセージ3/11
7,551件の閲覧回数

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

 

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

0 件の賞賛
メッセージ4/11
7,544件の閲覧回数

おじゃまします。

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

 

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

0 件の賞賛
メッセージ5/11
7,524件の閲覧回数

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 件の賞賛
メッセージ6/11
7,408件の閲覧回数

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

 

・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 件の賞賛
メッセージ7/11
7,383件の閲覧回数

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

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

 

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

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

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

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

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

 

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

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

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

 

 

 

0 件の賞賛
メッセージ8/11
7,324件の閲覧回数

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

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

 

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

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

 

0 件の賞賛
メッセージ9/11
7,309件の閲覧回数

バッファサイズですが、RawIOでは事前設定ができませんでした

未設定のままRawIO.ReadString()で読み込むとRawIO.Read()同様1024byteしか取り出せません

RawIO.Read()と同じ要領でRawIO.ReadString(読取りに必要なbyte数)という使い方になるようです

計測器の測定データ(スペアナ、ネットアナ、オシロ波形など)のASCIIデータ取得時には重要です

 

ResourceManagerの使い方ですが、

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

の様に使用するとResourceManagerをDisposeする機会を失います

var rm = new ResourceManager();

で処理をして最後にrm.Dispose();とできるようにしました

usingを使う手もあるのかもしれません

間違ってるかもしれませんが、一応動いている感じです

 

メッセージ10/11
7,216件の閲覧回数