Java中jna的用法


(1)jna是對jni的封裝,讓java使用者能更好的使用本地的動態庫

(2)使用jna需要下載jna的jar包,該jar包就是對jni的封裝,所以在調用效率上來講,jna是要比jni低一點的,不過對於大多數項目來說,沒有很直觀的體現。

(3)將jar包添加到項目中后,寫一個接口類,用來和動態庫建立聯系,並聲明動態庫中的方法,具體的代碼如下:

package com.wxyz.lib_to_java;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.ptr.ByteByReference;
import com.sun.jna.ptr.FloatByReference;

public interface DllInterface extends Library {
	public static String dllName = "EduDeltaDLL(64)";// 動態庫名字

	DllInterface INSTANCE = (DllInterface) Native.loadLibrary(dllName, DllInterface.class);// 動態庫實例

	public String SearchBrobot();// 搜索可用的串口,以字符串的形式返回

	public int ConnectBrobot(String comName, int baudrate);// 通過制定的串口和波特率跟機械臂連接

	public void DisConnectBrobot();// 斷開和機械臂的連接

	public void SetCmdTimeOut(int cmdTimeOut);// 設置讀寫超時的時間

	public void SetCmdRepeat(int repeatNum);// 設置讀寫超時或者錯誤時,重發次數

	public int SetJointAccelerationAndSpeed(float[] acc, float[] vec);// 設置關節加速度和速度

	public int GetJointAccelerationAndSpeed(float[] acc, float[] vec);// 獲取關節加速度和速度

	public int SetJointGoalAngleValue(byte MoveMethod, float value, float[] goalangle);// 設置關節的目標角度

	public int GetJointCurrentAngleValue(float[] currentangle);// 獲取關節的目標角度

	public int GetJointCurrentStatus(byte[] currentstatus);// 獲取關節的當前運動狀態

	public int SetTerminalVectorSpeed(float[] Speedxyz);// 設置執行端的速度向量

	public int GetTerminalVectorSpeed(float[] Speedxyz);// 獲取執行端的速度向量

	public int SetTerminalAverageSpeed(float averagespeed);// 設置執行端的速度標量

	public int GetTerminalCurrentCoordinate(float[] currentcoor);// 獲取執行端當前的坐標

	public int SetTerminalGoalCoordinate(byte MoveMethod, float value, float[] goalcoor);// 設置執行端的目標坐標

	public int GetArmCurrentStatus(ByteByReference movementstatus);// 獲取機械臂的運動狀態(三個關節都靜止狀態才是靜止,否則狀態為運動)
	
	public int SetJointAngleAndCoordinateIncrement(float[] increment);//設置機械臂的關節角度和執行端坐標的增量步長。
	
	public int GetJointAngleAndCoordinateIncrement(float[] increment);//獲取機械臂的關節角度和執行端坐標的增量步長。
	
	public int SetJointAngleOrCoordinateStep(byte movestep);//設置關節角度或者執行端坐標變化的步數(增加/減小一次,調用一次)
	
	public int SetArmPenHeight(float penheight);//機械臂台筆的高度
	
	public int GetArmPenHeight(FloatByReference penheight);//獲取機械臂的抬筆高度
	
	public int SetPaintPictureNumber(float scaling, float[] offset, short picnum);//設置寫字畫畫時,圖片的縮放比,x,y 軸偏移量和圖片編號
	
	public int SetArmPaintMovementSignal(byte movsignal);//設置寫字繪畫時機械臂動作信號
	
	public int GetArmPaintMovementSignal(ByteByReference movsignal);//獲取寫字繪畫時機械臂動作信號
	
	public int SetLaserLevelValue(byte[] levelvalue);//設置激光的等級值
	
	public int GetLaserLevelValue(byte[] levelvalue);//獲取激光的等級值
	
	public int SetEngravePictureNumber(float scaling, float[] offset, short picnum);//設置激光雕刻時,圖片的縮放比,x,y 軸偏移量和圖片編號
	
	public int SetArmEngraveMovementSignal(byte movsignal);//設置激光雕刻時機械臂動作信號
	
	public int GetArmEngraveMovementSignal(ByteByReference movsignal);//獲取激光雕刻時機械臂動作信號
	
	public int SendEngravePathData(byte laserlevel, byte pathtype,float[] goalcoor);//向嵌入式端發送激光雕刻的圖片的路徑數據
	
	public int SetGoalCoordinateTrajectoryLine(byte movMethod, float value,float[] goalcoor);//設置目標坐標(以直線運動到目標點)
	
	public int SetGoalCoordinateTrajectoryDoor(float doorheight, float speedrate, float[] goalcoor);//設置目標坐標(以門型軌跡運動到目標點)
	
	public int SetTrajectoryMovementSpeed(float speed);//設置軌跡運動的速度
	
	public int SendTrajectoryData(byte ex,byte flag,float[] goalcoor);//發送軌跡數據
	
	public int SetCommandQueueExecuteMethod(byte type);//設置指令隊列的運行方式
	
	public int SetCommandQueueDownloadMethod(byte type);//設置指令隊列的下載方式
	
	public int ClearCommandQueue(byte type);//通知控制器清空指令隊列
	
	public int GetCommandQueueInformation(byte type,ByteByReference information);//獲取指令隊列的信息
}

(4)這里需要注意的是,參數在動態庫跟java方法之間傳遞的時候,需要遵循數據格式的轉換,實質上java所用的參數類型所使用的內存空間一定要滿足動態庫中的參數需要的控件,無論是指針還是結構體還是引用,jna包中封裝了很多數據格式轉換的類,比如java中沒有的指針,引用,結構體,在 這個包中都有相關的類來實現。

(5)使用java類來實現接口中的方法,給程序用代碼如下:

package com.wxyz.lib_to_java;

import com.sun.jna.ptr.ByteByReference;
import com.sun.jna.ptr.FloatByReference;

/**
 * Java控制機械臂控制器接口類
 * 
 * @author dengchaoqun
 * @version 1.0
 *
 */
public class ArmControlInterface {
	public static final int BRobotConnect_NoError = 0;// 串口正常連接
	public static final int BRobotConnect_NotFound = 1;// 沒有找到控制器
	public static final int BRobotConnect_Occupied = 2;// 表示控制器被占用
	public static final int BRobotConnect_Error = 3;// 連接錯誤
	public static final int PACKETTXRXSUCCEED = 4;// 函數正常執行
	public static final int TXTIMEOUT = 5;
	public static final int TXFAIL = 6;
	public static final int RXTIMEOUT = 7;
	public static final int RXFAIL = 8;
	public static final int ILLEGALPACEKTLENGTH = 9;
	public static final int CHECKSUMERROR = 10;
	public static final int UNKNOWNERROR = 11;
	public static final int WARNINGTAG = 12;
	public static final int FEEDBACKPACKETERROR = 13;

	public static final byte COORDINATE_X_UP = 0x12;// 表示x增加一個步長
	public static final byte COORDINATE_X_DOWN = 0x13;// 表示x減小一個步長
	public static final byte COORDINATE_Y_UP = 0x14;// 表示y增加一個步長
	public static final byte COORDINATE_Y_DOWN = 0x15;// 表示y減小一個步長
	public static final byte COORDINATE_Z_UP = 0x16;// 表示z增加一個步長
	public static final byte COORDINATE_Z_DOWN = 0x17;// 表示z減小一個步長
	public static final byte JOINT_S1_UP = 0x22;// 表示關節s1角度增加一個步長
	public static final byte JOINT_S1_DOWN = 0x23;// 表示關節s1角度減小一個步長
	public static final byte JOINT_S2_UP = 0x24;// 表示關節s2角度增加一個步長
	public static final byte JOINT_S2_DOWN = 0x25;// 表示關節s2角度減小一個步長
	public static final byte JOINT_S3_UP = 0x26;// 表示關節s3角度增加一個步長
	public static final byte JOINT_S4_DOWN = 0x27;// 表示關節s3角度減小一個步長

	public static final byte STOP = 0x00;// 寫字畫畫激光雕刻停止動作
	public static final byte START = 0x01;// 寫字畫畫激光雕刻開始執行動作
	public static final byte PAUSE = 0x02;// 寫字畫畫激光雕刻暫停動作

	public static final byte TIME_MOVE_METHOD = 0x01;// 以時間的方式運動到目標位置
	public static final byte SPEED_MOVE_METHOD = 0x02;// 以速度的運動方式來運動到終點

	public static final byte POINT_TYPE_START = 0x6D;// 路徑點的起點
	public static final byte POINT_TYPE_COMMOM = 0x6c;// 除起點外的路徑點

	/**
	 * 獲取本機的串口信息,串口名字
	 * 
	 * @return String[]數組里的元素表示可用的串口
	 */
	public static String[] searchBRobotCom() {
		String msg = DllInterface.INSTANCE.SearchBrobot();
		String[] coms = msg.split(" ");
		return coms;// 搜索可用的串口,以字符串
	}
	
	/**
	 * 通過制定串口跟機械臂控制器連接
	 * 
	 * @param name
	 *            串口名
	 * @param baudrate
	 *            波特率
	 * @return 連接狀態 0表示連接控制器成功 1表示未找到控制器 2表示控制器接口被占用
	 */
	public static int connectBRobotCom(String name, int baudrate) {
		int statusID = DllInterface.INSTANCE.ConnectBrobot(name, baudrate);
		return statusID;
	}

	/**
	 * 設置讀寫超時的時間
	 * 
	 * @param cmdTimeOut
	 *            單位為毫秒,如果沒有設置,默認為1ms
	 */
	public static void setCmdTimeOut(int cmdTimeOut) {
		DllInterface.INSTANCE.SetCmdTimeOut(cmdTimeOut);
	}

	/**
	 * 設置讀寫超時或者錯誤時,重發次數
	 * 
	 * @param times
	 *            超時重發次數,如果沒有設置,默認的為100次
	 */
	public static void setCmdRepeat(int times) {
		DllInterface.INSTANCE.SetCmdRepeat(times);
	}

	/**
	 * 斷開和機械臂控制器的連接
	 */
	public static void disConnectBRobotCom() {
		DllInterface.INSTANCE.DisConnectBrobot();
	}

	/**
	 * 設置關節加速度和速度
	 * 
	 * @param acc
	 *            acc長度為3,分別對應關節1,2,3的加速度
	 * @param vec
	 *            vec長度為3,分別對應關節1,2,3的速度
	 * @return 狀態碼 如果返回的是4 PACKETTXRXSUCCEED,表示正確的執行,其它狀態參照本類頂部的狀態碼
	 */
	public static int setJointAccelerationAndSpeed(float[] acc, float[] vec) {
		int status = DllInterface.INSTANCE.SetJointAccelerationAndSpeed(acc, vec);
		return status;
	}

	/**
	 * 獲取關節的速度和加速度
	 * 
	 * @return Object類型,如果是屬於Integer類型,則代表出現了錯誤,如果是float[]數組類型,則表示結果返回正常,其中float
	 *         []長度為6,分別對應關節1,2,3的加速度和關節1,2,3的速度。
	 */
	public static Object getJointAccelerationAndSpeed() {
		float[] acc = new float[] { 0, 0, 0 };
		float[] vec = new float[] { 0, 0, 0 };
		int status = DllInterface.INSTANCE.GetJointAccelerationAndSpeed(acc, vec);
		if (status != PACKETTXRXSUCCEED) {
			return status;
		} else {
			float[] speed = new float[acc.length + vec.length];
			System.arraycopy(acc, 0, speed, 0, acc.length);
			System.arraycopy(vec, 0, speed, acc.length, vec.length);
			return speed;
		}
	}

	/**
	 * 設置關節的目標角度
	 * 
	 * @param MoveMethod
	 *            運動方式,為1時表示以時間的方式運動到目標位置,為2時表示以速度的方式運動到目標位置
	 * @param value
	 *            當MoveMethod=1時,value表示時間,當MoveMethod=2時,此時value的值無效
	 * @param goalangle
	 *            長度為3的float數組,數組的三個元素分別表示關節1,2,3的目標角度
	 * @return 狀態碼 如果返回的是4 PACKETTXRXSUCCEED,表示正確的執行,其它狀態參照本類頂部的狀態碼
	 */
	public static int setJointGoalAngleValue(byte MoveMethod, float value, float[] goalangle) {
		int status = DllInterface.INSTANCE.SetJointGoalAngleValue(MoveMethod, value, goalangle);
		return status;
	}

	/**
	 * 獲取關節的目標角度
	 * 
	 * @return Object類型,如果是屬於Integer類型,則代表出現了錯誤,返回的是狀態碼,如果是float[]數組類型,則表示結果返回正常
	 *         ,其中float數組的長度為3,分別對應關節1,2,3當前的角度值
	 */
	public static Object getJointCurrentAngleValue() {
		float[] currentangle = new float[] { 0, 0, 0 };
		int status = DllInterface.INSTANCE.GetJointCurrentAngleValue(currentangle);
		if (status != PACKETTXRXSUCCEED) {
			return status;
		} else {
			return currentangle;
		}
	}

	/**
	 * 獲取關節的當前運動狀態
	 * 
	 * @return Object類型,當返回類型為int類型的時候,表示出現了錯誤,返回錯誤碼;當返回類型為長度為3的byte[]的時候,
	 *         數組元素值分別對應關節1,2,3當前運動狀態,1表示運功,0表示靜止
	 */
	public static Object getJointCurrentStatus() {
		byte[] currentstatus = new byte[] { (byte) 0, (byte) 0, (byte) 0 };
		int status = DllInterface.INSTANCE.GetJointCurrentStatus(currentstatus);
		if (status != PACKETTXRXSUCCEED) {
			return status;
		} else {
			return currentstatus;
		}
	}

	/**
	 * 設置執行端的速度向量
	 * 
	 * @param Speedxyz
	 *            長度為3的float數組,數組元素分別對應執行端x,y,z的速度
	 * @return 狀態碼 PACKETTXRXSUCCEED表示函數正常執行完,其他的返回碼分別對 應不同的錯誤,請參見錯誤列表。
	 */
	public static int setTerminalVectorSpeed(float[] Speedxyz) {
		int status = DllInterface.INSTANCE.SetTerminalVectorSpeed(Speedxyz);
		return status;
	}

	/**
	 * 獲取執行端的速度向量
	 * 
	 * @return Object
	 *         當返回值類型為int使表示發生了錯誤,返回的是錯誤碼;當返回值為長度為3的float[]類型時,數組元素分別表示執行端x,y,
	 *         z的速度
	 */
	public static Object getTerminalVectorSpeed() {
		float[] speedxyz = new float[] { 0, 0, 0 };
		int status = DllInterface.INSTANCE.GetTerminalVectorSpeed(speedxyz);
		if (status != PACKETTXRXSUCCEED) {
			return status;
		} else {
			return speedxyz;
		}
	}

	/**
	 * 設置執行端的速度標量
	 * 
	 * @param averagespeed
	 *            表示對應執行端的一個標量速度
	 * @return 狀態碼 PACKETTXRXSUCCEED表示函數正常執行完,其他的返回碼分別對 應不同的錯誤,請參見錯誤列表。
	 */
	public static int setTerminalAverageSpeed(float averagespeed) {
		int status = DllInterface.INSTANCE.SetTerminalAverageSpeed(averagespeed);
		return status;
	}

	/**
	 * 獲取執行端當前的坐標
	 * 
	 * @return Object
	 *         當返回值類型為int使表示發生了錯誤,返回的是錯誤碼;當返回值為長度為3的float[]類型時,數組元素分別表示執行端坐標x,y,
	 *         z的值
	 */
	public static Object getTerminalCurrentCoordinate() {
		float[] currentcoor = new float[] { 0, 0, 0 };
		int status = DllInterface.INSTANCE.GetTerminalCurrentCoordinate(currentcoor);
		if (status != PACKETTXRXSUCCEED) {
			return status;
		} else {
			return currentcoor;
		}
	}

	/**
	 * 設置執行端的目標坐標
	 * 
	 * @param MoveMethod
	 *            表示運動方式 ,1表示以時間的方式運動到目標位置,2表示以速度的方式運動到指定位置
	 * @param value
	 *            表示時間或者速度 ,當MoveMethod=1時,value表示時間;當MoveMethod=2時,value表示速度
	 * @param goalcoor
	 *            表示執行端x,y,z的坐標
	 * @return 狀態碼 PACKETTXRXSUCCEED表示函數正常執行完,其他的返回碼分別對 應不同的錯誤,請參見錯誤列表。
	 */
	public static int setTerminalGoalCoordinate(byte MoveMethod, float value, float[] goalcoor) {
		int status = DllInterface.INSTANCE.SetTerminalGoalCoordinate(MoveMethod, value, goalcoor);
		return status;
	}

	/**
	 * 獲取機械臂的運動狀態(三個關節都靜止狀態才是靜止,否則狀態為運動)
	 * 
	 * @return Object 當返回值類型為int使表示發生了錯誤,返回的是錯誤碼;如果返回值是byte類型,當值為1表示運動,0表示靜止
	 */
	public static Object getArmCurrentStatus() {
		ByteByReference b = new ByteByReference();
		int status = DllInterface.INSTANCE.GetArmCurrentStatus(b);
		if (status != PACKETTXRXSUCCEED) {
			return status;
		} else {
			return b.getValue();
		}
	}

	/**
	 * 設置機械臂的關節角度和執行端坐標的增量步長。
	 * 
	 * @param increment
	 *            長度為2的float數組,increment[1]表示關節角度的增量步長,increment[2]表示執行端坐標的增量步長
	 * @return 狀態碼 PACKETTXRXSUCCEED表示函數正常執行完,其他的返回碼分別對 應不同的錯誤,請參見錯誤列表。
	 */
	public static int setJointAngleAndCoordinateIncrement(float[] increment) {
		int status = DllInterface.INSTANCE.SetJointAngleAndCoordinateIncrement(increment);
		return status;
	}

	/**
	 * 獲取機械臂的關節角度和執行端坐標的增量步長
	 * 
	 * @return Object
	 *         當返回值類型為int使表示發生了錯誤,返回的是錯誤碼;如果返回值是長度為2的float[]類型,數組元素分別表示關節角度的增量步長
	 *         ,執行端坐標的增量步長。
	 */
	public static Object getJointAngleAndCoordinateIncrement() {
		float[] increment = new float[] { 0, 0 };
		int status = DllInterface.INSTANCE.GetJointAngleAndCoordinateIncrement(increment);
		if (status != PACKETTXRXSUCCEED) {
			return status;
		} else {
			return increment;
		}
	}

	/**
	 * 設置關節角度或者執行端坐標變化的步數(增加/減小一次,調用一次)
	 * 
	 * @param movestep
	 *            可選值有:COORDINATE_X_UP 表示x增加一個步長,COORDINATE_X_DOWN
	 *            表示x減小一個步長,COORDINATE_Y_UP 表示y增加一個步長,COORDINATE_Y_DOWN
	 *            表示y減小一個步長,COORDINATE_Z_UP 表示z增加一個步長,COORDINATE_Z_DOWN
	 *            表示z減小一個步長,JOINT_S1_UP 表示關節s1角度增加一個步長,JOINT_S1_DOWN
	 *            表示關節s1角度減小一個步長,JOINT_S2_UP 表示關節s2角度增加一個步長,JOINT_S2_DOWN
	 *            表示關節s2角度減小一個步長,JOINT_S3_UP 表示關節s3角度增加一個步長,JOINT_S4_DOWN
	 *            表示關節s3角度減小一個步長
	 * @return 狀態碼 PACKETTXRXSUCCEED表示函數正常執行完,其他的返回碼分別對 應不同的錯誤,請參見錯誤列表
	 */
	public static int setJointAngleOrCoordinateStep(byte movestep) {
		int status = DllInterface.INSTANCE.SetJointAngleOrCoordinateStep(movestep);
		return status;
	}

	/**
	 * 設置機械臂台筆的高度
	 * 
	 * @param penheight
	 *            float類型的高度值
	 * @return 狀態碼 PACKETTXRXSUCCEED表示函數正常執行完,其他的返回碼分別對 應不同的錯誤,請參見錯誤列表
	 */
	public static int setArmPenHeight(float penheight) {
		int status = DllInterface.INSTANCE.SetArmPenHeight(penheight);
		return status;
	}

	/**
	 * 獲得機械臂台筆的高度
	 * 
	 * @return Object 當返回值類型為int使表示發生了錯誤,返回的是錯誤碼;如果返回值是float類型,則表示返回的機械臂台筆的高度
	 */
	public static Object getArmPenHeight() {
		FloatByReference penheight = new FloatByReference();// 指針參數,表示傳入高度的地址
		int status = DllInterface.INSTANCE.GetArmPenHeight(penheight);
		if (status != PACKETTXRXSUCCEED) {
			return status;
		} else {
			float h = penheight.getValue();
			return h;
		}
	}

	/**
	 * 設置寫字畫畫時,圖片的縮放比,x,y 軸偏移量和圖片編號
	 * 
	 * @param scaling
	 *            float類型表示圖片相對於原圖的縮放比
	 * @param offset
	 *            長度為2的float數組類型,表示圖片相對於原圖的縮放比例,offset[1]表示x軸的偏移量,offset[2]
	 *            表示y軸的偏移量
	 * @param picnum
	 *            表示圖片的編號,高字節表示圖片的類別,低字節表示圖片編
	 * @return 狀態碼 PACKETTXRXSUCCEED表示函數正常執行完,其他的返回碼分別對 應不同的錯誤,請參見錯誤列表
	 */
	public static int setPaintPictureNumber(float scaling, float[] offset, short picnum) {
		int status = DllInterface.INSTANCE.SetPaintPictureNumber(scaling, offset, picnum);
		return status;
	}

	/**
	 * 設置寫字繪畫時機械臂動作信號
	 * 
	 * @param movsignal
	 *            機械臂動作信號,可選信號有:STOP表示停止動作,START表示開始動作,PAUSE表示暫停動作
	 * @return 狀態碼 PACKETTXRXSUCCEED表示函數正常執行完,其他的返回碼分別對 應不同的錯誤,請參見錯誤列表
	 */
	public static int setArmPaintMovementSignal(byte movsignal) {
		int status = DllInterface.INSTANCE.SetArmPaintMovementSignal(movsignal);
		return status;
	}

	/**
	 * 獲取寫字繪畫時機械臂動作信號
	 * 
	 * @return Object 當返回值類型為int使表示發生了錯誤,返回的是錯誤碼;如果返回值是byte類型則表示寫字畫畫時的動作信號;0x00
	 *         表示停止動作,0x01 表 示開始執行動作,0x02 表示暫停動作
	 */
	public static Object getArmPaintMovementSignal() {
		ByteByReference b = new ByteByReference();
		int status = DllInterface.INSTANCE.GetArmPaintMovementSignal(b);
		if (status != PACKETTXRXSUCCEED) {
			return status;
		} else {
			return b.getValue();
		}
	}

	/**
	 * 設置激光的等級值
	 * 
	 * @param levelvalue
	 *            長度為2的byte[],數組元素分別對應激光功率FirSca和SecSca的值
	 * @return 狀態碼 PACKETTXRXSUCCEED表示函數正常執行完,其他的返回碼分別對 應不同的錯誤,請參見錯誤列表
	 */
	public static int setLaserLevelValue(byte[] levelvalue) {
		int status = DllInterface.INSTANCE.SetLaserLevelValue(levelvalue);
		return status;
	}

	/**
	 * 獲取激光的等級值
	 * 
	 * @return Object 當返回值類型為int使表示發生了錯誤,返回的是錯誤碼;如果返回值是長度為2的byte[]類型,
	 *         數組元素分別表示激光功率FirSca和SecSca的值,ThirdSca 默認對應滿功率值100
	 */
	public static Object getLaserLevelValue() {
		byte[] levelvalue = new byte[] { 0, 0 };
		int status = DllInterface.INSTANCE.GetLaserLevelValue(levelvalue);
		if (status != PACKETTXRXSUCCEED) {
			return status;
		} else {
			return levelvalue;
		}
	}

	/**
	 * 設置激光雕刻時,圖片的縮放比,x,y 軸偏移量和圖片編號
	 * 
	 * @param scaling
	 *            表示圖片相對於原圖的縮放比例
	 * @param offset
	 *            表示圖片相對於默認位置的偏移量;offset[0]表示x 軸的偏移量, offset[1]表示y 軸的偏移量
	 * @param picnum
	 *            picnum 表示圖片的編號,高字節表示圖片的類別,低字節表示圖片編 號
	 * @return PACKETTXRXSUCCEED 表示函數正常執行完,其他的返回碼分別對 應不同的錯誤,請參見錯誤列表
	 */
	public static int setEngravePictureNumber(float scaling, float[] offset, short picnum) {
		int status = DllInterface.INSTANCE.SetEngravePictureNumber(scaling, offset, picnum);
		return status;
	}

	/**
	 * 設置激光雕刻時機械臂動作信號
	 * 
	 * @param movsignal
	 *            機械臂動作信號,可選信號有:STOP表示停止動作,START表示開始動作,PAUSE表示暫停動作
	 * @return PACKETTXRXSUCCEED 表示函數正常執行完,其他的返回碼分別對 應不同的錯誤,請參見錯誤列表
	 */
	public static int setArmEngraveMovementSignal(byte movsignal) {
		int status = DllInterface.INSTANCE.SetArmEngraveMovementSignal(movsignal);
		return status;
	}

	/**
	 * 獲取激光雕刻時機械臂動作信號
	 * 
	 * @return Object 當返回值類型為int使表示發生了錯誤,返回的是錯誤碼;如果返回值是byte類型則表示寫字畫畫時的動作信號;0x00
	 *         表示停止動作,0x01 表 示開始執行動作,0x02 表示暫停動作
	 */
	public static Object getArmEngraveMovementSignal() {
		ByteByReference b = new ByteByReference();
		int status = DllInterface.INSTANCE.GetArmEngraveMovementSignal(b);
		if (status != PACKETTXRXSUCCEED) {
			return status;
		} else {
			return b.getValue();
		}
	}

	/**
	 * 向嵌入式端發送激光雕刻的圖片的路徑數據
	 * 
	 * @param laserlevel
	 *            表示激光功率的等級,0x00 表示關閉激光頭,0x01 表示 FirSca,0x02 表示SecSca,0x03
	 *            表示ThirdSca 最大功率
	 * @param pathtype
	 *            表示的是路徑的類型,m 表示路徑的起點;l 表示路徑點(調用 時使用十六進制的ASCII
	 *            值:m(0x6D),l(0x6C))
	 * @param goalcoor
	 *            長度為3的float[],數組元素分別對應目標點的x,y,z 的坐標
	 * @return PACKETTXRXSUCCEED 表示函數正常執行完,其他的返回碼分別對 應不同的錯誤,請參見錯誤列表
	 */
	public static int sendEngravePathData(byte laserlevel, byte pathtype, float[] goalcoor) {
		int status = DllInterface.INSTANCE.SendEngravePathData(laserlevel, pathtype, goalcoor);
		return status;
	}

	/**
	 * 設置目標坐標(以直線運動到目標點)
	 * 
	 * @param movMethod
	 *            表示運動方式,當moveMethod為TIME_MOVE_METHOD時,表示以時間的方式運動到目標位置;
	 *            當moveMethod為SPEED_MOVE_METHOD時, 表示以速度的方式運動到目標位置
	 * @param value
	 *            表示時間或者速度,當moveMethod為TIME_MOVE_METHOD時,表示時間;
	 *            當moveMethod為SPEED_MOVE_METHOD時,此時value值無效。
	 * @param goalcoor
	 *            表示執行端x,y,z的坐標。
	 * @return PACKETTXRXSUCCEED 表示函數正常執行完,其他的返回碼分別對 應不同的錯誤,請參見錯誤列表
	 */
	public static int setGoalCoordinateTrajectoryLine(byte movMethod, float value, float[] goalcoor) {
		int status = DllInterface.INSTANCE.SetGoalCoordinateTrajectoryLine(movMethod, value, goalcoor);
		return status;
	}

	/**
	 * 設置目標坐標(以門型軌跡運動到目標點)
	 * 
	 * @param doorheight
	 *            表示門型運動中門的高度
	 * @param speedrate
	 *            表示速度的倍率;當速度的倍率為1.0時,機械臂會以最快的
	 *            速度從當前位置以門型的方式運動到目標位置;speedrate存在最大倍 率和最小倍率
	 * @param goalcoor
	 *            表示執行端目標位置的x,y,z的坐標。
	 * @return PACKETTXRXSUCCEED 表示函數正常執行完,其他的返回碼分別對 應不同的錯誤,請參見錯誤列表。
	 */
	public static int setGoalCoordinateTrajectoryDoor(float doorheight, float speedrate, float[] goalcoor) {
		int status = DllInterface.INSTANCE.SetGoalCoordinateTrajectoryDoor(doorheight, speedrate, goalcoor);
		return status;
	}

	/**
	 * 設置軌跡運動的速度
	 * 
	 * @param speed
	 *            speed表示軌跡運動中機械臂每秒走過的距離,speed存在最大值和最 小值
	 * @return PACKETTXRXSUCCEED 表示函數正常執行完,其他的返回碼分別對 應不同的錯誤,請參見錯誤列表。
	 */
	public static int setTrajectoryMovementSpeed(float speed) {
		int status = DllInterface.INSTANCE.SetTrajectoryMovementSpeed(speed);
		return status;
	}

	/**
	 * 發送軌跡數據
	 * 
	 * @param ex
	 *            ex 表示對軌跡數據的處理方式。當ex=0 時,表示存儲軌跡數據;當 ex=1 時,表示執行軌跡數據;當ex=2
	 *            時,表示執行已經存儲好的軌 跡數據
	 * @param flag
	 *            表示的是路徑的類型,POINT_TYPE_START 表示路徑的起點;POINT_TYPE_COMMON 表示路徑點
	 * @param goalcoor
	 *            表示執行端目標位置的x,y,z的坐標。
	 * @return PACKETTXRXSUCCEED 表示函數正常執行完,其他的返回碼分別對 應不同的錯誤,請參見錯誤列表。
	 */
	public static int sendTrajectoryData(byte ex, byte flag, float[] goalcoor) {
		int status = DllInterface.INSTANCE.SendTrajectoryData(ex, flag, goalcoor);
		return status;
	}

	/**
	 * 設置指令隊列的運行方式
	 * 
	 * @param type
	 *            type表示指令隊列的運行方式 當type=0x01時,表示啟動指令隊列,依次運行隊列中的指令
	 *            當type=0x02時,表示停止指令隊列運行,不過機械臂會將當前指令執 行完才丟棄后續的指令
	 *            當type=0x03時,表示立刻停止指令隊列運行,此時機械臂會終止當前 指令的執行,並丟棄后續的指令
	 * @return PACKETTXRXSUCCEED 表示函數正常執行完,其他的返回碼分別對 應不同的錯誤,請參見錯誤列表。
	 */
	public static int setCommandQueueExecuteMethod(byte type) {
		int status = DllInterface.INSTANCE.SetCommandQueueExecuteMethod(type);
		return status;
	}

	/**
	 * 設置指令隊列的下載方式
	 * 
	 * @param type
	 *            type表示指令隊列的下載控制方式 當type=0x01時,表示啟動指令隊列下載,將指令隊列下載到控制器的 外部flash中
	 *            當type=0x02時,表示停止指令隊列下載,用於告訴控制器指令隊列已 經發送完畢
	 *            當type=0x03時,表示立刻取消指令隊列的下載,此時機械臂可能會還 沒有接收完指令隊列
	 * @return PACKETTXRXSUCCEED 表示函數正常執行完,其他的返回碼分別對 應不同的錯誤,請參見錯誤列表。
	 */
	public static int setCommandQueueDownloadMethod(byte type) {
		int status = DllInterface.INSTANCE.SetCommandQueueDownloadMethod(type);
		return status;
	}

	/**
	 * 通知控制器清空指令隊列
	 * 
	 * @param type
	 *            type對應清理的位置 type=0x00表示清除所有空間的指令隊列 type=0x01表示清空控制器RAM中的指令隊列
	 *            type=0x02表示清空控制器外部flash中的指令隊列
	 * @return PACKETTXRXSUCCEED 表示函數正常執行完,其他的返回碼分別對 應不同的錯誤,請參見錯誤列表。
	 */
	public static int clearCommandQueue(byte type) {
		int status = DllInterface.INSTANCE.ClearCommandQueue(type);
		return status;
	}

	/**
	 * 獲取指令隊列的信息
	 * 
	 * @param type
	 *            type 表示需要獲取的信息類型 當type=0x01 時,表示獲取當前指令在指令隊列中的索引位置 ,當type=0x02
	 *            時,表示獲取用於存放指令隊列的RAM剩余的空間 (注:這里是按照一個指令包的內存空間作為單位的,不是以字節 作為單位的)
	 * @return 當返回類型為int類型時,PACKETTXRXSUCCEED 表示函數正常執行完,其他的返回碼分別對
	 *         應不同的錯誤,請參見錯誤列表。當返回值為byte類型時,type=0x01時可返回當前指令在指令隊列中的索引位置,當type=
	 *         0x02時表示獲取用於存放指令隊列的RAM剩余的空間
	 */
	public static Object getCommandQueueInformation(byte type) {
		ByteByReference b = new ByteByReference();
		int status = DllInterface.INSTANCE.GetCommandQueueInformation(type, b);
		if (status != PACKETTXRXSUCCEED) {
			return status;
		} else {
			return b.getValue();
		}
	}
}

在java程序中,我們直接調用這個類里面的方法都可以了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM