Java程控基础篇

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程控的文件夹里(这个文件夹的地址和名字,根据自己的情况进行设置),然后进行解压。如下图所示:

图-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问题图

这有可能是虽然我们命名了文件类型是.java,但原本的.txt扩展名被隐藏了,也就是这个文档还是.txt文档,我们需要取消隐藏的扩展名,并将.txt删除。点击计算机->组织->文件夹和搜索选项->查看,然后取消隐藏的扩展名,如下图所示:

图-取消隐藏扩展名图

第七步:运行程序 #

在命令窗口中输入:java Main,并按下回车键。

运行程序后,如下图所示:

图-运行程序图

下边输出中显示的就是仪器标识。