C#でコマンドの送受信プログラムを作ってみる
ためしに接続と送受信を行うアプリをVisualStudioのC# .NET Framework4.8のWindowsフォームアプリを作ってみます。まずは、Form1だけのまっさらな状態で、ソリューションエクスプローラーの参照を右クリックして参照の追加をします。
参照マネージャーで次の2つのDLLを追加します。
C:\Program Files (x86)\IVI Foundation\VISA\Microsoft.NET\Framework32\v4.0.30319\NI VISA.NET 22.5\NationalInstruments.Visa.dll
C:\Program Files (x86)\IVI Foundation\VISA\Microsoft.NET\Framework32\v2.0.50727\VISA.NET Shared Components 5.11.0\Ivi.Visa.dll
続いてForm1の画面にテキストボックスとボタンを追加して次の様な画面を作ります。
ボタンのクリックイベントに以下のような処理を記述します。
using System;
using System.Windows.Forms;
using Ivi.Visa;
using NationalInstruments.Visa;
namespace WindowsFormsNIVISA_Test
{
public partial class Form1 : Form
{
MessageBasedSession mbSession;
public Form1()
{
InitializeComponent();
}
private void Open_button_Click(object sender, EventArgs e)
{
using (var rmSession = new ResourceManager())
{
try
{
mbSession = (MessageBasedSession)rmSession.Open(VisaResourceName_textBox.Text);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
private void Close_button_Click(object sender, EventArgs e)
{
mbSession.Dispose();
}
private void Send_button_Click(object sender, EventArgs e)
{
mbSession.RawIO.Write(Command_textBox.Text);
}
private void Recieve_button_Click(object sender, EventArgs e)
{
try
{
Recieved_textBox.Text = mbSession.RawIO.ReadString();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
実行してVISAリソース名の欄に、先ほどのVISA Interactive Controlというソフトでメモしておいた文字列を記入して接続できると思います。
リモートOFFのコマンドがない機器をリモートOFFするには
菊水の電源にはリモートモードをOFFしローカルモードにする独自コマンド「SYSTem:COMMunicate:RLSTate LOCal」があるので、プログラムから機器のリモートモードをOFFすることがコマンドできます。ですが、NFのファンクションジェネレータのマニュアルをいくら見てもリモートをOFFするコマンドがありませんでした。そこでネットでやり方を検索したのですが、出てくるやり方は古い情報が多く、「VisaNS .NET クラスライブラリ」ってのを使用した例がちらほらでてきたくらい。ただ、このVisaNSというのはNI-VISA バージョン19.0の時点で廃止され、NI-VISA .NETに置き換えられたそうです。(うーん。意味がわかりません。。。最近のNI-VISAでは古いやり方は使えないってことか。。。)ってことで、色々試した結果次の方法でリモートモードをOFFすることができました。リモートOFFのボタンを作ってクリックイベントに次のような処理を書きました。
private void RemoteOff_button_Click(object sender, EventArgs e)
{
UsbSession session = new UsbSession(VisaResourceName_textBox.Text);
session.SendRemoteLocalCommand(RemoteLocalMode.Local);
session.Dispose();
}
コメント