Java程控基础篇 #
操作系统: Windows 7 IDE:无 Visa版本: 17.5 通信方式: LAN
在开发之前请确保已配置visa开发环境,参考 Visa开发环境搭建 。
本例使用程控命令“*IDN?\n“,其功能是输出仪器标识。运行本例程序后,会在下方输出得到的仪器标识:“Ceyear Technologies,3672A,,2.1.2”。下面具体介绍整个实现过程。
第一步:下载JDK并配置开发环境 #
我使用的版本为:jdk-8u40-windows-x64。
本篇中,我并没有使用IDE工具。
第二步:下载jna-4.0.0.jar #
从网上下载jna-4.0.0.jar后,把它放到D盘一个名为java程控的文件夹里(这个文件夹的地址和名字,根据自己的情况进行设置),然后进行解压。如下图所示:
第三步:编写VISA32接口 #
在名为java程控的文件夹里新建一个文本文档,并命名为VISA32.java,输入以下代码:
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.NativeLong;
import com.sun.jna.ptr.LongByReference;
public interface VISA32 extends Library
{
VISA32 INSTANCE = (VISA32) Native.loadLibrary("C:/Windows/System32/visa32.dll", VISA32.class);
public static final long VI_NULL = 0;
public static final long VI_SUCCESS = 0;
public int viOpenDefaultRM(LongByReference session);//打开VISA资源管理器
public int viOpen(NativeLong viSession, String rsrcName,NativeLong accessMode, NativeLong timeout,LongByReference session);//打开仪器
public int viClose(NativeLong vi);//关闭仪器
public int viScanf(NativeLong vi, String readFmt, Object... args);//按设定格式从器件中读取数据
public int viPrintf(NativeLong vi, String writeFmt, Object... args);//按设定格式将数据传送到器件中
public int viSetAttribute(NativeLong vi,long a ,long b);
}
第四步:编写Instrument接口 #
在名为java程控的文件夹里新建一个文本文档,并命名为Instrument.java,输入以下代码:
import com.sun.jna.Library;
import com.sun.jna.Memory;
import com.sun.jna.Native;
import com.sun.jna.NativeLong;
import com.sun.jna.ptr.LongByReference;
public class Instrument {
LongByReference defaultSession;
LongByReference vipSession;
VISA32 visa32 = VISA32.INSTANCE;
//定义一个打开VISA资源管理器和仪器的方法
public boolean open()
{
defaultSession = new LongByReference(0);
int result = visa32.viOpenDefaultRM(defaultSession);
if (result != VISA32.VI_SUCCESS) {
return false;
}
vipSession = new LongByReference(0);
// String cmd = "TCPIP0::172.16.1.201::inst0::INSTR";// VXI-11接口
// String cmd = "GPIB0::16::INSTR";// GPIB接口
// String cmd = "USB0::0x0525::0x1000::ZKC00523::INSTR";// USB接口
String cmd = "TCPIP0::172.16.1.201::5025::SOCKET";//网络接口
NativeLong a = new NativeLong(defaultSession.getValue());
NativeLong b = new NativeLong(0);
result = visa32.viOpen(a, cmd, b, b, vipSession);
if (result != VISA32.VI_SUCCESS) {
System.out.println(result);
return false;
}
return true;
}
//定义一个关闭VISA资源管理器和仪器的方法
public boolean close() {
NativeLong a = new NativeLong(vipSession.getValue());
int result = VISA32.INSTANCE.viClose(a);
if (result != VISA32.VI_SUCCESS) {
System.out.println(result);
return false;
}
NativeLong b = new NativeLong(defaultSession.getValue());
result = VISA32.INSTANCE.viClose(b);
if (result != VISA32.VI_SUCCESS) {
System.out.println(result);
return false;
}
return true;
}
//定义一个写入程控命令的方法
public boolean writeCmd(String cmdStr) {
long VI_ATTR_TERMCHAR=0x3FFF0018;
long VI_ATTR_TERMCHAR_EN=0x3FFF0038;
long VI_TRUE=1;
NativeLong a = new NativeLong(vipSession.getValue());
VISA32.INSTANCE.viSetAttribute(a, VI_ATTR_TERMCHAR , '\n');//设置结束符为\n。
VISA32.INSTANCE.viSetAttribute(a, VI_ATTR_TERMCHAR_EN, VI_TRUE);//启用结束符。VI_ATTR_TERMCHAR_EN为是否允许终止符
int result = VISA32.INSTANCE.viPrintf(a ,"%s\n",cmdStr);
if (result != VISA32.VI_SUCCESS) {
System.out.println(result);
return false;
}
return true;
}
//定义一个读取结果的方法
public String readResult() {
NativeLong a = new NativeLong(vipSession.getValue());
Memory mem = new Memory(200);
int result = VISA32.INSTANCE.viScanf(a ,"%t",mem);
if (result != VISA32.VI_SUCCESS)
{
System.out.println(result);
return null;
}
return mem.getString(0);
}
}
第五步:编写主程序 #
在名为java程控的文件夹里新建一个文本文档,并命名为Main.java,输入以下代码:
public class Main
{
public static void main(String[] args)
{
Instrument instrument=new Instrument();//实例化
instrument.open();//在第二步中我使用的是NI的visa库,所以这里是'ni',若使用agilent或者keysight的要做相应的改变。127.0.0.1为矢量网络分析仪的IP地址。这里使用的是我的配置,要根据自己的情况进行改动。
instrument.writeCmd("*IDN?");//写入程控命令
System.out.println(instrument.readResult());//输出得到的结果
instrument.close();
}
}
第六步:编译成可执行文件 #
因为我没有使用IDE工具,所以要用第七步和第八步来运行程序。
在名为java程控的文件夹里,按住shift键,右击空白的地方,选择“在此处打开命令窗口”。然后输入:javac -d . VISA32.java,按下回车键即可。依次输入:javac -d . Instrument.java、javac -d . Main.java,如下图所示:
**注意:**在进行这步操作时,如果出现下图的结果(这是我在操作过程中遇到的问题,所以记录了一下解决方案):
这有可能是虽然我们命名了文件类型是.java,但原本的.txt扩展名被隐藏了,也就是这个文档还是.txt文档,我们需要取消隐藏的扩展名,并将.txt删除。点击计算机->组织->文件夹和搜索选项->查看,然后取消隐藏的扩展名,如下图所示:
第七步:运行程序 #
在命令窗口中输入:java Main,并按下回车键。
运行程序后,如下图所示:
下边输出中显示的就是仪器标识。