07-07-2019 06:12 AM
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と同じ感じ?)
07-07-2019 06:26 PM
平素よりNI製品をご愛顧頂きありがとうございます。
日本ナショナルインスツルメンツ技術部の上野です。
Ivi.Visaに関するドキュメントおよびサンプルは、デフォルトインストールでしたら下記の場所に保存されています。
ヘルプ: C:\Users\Public\Documents\National Instruments\NI-VISA\Documentation
サンプル: C:\Users\Public\Documents\National Instruments\NI-VISA\Examples\.NET
そのほかに下記のページも参考になるかと思います。
07-08-2019 11:55 AM
回答ありがとうございます
ご紹介いただきました文献は既に目を通していました
残念ながら内容が薄く、入門者には実用的な資料ではありませんでした
やはり従来のVisaNSに比べると著しく情報が少ないことが理解できました
サンプルを参考に次のような記述でそれっぽく動いた感じです
助言ありましたら是非よろしくお願いします
ResourceManager rm = new ResourceManager();
MessageBasedSession inst = (MessageBasedSession)rm.Open(VISAアドレス);
inst.RawIO.Write("*IDN?");
string response = inst.RawIO.ReadString();
07-08-2019 08:01 PM
資料不足で申し訳ございません。今後資料を増やすようにしていきたいと思います。
コード部分ですが、リソースを解放するDisposeがプログラムの最後に実行されれば問題ないと思いますので、サンプルコードでご確認いただけると幸いです。
07-16-2019 02:02 AM
おじゃまします。
VisaNS.NETクラスライブラリって廃止予定なのですね!
良い勉強になりました。
NI-VISA - Windows用19.0 Readme
https://www.ni.com/pdf/manuals/374899k_0112.html
09-08-2019 01:48 AM
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クラスライブラリでも大きめのバッファサイズを指定しないとデータが途中で途切れました)
09-09-2019 03:22 PM
ご質問の回答は以下のとおりです。
・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インジケータまたは終端文字に達するまでバイトを読み取ります。確実に読み取れるバイト数を指定すれば問題ありません。
09-22-2019 06:52 AM
簡潔に回答いただきありがとうございます
文献も沢山紹介いただき助かります
・SCPIコマンドによる基本的な通信
単純な通信や、データを受け取った側で解析する場合はRawIOで良いのですね
FormattedIOは使いこなすといろいろできそうな雰囲気を感じます
今後勉強してみたいと思います
バッファサイズについてはRawIO使用時は気にしなくて良いでしょうか
・VISAリソース(GPIB,USB)抽出
Disposeを持つものは確実な解放が必要と理解しました
new ResourceManager()で処理するとResourceManagerが残ってしまいますか?
09-22-2019 10:11 PM
> バッファサイズについてはRawIO使用時は気にしなくて良いでしょうか
バッファサイズは事前に設定しておけばいい設定ですので、RawIO使用時は気にしなくていいと思います。
> new ResourceManager()で処理するとResourceManagerが残ってしまいますか?
コンストラクタで新しいインスタンスを作成した場合は残りますので、使用し終わったらDisposeするか、実行開始時に開いているセッションをDisposeとしていただければと思います。
11-02-2019 09:31 AM
バッファサイズですが、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を使う手もあるのかもしれません
間違ってるかもしれませんが、一応動いている感じです