Source Meter源表 (KEITHEY)2600系列,2612A程控开发(C++)
基本介绍
主要功能: 通过源表获取源表的测量数值,控制源表的量程等
使用库:VISA库
下载连接: https://download.ni.com/support/nipkg/products/ni-v/ni-visa/21.5/online/ni-visa_21.5_online.exe (安装之后可以使用IO Strace进行抓包, 方便调试)
连接方式: RS232
参考资料:2600AS-900-01_B-Sep2008_User 下载连接: https://download.tek.com/manual/2600AS-900-01_B-Sep2008_User.pdf
不知为啥源表通过LAN口连接不上,可以ping通,也可以进入设备操作网页,使用IO软件扫不到,遂转用RS232串口控制
使用RS232串口通过VISA库发送指令后,没有返回信息,但使用KeySight IO软件可以正常通信,查找资料后发现可以通过NI 的 IO Strace抓包(必须使用NI的VISA库, 使用Kyesight的Visa库抓不到),在网上找到一个labview的程序,发现可以抓到包,就对比了两个程序抓包后的数据,发现使用的发送函数不一样,刚开始我是通过viWrite函数直接发送数据的,通过抓包看可以发现viWrite是写入成功的,但是发送的指令仪器并没有反应,使用viRead函数也获取不到任何信息,使用 *IDN?命令也获取不到机器信息
查阅Visa库资料后发现还有viPrintf函数可以发送指令数据,遂使用viPrintf测试,发现可以发送,并正常接收数据
发送程序
QString cmd = ui->le_cmd->text();
qDebug() << "Send cmd: " << cmd;
status_ = viPrintf(cur_connect_instr_, "%s\n",cmd.toStdString().data());
if (status_ != VI_SUCCESS)
{
qDebug() << "error occur";
}
接收程序
char read_buf[512];
ViUInt32 recv_len = 1000; //设置读取长度
ViUInt32 recv_ret_len; //实际读取长度
status_ = viRead(cur_connect_instr_, (ViPBuf)read_buf, recv_len, &recv_ret_len);
if (status_ != VI_SUCCESS)
{
qDebug() << "Read error occur!";
return ;
}
qDebug() << "Recv len: " << recv_ret_len;
正常通信之后就是对2612A的控制,刚开始以为使用IEEE488指令就可以获取到仪器的数据,查阅参考手册后发现通过TSP命令控制/获取仪器数据
获取仪器电压测量数据程序:
bool VISA_2612A::getMeasureVoltage(double &_vol)
{
status_ = viPrintf(cur_connect_instr_, "print(smua.measure.v())\n");
if (status_ != VI_SUCCESS)
{
qDebug() << "error occur";
return false;
}
status_ = viRead(cur_connect_instr_, (ViPBuf)read_buf_, recv_len_, &recv_ret_len_);
if (status_ != VI_SUCCESS)
{
qDebug() << "Read error occur!";
return false;
}
qDebug() << "Recv len: " << recv_ret_len_;
read_buf_[recv_ret_len_] = '\0';
ui->te_recv->setText(read_buf_);
QString str_num = read_buf_;
bool ok = false;
_vol = str_num.toDouble(&ok);
if(ok)
{
return true;
}else
{
return false;
}
}
暂只写一个示例,其他可参考手册
程序下载: