java 使用jna连接kpci-1847(847)等板卡(继电器相关)

一天调俩硬件,都是jna的功劳啊  哈哈

上代码

JNA代理类(代理kpci800.dll

 

package xingyang.meam.kpci;

import java.io.File;

import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;

public interface KPCIDevice extends StdCallLibrary {
	File f = new File("");

	KPCIDevice INSTANCE = (KPCIDevice) Native.loadLibrary(f.getAbsolutePath()
			+ "\\kpci800", KPCIDevice.class);

	/**
	 * 该函数负责打开板卡的设备对象
	 * 
	 * @param iIndex
	 *            指定KPCI板卡的设备序号,0对应第一个设备
	 * @return
	 */
	boolean OpenDevice(long iIndex);

	/**
	 * 功能: 该函数负责关闭板卡的设备对象 参数:
	 * 
	 * @param iIndex
	 *            与OpenDevice中的相同
	 */
	void CloseDevice(long iIndex);

	/**
	 * 从端口读入一个字节
	 * 
	 * @param iIndex
	 *            与OpenDevice中的相同
	 * @param dich
	 *            为开关量输入的地址
	 * @return 读取的单字节数据
	 */
	int ReadByte(long iIndex, int dich);

	/**
	 * 该函数负责打开指定板卡型号的设备对象
	 * 
	 * @param iIndex
	 *            指定KPCI板卡的设备序号,0对应第一个设备
	 * @param boardtype
	 *            指定KPCI板卡的型号,这里只能是840、843、844、845、846、847、848。
	 * @return
	 */
	boolean OpenmDevice(long iIndex, long boardtype);
}

 运行类

 

 

package xingyang.meam.kpci;

public class KPCIMain {

	public static void main(String[] args) {
		System.out.println("open:" + KPCIDevice.INSTANCE.OpenDevice(0));
		for (int i = 0; i < 1; i++) {
			int value = KPCIDevice.INSTANCE.ReadByte(0, i);
			if (value != 0) {
				System.out.println(i + "->" + Integer.toBinaryString(value) + ";");
			}
		}
		KPCIDevice.INSTANCE.CloseDevice(0);
		System.out.println("over!");
	}
}

 这里没啥注意的

 

大家看KPCIMain里for循环那段,发没发现只循环一次?  哈哈 ,我试了一下,不管 ReadByte的第二个参数传啥,返回值都一样

 

 

Integer.toBinaryString(value) 


结果是个8位2进制,每位代表一个继电器状态,大家自己看吧

 

附件是直接可运行的java工程

导入eclipse就行

 

 

你可能感兴趣的:(java)