C#编写GPIB与仪器通讯
1.前期准备
- 查找下载仪器的通讯手册(以SCPI命令为例),或者用户手册。
- 购买GPIB-USB卡(盗版GPIB卡会限制驱动的版本,具体版本按商家提供的安装)。
- 官网下载NI-VSIA,默认配置安装(下载NI-VISA - NI)。
- 根据GPIB卡,下载对应NI-488驱动程序,默认配置安装(下载NI-488.2 - NI)。
- 安装visual studio2022,选择.net以及.net framework有关配置进行安装。
- 在visual studio中创建Winform项目,模板选择Windows窗体应用(.NET Framework)。
- 选择.net framework4.8框架 。
- 在项目右键,点击添加-添加引用:Ivi.Visa.dll与Ivi.Visa.Interop.dll。
文件默认地址:
- Ivi.Visa.dll(“C:\Program Files\IVI Foundation\VISA\Microsoft.NET\Framework64\v2.0.50727\VISA.NET Shared Components 7.2.0\Ivi.Visa.dll”)
- Ivi.Visa.Interop.dll(“C:\Program Files\IVI Foundation\VISA\VisaCom64\Primary Interop Assemblies\Ivi.Visa.Interop.dll”)
- 环境配置完成。
2.代码编写
- 创建ResourceManager rm与FormattedIO488 fio两个对象。
ResourceManager
负责管理 VISA 资源的生命周期,并提供方法来打开、关闭和查询 VISA 资源。
FormattedIO488
对象用于发送命令到设备、读取设备的响应、配置设备的参数
- 创建string[] receresourceName与int GPIB_State两个变量。
receresourceName
用于存放GPIB设备号字符串。
GPIB_State
用于记录GPIB设备连接状态。
using Ivi.Visa.Interop;
...
//需要引用Ivi.Visa.Interop
ResourceManager rm = new ResourceManager();
FormattedIO488 fio =new FormattedIO488();
//导入设备地址,可以包含多个设备
//设备的地址可以在设置中查看并且修改
string[] receresourceName = { "GPIB::15::INSTR" ,"GPIB::16::INSTR" ... ...};
//0为未开启连接
int GPIB_State = 0;
...
- 创建一个连接设备按钮,编写连接仪器代码,使用rm.Open()函数建立连接。
rm.Open(resourceName,AccessMode,timeout,openDefaultRM )
resourceName:打开的VISA资源的名称,格式:GPIB::设备地址::INSTR。
AccessMode:指定了会话的访问模式,
AccessMode.NO_LOCK
通常意味着打开会话时不锁定资源,允许多个会话同时访问同一个资源。AccessMode.LOCK
,这表示打开会话时锁定资源,防止其他会话同时访问。
private void btn_Connect_Click(object sender, EventArgs e)
{
if(GPIB_State == 0)
{
try
{
fio.IO = (IMessageBasedSession)rm.Open(receresourceName[1], AccessMode.NO_LOCK, 0, "");
GPIB_State = 1;
btn_Connect.Text = "断开连接";
btn_Connect.BackColor = Color.Lime;
}
catch
{
MessageBox.Show("设备连接失败!");
}
}
else
{
session.Dispose();
GPIB_State = 0;
btn_Connect.Text = "打开连接";
btn_Connect.BackColor = Color.LightGray;
}
}
- 发送SCPI命令(具体命令查看仪器手册,以IT8908e大功率直流电子负载为例),使用writeString函数。读取仪器传输的信息,使用ReadString函数。
writeString(string Order);
Order:为字符串类型,是需要向仪器输入的SCPI指令。
ReadString();
ReadString函数会返回一个字符串类型数据,为仪器返回的数据。
执行ReadString函数之前,要先发送获取数据的指令
//一般仪器远程操作时,需要先发送远程操作命令
//这条命令可以写入到连接程序中
fio.WriteString("SYSTem:REMote\r\n");
发送命令示例:
private void btn_CC_Change_Click(object sender, EventArgs e)
{
//限制输入框输空白而导致错误
if (tb_CC_W.Text != "")
{
//限制输入框输入的数据大小,防止超过仪器能接受的最大值
if (Convert.ToInt32(tb_CC_W.Text) >= 100)
tb_CC_W.Text = "100";
//SCPI命令中的数值部分,从输入框获得
string Order = "CURRent " + tb_CC_W.Text + "\r\n";
//发送指令
fio.WriteString(Order);
}
}
接受数据示例:
private void btn_A_R_Click(object sender, EventArgs e)
{
//发送获取数据指令
fio.WriteString("CURRent?\r\n");
//接受仪器返回的数据
tb_A_W.Text=fio.ReadString();
}
控制多台设备原理基本一致,只需要添加设备的地址,按要求创建对象即可。
几台设备可以公用同一个ResourceManager
对象,无需再次创建。
创建新的FormattedIO488
对象即可