using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

 /*
*********************************************************************************************************
*                                                ADT8949G1
*                                       The Motion Control PCI Card
*
*                                 (c) Copyright 2002-2014, ADTECH, Shenzhen, 
*                                           All Rights Reserved
*
*
* By      : ADTECH R&D 
* Remark  :
  1、ADT8949相对电脑而言属于慢速设备，任何查询API会对运动运算性能有一定影响，为减少控制卡的中断次数，尽量减少查询操作，
     如需连续查询，两次查询中间建议插入一条Sleep(1)语句。另外，例如要获取轴的驱动状态，使用get_status_all(…)进行合并
	 操作，一次性获取所有轴的状态，再按位值判断各驱动轴状态。
*********************************************************************************************************
*/

namespace Demo
{
   class adt8940a1
  {
    
/************************************************
功能：	初始化运动控制卡
返回值：返回值>0时，表示adt8949G1卡的数量。如果为3，则有效的卡号分别为0、1、2；
		返回值=0时，说明没有安装adt8949G1卡；
		返回值<0时，-1 表示没有安装端口驱动程序，
				    -2 表示PCI桥存在故障。
					-3 代表DSP程序下载错误
					-4 代表硬件异常或者DLL版本不匹配
					-5 创建互斥量失败
					-6 打开互斥量失败
					-7 其他异常原因
					-8 表示拨码开关设置出现重复，需手动调整拨码开关指向
************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_initial();

/************************************************
功能：	关闭控制卡资源
返回值：0成功,-1失败
备注：	调用该函数后，控制卡会自动复位，清除所有运动指令，并对所有输出点清零；
		使用VB6.0编程，执行程序退出时若不调用该函数可能造成编译器异常退出
************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_close_card();

/************************************************
功能：	获取当前库(dll)版本号
返回值：库(dll)版本的版本号,其中：
			bit0～bit15： 程序库版本号
			bit16～bit31：程序库类别号
备注：	举例：当获取到的库版本号为0，类别号为1，则当前库的版本号可显示为：1.0
		8949G1存在驱动库版本号和固件版本号两种版本信息，同一固件版本可能存在不同的驱动库发行版本，所以一旦进行问题追溯需注意两个版本号的信息。
************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_get_lib_version();

/************************************************
功能：	获取当前固件版本
参数:	cardno       卡号
返回值：返回值包含固件版本和卡ID两个信息,其中：
			bit0～bit15： DSP版本
			bit16～bit23：FPGA版本
			bit24～bit26：FPGA系列号(1为增强型系列ADT-8949G1，2为轨迹型系列ADT-8949B1，3为通用型系列ADT-8949A1)
			bit27～bit31：控制卡拨码ID号
备注：	举例：当获取到的FPGA系列号的系列号为1，FPGA版本为7，DSP版本为25，则固件版本可显示为：1.7.25
		8949G1存在驱动库版本号和固件版本号两种版本信息，同一固件版本可能存在不同的驱动库发行版本，所以一旦进行问题追溯需注意两个版本号的信息。
************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_get_firmware_ver(Int32 cardno);

/************************************************
功能：	获取当前可用卡的拨码开关号
参数：
	num		可用卡数量指针
	index	拨码开关号
返回值		0：正确					非0：错误 
备注：	初始化成功后便可调用该函数获得拨码开关号；
		按照靠近CPU的顺序,拨码开关号依次排列，例如index[0]代表最靠近CPU的拨码开关号，index[1]次之，…
************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_get_card_index(out Int32 num,Int32[] index);

/****************************************************
功能：获取系统最近一次错误号(待完善)
参数：
	cardno	    卡号
	ErrNum		系统错误号指针
备注: 可定时获取系统错误号，查看控制卡运行情况
******************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_get_syserr(Int32 cardno,out Int32 ErrNum);

/********************************************************
功能：读取通信错误次数
参数：
	cardno		卡号	      
	mode		0: 控制卡端		1：接线板端
ErrCount	通信错误次数指针
返回值		0：正确					非0：错误 
备注：	控制卡跟接线板在断电的情况才会把错误次数清零;
		通信错误次数不为0并不代表控制卡输出错误，校验不通过时通信数据会自动重发。
*********************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_get_communication_err(Int32 cardno,Int32 mode,out Int32 ErrCount);

/****************************************************
功能：复位控制卡
参数：
	cardno	    卡号
返回值			0：正确			-1：错误 
备注:  调用该函数后，控制会清除所有缓存事件及运动指令数据，若之前设置有同步轴，轴的同步关系也会清除,
	   但已经设置过的限位、加速度、齿轮比等运动参数不会清除，不需重新设置；
	   当机器碰到外部急停、正负限位、或非正常停止，或者一组数据量较大的缓存插补前，建议调用一次复位控制卡函数。	   
******************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_reset_card(Int32 cardno);

/************************************************
功能: 设定系统总速度倍率
参数:
	cardno       卡号
	rate		 倍率(0～2.0)
返回值: 0成功,-1失败
备注：调用该函数后，总速度倍率会立即刷新，所以如果变化率过大，会导致速度产生阶跃，理想的方式是定时的逐步设定，
	  产生一个加减速的效果；当设定倍率值为0时，相当于运动暂停的效果。
***********************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_rate1(Int32 cardno,float rate);

/***************************************************************
功能:  设定系统各轴速度倍率
参数:
	cardno      卡号
	axis		轴号：(1-4)，INPA_AXISREG，INPB_AXISREG
	rate		倍率(0～2.0)
返回值: 0成功,-1失败
备注：调用该函数后，轴的速度倍率会立即刷新，所以如果变化率过大，会导致速度产生阶跃，理想的方式是定时的逐步设定，
	  产生一个加减速的效果。
****************************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_rate2(Int32 cardno,Int32 axis,float rate);

/*****************************************************************
功能:	设定系统各轴电子齿轮比
参数:
	cardno      卡号
	axis		轴号(1-4)
	gear		齿轮比(1-10000)，值为机床运动1mm,控制卡需发送的脉冲个数
返回值: 0成功,-1失败
备注：齿轮比的值可以为浮点数
******************************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_gear(Int32 cardno, Int32 axis,float gear);

/**********************************************************
功能:	轴缓冲位置和逻辑位置同步
参数:
	cardno      卡号
	axismap		轴映射位，bit0表示1号轴，bit1表示2号轴，bit2表示3号轴，bit3表示4号轴
返回值: 0成功,-1 失败
备注：归零完、对刀完毕或一组插补运动前设置，有利于提高精确度。机器运动过程中切勿设置。
**********************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_syncpos(Int32 cardno, Int32 axismap);

/*************************************************
功能：设置输出脉冲的工作方式
参数：
	cardno	    卡号
	axis		轴号(1-4)
	value       0：CCW脉冲+CW脉冲方式   1：脉冲+方向方式   2：90°位相差2相脉冲（模拟编码器A+B相）
	logic		0：	正逻辑脉冲			1：负逻辑脉冲
	dir_logic	0：方向输出信号正逻辑	1：方向输出信号负逻辑
返回值			0：正确					-1：错误
默认模式：脉冲+方向，正逻辑脉冲，方向输出信号正逻辑
**************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_pulse_mode(Int32 cardno,Int32 axis,Int32 value,Int32 logic,Int32 dir_logic);

/*************************************************
功能：设置实际计数器(编码器输入)的工作方式
参数：
	cardno	    卡号
	axis		轴号(1-4)
	value       0：A/B脉冲输入	1：上/下（PPIN/PMIN）脉冲输入
	dir_logic	计数方向，0：输入信号方向正逻辑	1：输入信号方向负逻辑
返回值			0：正确					-1：错误
默认模式：A/B相脉冲输入，方向正逻辑
备注：设置为A/B相脉冲输入方式时，脉冲计数值为4倍频后的数据
**************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_actual_count_mode(Int32 cardno, Int32 axis, Int32 value,Int32 dir_logic);

/****************************************************
功能：设置正负方向限位输入nLMT信号的模式
参数：
	cardno	    卡号
	axis		轴号(1-4)
	v1          0：正限位有效			1：正限位无效
	v2          0：负限位有效			1：负限位无效
	logic       0：低电平有效			1：高电平有效
返回值			0：正确					非0：错误 
默认模式为：正限位有效，负限位有效，低电平有效
备注：特别注意v1、v2是等于0时为有效
*****************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_limit_mode(Int32 cardno, Int32 axis, Int32 v1, Int32 v2, Int32 logic);

/****************************************************
功能：设置stop0信号的有效/无效和逻辑电平
参数：
	cardno	    卡号
	axis		轴号(1-4)
	v           0：无效					1：有效
	logic       0：低电平有效			1：高电平有效
	admode		0：减速停止             1：立即停止
返回值			0：正确					-1：错误 
默认模式为：无效
备注：stop0信号即为机械原点,对应的XYZA四个轴分别是 XHM/IN12, YHM/IN13, ZHM/IN14, AHM/IN15
*****************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_stop0_mode(Int32 cardno, Int32 axis, Int32 v, Int32 logic, Int32 admode);

/****************************************************
功能：设置stop1信号的有效/无效和逻辑电平
参数：
	cardno	    卡号
	axis		轴号(1-4)
	v           0：无效					1：有效
	logic       0：低电平有效			1：高电平有效
	admode		0：减速停止             1：立即停止
返回值			0：正确					-1：错误 
默认模式为：无效
备注：stop1信号即为伺服原点或Z相信号,对应的XYZA四个轴分别是 IN44, IN45, IN46, IN47
******************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_stop1_mode(Int32 cardno, Int32 axis, Int32 v, Int32 logic, Int32 admode);

/****************************************************
功能：设置软件限位模式
参数：
	cardno			卡号
	axis			轴号(1-4)
	EnableFlag      0：无效			1：有效
	Ppos			正方向触发位置,单位为mm
	Npos			负方向触发位置,单位为mm
	admode			0：减速停止		1：立即停止
返回值				0：正确			-1：错误 
默认模式为：软件限位无效
*****************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_softlimit_mode(Int32 cardno, Int32 axis, Int32 EnableFlag, float Ppos, float Npos, Int32 admode);

/****************************************************
功能：设定输入信号模式(含正负限位、原点)
参数：
	cardno	    卡号
	axis		轴号(1-4)
	mode		模式		0：正限位	1：负限位	2：原点（或编码器Z相信号）
	port		快速输入端口号(0-18, 36-47), 255或-1：设置对应模式无效
				另外，四个驱动轴的编码器信号(A相、B相、Z相)对应的端口为：
					IN36～IN39:	A1...A4				
					IN40～IN43:	B1...B4		
					IN44～IN47:	Z1...Z4					
	logic		有效电平	0：低电平有效			1：高电平有效
	admode		限位有效时是否采用减速，0：减速停止；1：立即停止
返回值			0：正确					-1：错误 
备注：为方便机床限位、原点、伺服Z相信号的设置，已包装函数adt8949_set_limit_mode(…)、adt8949_set_stop0_mode(…)、adt8949_set_stop1_mode(…)
	  默认模式为：正限位低电平有效，负限位低电平有效，原点(或编码器Z相信号)信号无效；
	  正负限位暂仅支持立即停止模式；
	  归零时用到的原点或编码器Z相信号模式，不能同时启用，可以先设置回原点，再进行编码器Z相归零
*****************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_input_mode(Int32 cardno,Int32 axis,Int32 mode,Int32 port,Int32 logic,Int32 admode);

/****************************************************
功能：设置紧急停止模式
参数：
	cardno	    卡号
	port		快速输入端口号(0-18, 36-47), 255或-1：设置对应模式无效
	logic		有效电平	0：低电平有效			1：高电平有效
返回值			0：正确					-1：错误 
备注：默认紧急停止无效。外部急停一旦生效，需调用adt8949_reset_card(…)复位控制卡，否则即便急停有效电平已经解除，
	  调用任何运动指令都不会生效。
*****************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_emergency_stop_mode(Int32 cardno,Int32 port,Int32 logic);

/*************************************************
功能：设置位置锁存功能
参数：
	cardno	    卡号
	axis		轴号(1-4)，其中各轴指定对应端口为：
					1轴：IN12
					2轴：IN13
					3轴：IN14
					4轴：IN15
	logic		有效电平，单沿变时：0表示由高到低，1表示由低到高
						  双沿变时：0表示首次沿变由高到低，第二次沿变由低到高；1表示首次沿变由低到高，第二次沿变由高到低
	type		1表示单沿变锁存，2表示双沿变锁存
返回值			0：正确					-1：错误
默认模式：锁存功能无效
备注：位置锁存功能触发后，会同时记录沿变信号发生时的逻辑位置与实际位置。
	  该功能启用后，限当次使用，若需再次捕捉沿变发生时的位置，需确保已清除上一次锁存状态，并再次启用位置锁存功能。
*****************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_lock_position(Int32 cardno,Int32 axis,Int32 logic,Int32 type);


/*************************************************
功能：获取位置锁存状态
参数：
	cardno	    卡号
	axis		轴号(1-4)，其中各轴指定对应端口为：
					1轴：IN12
					2轴：IN13
					3轴：IN14
					4轴：IN15
	type		1表示需获取首次沿变时位置锁存状态，2表示需获取第二次沿变时位置锁存状态（针对双沿变位置锁存）
	v			0：锁存动作未发生，1：锁存动作已发生
返回值			0：正确					-1：错误
*****************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_get_lock_status(Int32 cardno,Int32 axis,Int32 type,out Int32 v);

/*************************************************
功能：获取位置锁存的位置
参数：
	cardno	    卡号
	axis		轴号(1-4)，其中各轴指定对应端口为：
					1轴：IN12
					2轴：IN13
					3轴：IN14
					4轴：IN15
	type		0x10：表示需获取首次沿变发生时的逻辑位置
				0x11：表示需获取首次沿变发生时的实际位置
				0x20：表示需获取第二次沿变发生时的逻辑位置（针对双沿变位置锁存）
				0x21：表示需获取第二次沿变发生时的实际位置（针对双沿变位置锁存）
	pos			需获取位置的指针
返回值			0：正确					-1：错误
*****************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_get_lock_position(Int32 cardno,Int32 axis,Int32 type,out long pos);

/*************************************************
功能：清除锁存状态
参数：
	cardno	    卡号
	axis		轴号(1-4)，其中各轴指定对应端口为：
					1轴：IN12
					2轴：IN13
					3轴：IN14
					4轴：IN15
返回值			0：正确					-1：错误
*****************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_clr_lock_status(Int32 cardno,Int32 axis);

/*************************************************
功能：设置扩展位置锁存功能
参数：
	cardno	    卡号
	axis		轴号(1-4)
	port		端口(17-18)
	logic		有效电平，单沿变时：0表示由高到低，1表示由低到高
						  双沿变时：0表示首次沿变由高到低，第二次沿变由低到高；1表示首次沿变由低到高，第二次沿变由高到低
	type		1表示单沿变锁存，2表示双沿变锁存
返回值			0：正确					-1：错误
默认模式：锁存功能无效
备注：位置锁存功能触发后，会同时记录沿变信号发生时的逻辑位置与实际位置。
	  该功能启用后，限当次使用，若需再次捕捉沿变发生时的位置，需确保已清除上一次锁存状态，并再次启用位置锁存功能。
*****************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_EXlock_position(Int32 cardno,Int32 axis,Int32 port,Int32 logic,Int32 type);

/*************************************************
功能：获取扩展位置锁存状态
参数：
	cardno	    卡号
	port		端口(17-18)
	type		1表示需获取首次沿变时位置锁存状态，2表示需获取第二次沿变时位置锁存状态（针对双沿变位置锁存）
	v			0：锁存动作未发生，1：锁存动作已发生
返回值			0：正确					-1：错误
*****************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_get_EXlock_status(Int32 cardno,Int32 port,Int32 type,out Int32 v);

/*************************************************
功能：获取扩展位置锁存的位置
参数：
	cardno	    卡号
	port		端口(17-18)
	type		0x10：表示需获取首次沿变发生时的逻辑位置
				0x11：表示需获取首次沿变发生时的实际位置
				0x20：表示需获取第二次沿变发生时的逻辑位置（针对双沿变位置锁存）
				0x21：表示需获取第二次沿变发生时的实际位置（针对双沿变位置锁存）
	pos			需获取位置的指针
返回值			0：正确					-1：错误
*****************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_get_EXlock_position(Int32 cardno,Int32 port,Int32 type,out long pos);

/*************************************************
功能：清除扩展锁存状态
参数：
	cardno	    卡号
	port		端口(17-18)
返回值			0：正确					-1：错误
*****************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_clr_EXlock_status(Int32 cardno,Int32 port);

/****************************************************
功能：设定输入信号滤波等级
参数：
	cardno	    卡号
	gp			输入信号类别  
				0：限位、原点、普通输入点
				1：编码器信号（A相，B相，Z相）
	grade		范围:0-15。0表示不滤波。若设为n，则滤波时间为：2的(n-1)次方us(微秒)
返回值			0：正确					-1：错误 
备注：默认模式为所有输入信号不滤波。该函数是否有效需查看固件版本。
*****************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_input_filter(Int32 cardno,Int32 gp,Int32 grade);

//----------------------------------------------------//
//               驱动状态检查函数                     //
//----------------------------------------------------//

/*****************************************************
功能：获取各轴的驱动状态
参数：
	cardno	    卡号
	axis		轴号(1-4)
	v           驱动状态指针
				0：驱动结束				1：正在驱动
返回值			0：正确					-1：错误 
备注：该函数属于查询API,如需连续查新，两次查询中间建议插入一条Sleep(1)语句。
******************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_get_status(Int32 cardno,Int32 axis,out Int32 v);

/*****************************************************
功能：获取所有轴的驱动状态
参数：
	cardno	    卡号
	v           驱动状态指针，bit0～bit3代表第一轴～第四轴，bit15代表插补轴
				0：驱动结束				 1：正在驱动
返回值			0：正确					 -1：错误 
备注：该函数属于查询API,如需连续查新，两次查询中间建议插入一条Sleep(1)语句。
******************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_get_status_all(Int32 cardno,out Int32 v);

/*****************************************************
功能：获取插补的驱动状态
参数：
	cardno      卡号
	v           插补状态指针
				0：插补结束				1：正在插补
返回值			0：正确					-1：错误 
备注：该函数属于查询API,如需连续查新，两次查询中间建议插入一条Sleep(1)语句。
*****************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_get_inp_status(Int32 cardno,out Int32 v);

/*****************************************************
功能：获取各轴的停止信息
参数：
	cardno      卡号
	axis		轴号(1-4)
	value		停止信息指针(0：无错误停止；非0：有限位、原点或编码器Z相信号触发停止)：
				bit0==1 代表 正限位触发停止
				bit1==1 代表 负限位触发停止
				bit2==1 代表 原点信号触发停止
				bit3==1 代表 编码器Z相信号触发停止
				bit4==1 代表 外部急停信号触发停止
				bit5==1 代表 软件正限位触发停止
				bit6==1 代表 软件负限位触发停止
返回值			0：正确					-1：错误 
备注：停止信息也可能组合出现，比如bit0与bit2都为1时代表正限位和原点信号都触发，导致轴停止
	  如需连续查询，两次查询中间建议插入一条Sleep(1)语句，否则会影响控制卡的运行效率。
*****************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_get_stopdata(Int32 cardno,Int32 axis,out Int32 value);

//----------------------------------------------------//
//               运动参数设定函数                     //
//----------------------------------------------------//
/****************************************************
功能：加加速度jcc，加速度acc，减速度dec设定
参数：
	cardno	    卡号
	axis		轴号(1-4，插补轴轴号为：INPA_AXISREG)
	jcc			S加减速模式设置加加速度等级，范围(0-10)，默认值为0，值越小S加减速效果越明显
	add         加速度/减速度 范围(1-100000),mm/sec^2

返回值			0：正确					-1：错误 
备注：8949G1支持不对称加减速，默认情况下设定加速度时，会将减速度等同于加速度，所以要设定减速度，
	  则set_dec一定要放在set_acc后面，否则，减速度值会被加速度覆盖掉。
*****************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_jcc(Int32 cardno, Int32 axis,Int32 jcc);
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_acc(Int32 cardno, Int32 axis,float add);
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_dec(Int32 cardno, Int32 axis,float add);

/****************************************************
功能：初始(结束)速度设定
参数：
	cardno	    卡号
	axis		轴号(1-4，插补轴轴号为：INPA_AXISREG)
	speed       范围(0-100000),单位: mm/sec
返回值			0：正确					-1：错误 
备注：	默认情况下设定起始速度时，会将结束速度等同于起始速度，所以要设定结束速度，
		则set_endv一定要放在set_startv后面，否则，结束速度值会被起始速度覆盖掉。
		设置一定的初始速度，例如2mm/sec, 可使得机床较快启动
******************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_startv(Int32 cardno, Int32 axis,float speed);
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_endv(Int32 cardno, Int32 axis,float speed);


/****************************************************
功能：加减速模式设定
参数：
	cardno	    卡号
	axis		轴号(1-4，插补轴轴号为：INPA_AXISREG)
	mode        范围(0-3)
				0 S形加减速模式
				1 梯形加减速模式
				2 指数加减速
				3 三角函数加减速模式

返回值			0：正确					-1：错误 
备注：	默认是梯形加减速模式，点位运动和单条直线插补可以用其中任意的模式，单条圆弧插补可以使用模式1和模式3，样条插补使用模式1。
		插补情况下使用非梯形加减速模式须确保预处理缓冲段数为零。
******************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_admode(Int32 cardno, Int32 axis,Int32 mode);

/****************************************************
功能：驱动速度设定
参数：
	cardno	    卡号
	axis		轴号(1-4，插补轴轴号为：INPA_AXISREG )
	speed       范围(0.001-100000 mm/sec)
返回值			0：正确					-1：错误 
******************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_speed(Int32 cardno, Int32 axis,float speed);

/****************************************************
功能：设置运动路径转接处加速度约束
参数：
	cardno	    卡号
	axis		轴号(1-4)
	add			范围(100-100000)，默认值：8000mm/sec^2
返回值			0：正确					-1：错误 
备注：使用缓存插补时，设定轴的加速度约束，在预处理中生效，限制各个轴在线段转接处的最大速度变化。
      在调试过程中，只要不影响插补精度，可逐渐增大约束值，有利于降低插补运动时的机器抖动。
******************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_acc_constraint(Int32 cardno, Int32 axis,float add);

/****************************************************
功能：设置运动路径转接处速度约束
参数：
cardno	    卡号
axis		轴号(1-4)
speed       范围(0.01-100000 mm/sec),默认值：1000mm/sec
返回值			0：正确					-1：错误 
备注：一般情况不需要调用该函数。
特殊工艺下，用来设定缓存插补中两线段转接处轴的最大速度，在预处理中生效，限制各个轴在线段转接处的最大速度。
******************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_speed_constraint(Int32 cardno, Int32 axis,float speed);

/****************************************************
功能：设定圆弧速度钳制
参数：
	cardno	    卡号
	radius		半径系数
	speed       速度系数，范围(0.01-100000 mm/sec)
默认值			半径系数=10mm,速度系数=100mm/sec
返回值			0：正确					-1：错误 
备注			该函数会在平面圆弧或空间圆弧插补中生效，若调用了该条函数，若实际半径小于半径系数，越小则圆弧速度被限制的越小；
				若实际半径大于半径系数，越大则圆弧速度受到的约束放宽。当实际径与半径系数相等，则圆弧的最大速度与速度系数相等。
******************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_arc_speed_clamp(Int32 cardno, float radius,float speed);

/****************************************************
功能：逻辑位置设定
参数：
	cardno	    卡号
	axis		轴号(1-4)
	pos         范围(-2147483648～+2147483647)
返回值			0：正确					-1：错误 
*****************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_command_pos(Int32 cardno, Int32 axis,long pos);

/****************************************************
功能：实际位置设定
参数：
	cardno	    卡号
	axis		轴号(1-4)
	pos         范围(-2147483648～+2147483647)
返回值			0：正确					-1：错误 
******************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_actual_pos(Int32 cardno, Int32 axis,long pos);

//----------------------------------------------------//
//               运动参数检查函数                     //
//----------------------------------------------------//

/*****************************************************
功能：获取各轴的逻辑位置
参数：
	cardno	    卡号
	axis		轴号(1-4)
	pos         逻辑位置的指针
返回值			0：正确					-1：错误 
*******************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_get_command_pos(Int32 cardno,Int32 axis,out long pos);

/*****************************************************
功能：获取各轴的实际位置
参数：
	cardno	    卡号
	axis		轴号(1-4)
	pos         实际位置的指针
返回值			0：正确					-1：错误 
*****************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_get_actual_pos(Int32 cardno,Int32 axis,out long pos);

/*****************************************************
功能：获取各轴的当前驱动速度
参数：
	cardno	    卡号
	axis		轴号(1-4，插补轴轴号为：INPA_AXISREG )
	speed       当前驱动速度的指针
返回值			0：正确					-1：错误 
*****************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_get_speed(Int32 cardno,Int32 axis,out float speed);

/*****************************************************
功能：获取当前插补运动的索引信息
参数：
	cardno	    卡号
	index       索引信息(0-65535)的指针
返回值			0：正确					-1：错误 
备注：此函数用于G代码加工时的同步显示使用，不能用于运动轨迹的精确定位。
*****************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_get_inp_index(Int32 cardno,Int32 axis,out Int32 index);

//----------------------------------------------------//
//                   驱动函数                         //
//----------------------------------------------------//

/****************************************************
功能：相对坐标定量驱动
参数：
	cardno	    卡号
	axis		轴号(1-4)
	pos     单位为mm，(+/- 9999999.999)
				>0：正方向驱动			<0：负方向驱动
返回值			0：正确					-1：错误
*****************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_pmove(Int32 cardno,Int32 axis,float pos);

/****************************************************
功能：绝对坐标定量驱动
参数：
	cardno	    卡号
	axis		轴号(1-4)
	pos			单位为mm，(+/- 9999999.999)
				>0：正方向驱动			<0：负方向驱动
返回值			0：正确					-1：错误
*****************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_abs_pmove(Int32 cardno,Int32 axis,float pos);

/********************************************************************
功能：单轴连续运动
参数：
	cardno				卡号   
	axis				轴号(1-4)
	dir					0:正向 ;1：负向

返回值：   0：正确				-1：错误
注意:写入驱动命令前,需提前设定好速度参数.
********************************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_continue_move(Int32 cardno,Int32 axis,Int32 dir);

/*****************************************************
功能：驱动减速停止
参数：
	cardno	    卡号
	axis		轴号(1-4)
返回值			0：正确					-1：错误
备注：调用该函数后，机器属于非正常停止，建议当轴停止后调用一条adt8949_reset_card(…)函数
*******************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_dec_stop(Int32 cardno,Int32 axis);

/*******************************************************
功能：驱动立即停止
参数：
	cardno	    卡号
	axis		轴号(1-4)
返回值			0：正确					-1：错误
备注：调用该函数后，机器属于非正常停止，建议当轴停止后调用一条adt8949_reset_card(…)函数
*********************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_sudden_stop(Int32 cardno,Int32 axis);

/*******************************************************
功能：设定预处理缓冲段数，启用速度前瞻
参数：	cardno		卡号
		prec		缓存段数(0-50)。默认值为0，即关闭速度前瞻；
备注:	缓冲段数不代表缓存的容量，对于小线段，建议设置30段以上，有利于插补的连贯性；
		启动预处理后，调用函数adt8949_set_acc_constraint(…)调整各轴的加速度约束值，有利于提升加工效率和机床稳定性；
		设置一次即生效，无需重复设置。
*********************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_precount(Int32 cardno,Int32 prec);		

/*****************************************************
功能：设置同步轴
参数：
	cardno	    卡号	
	slaveaxis		从轴(跟随主轴的)，轴号(1-4)
	masteraxis		主轴(被跟随的)，轴号(0-4),0则取消跟随
返回值			0：正确					-1：错误
*******************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_follow_axis(Int32 cardno,Int32 slaveaxis,Int32 masteraxis);

/*********************************************************
功能：查询插补缓存区余量
参数：
	cardno	    卡号
	len			要获取的缓冲长度变量	
返回值			0：正确					非0：错误
备注：插补缓冲区段数共有10000段。插补数据与缓存事件存放在控制卡中不同的区域。
	  一段圆弧占用4段缓存空间，一个整圆占用8段缓存空间。建议当缓存余量大于8段时才下发运动数据。
	  该函数属于查询API,如需连续查新，两次查询中间建议插入一条Sleep(1)语句。
*********************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_get_fifo_len(Int32 cardno,out Int32 len);

/*********************************************************
功能：四轴相对坐标直线插补
参数：
	cardno	    卡号
	index		索引信息，用于标识本次运动信息，一般设置为0即可
	pos1,pos2,pos3,pos4代表XYZA四轴移动的相对距离,单位为mm
返回值			0：正确					-1：错误
注意：若设置了同步轴，则从轴的pos参数要设置为0，否则函数调用失败。
*********************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_inp_move4(Int32 cardno,Int32 index,float pos1,float pos2,float pos3,float pos4);

/*********************************************************
功能：四轴绝对坐标直线插补
参数：
	cardno	    卡号
	index		索引信息，用于标识本次运动信息，一般设置为0即可
	axismap		轴映射位，bit0表示1号轴，bit1表示2号轴，…，不被标志的轴，目标位置不会生效。
	pos1,pos2,pos3,pos4代表XYZA四轴要移动到的坐标值,单位为mm
返回值			0：正确					-1：错误
注意：若设置了同步轴，则从轴的pos参数要设置为0,axismap值也不用考虑从轴位
*********************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_inp_abs_move4(Int32 cardno,Int32 index,Int32 axismap,float pos1,float pos2,float pos3,float pos4);

/*********************************************************
功能：四轴相对坐标直线插补（指定运动时间）
参数：
	cardno	    卡号
	index		索引信息，用于标识本次运动信息，一般设置为0即可
	pos1,pos2,pos3,pos4代表XYZA四轴移动的相对距离,单位为mm
	time		该段直线运动所需时间，单位ms(毫秒)
返回值			0：正确					-1：错误
注意：直线在指定时间内匀速运动，调用此函数前要确保预处理缓冲段数为零，否则调用失败;
	  若设置了同步轴，则从轴的pos参数要设置为0，否则函数调用失败。
*********************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_time_move4(Int32 cardno,Int32 index,float pos1,float pos2,float pos3,float pos4,float time);

/*********************************************************
功能：四轴绝对坐标直线插补（指定运动时间）
参数：
	cardno	    卡号
	index		索引信息，用于标识本次运动信息，一般设置为0即可
	axismap		轴映射位，bit0表示1号轴，bit1表示2号轴，…，不被标志的轴，目标位置不会生效。
	pos1,pos2,pos3,pos4代表XYZA四轴要移动到的坐标值,单位为mm
	time		该段直线运动所需时间（非累积时间），单位ms(毫秒)
返回值			0：正确					-1：错误
注意：直线在指定时间内匀速运动，调用此函数前要确保预处理缓冲段数为零，否则调用失败;
	  若设置了同步轴，则从轴的pos参数要设置为0,axismap值也不用考虑从轴位。
*********************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_time_abs_move4(Int32 cardno,Int32 index,Int32 axismap,float pos1,float pos2,float pos3,float pos4,float time);

/*********************************************************
功能：两轴圆弧插补
参数：
	cardno	    卡号
	index		索引信息，用于标识本次运动信息，一般设置为0即可
	axismap		轴选映射标志,bit0表示1号轴，bit1表示2号轴，…，可标志空间任意的两个轴做平面圆弧插补
	pos			圆弧的目标点坐标（相对于当前点）,单位为mm
	Center		圆弧的中心点坐标（相对于当前点）,单位为mm	
	dir			圆弧方向（1为顺时针 0为逆时针）
返回值			0：正确					非0：错误
备注：一段圆弧占用4段缓存空间，一个整圆占用8段缓存空间
	  如果调用该函数画一个完整的的平面圆，则需设置一定的预处理缓冲段数，否则走到半圆时会出现加减速过程。
*********************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_inp_arc2(Int32 cardno,Int32 index,Int32 arcmap,float[] pos,float[] Center,Int32 dir);

/*********************************************************
功能：两轴绝对坐标圆弧插补
参数：
	cardno	    卡号
	index		索引信息，用于标识本次运动信息，一般设置为0即可
	axismap		轴选映射标志,bit0表示1号轴，bit1表示2号轴，…，可标志空间任意的两个轴做平面圆弧插补
	pos			圆弧的目标点绝对坐标,单位为mm
	Center		圆弧的中心点绝对坐标,单位为mm
	dir			圆弧方向（1为顺时针 0为逆时针）
返回值			0：正确					非0：错误
备注：一段圆弧占用4段缓存空间，一个整圆占用8段缓存空间
	  如果调用该函数画一个完整的的平面圆，则需设置一定的预处理缓冲段数，否则走到半圆时会出现加减速过程。
*********************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_inp_abs_arc2(Int32 cardno,Int32 index,Int32 arcmap,float[] pos,float[] Center,Int32 dir);

/*********************************************************
功能：三轴圆弧插补
参数：
	cardno	    卡号
	index		索引信息，用于标识本次运动信息，一般设置为0即可
	arcmap		轴选映射标志，最多只能标志三个位为1，也就是最多支持3轴来做圆弧插补
	pos2		圆弧的第二点坐标（相对于当前点）,单位为mm
	pos3		圆弧的第三点坐标（相对于当前点）,单位为mm	
	arc_flag	0: 圆弧					1：整圆	
返回值			0：正确					非0：错误
备注：一段空间圆弧占用4段缓存空间
*********************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_inp_arc3(Int32 cardno,Int32 index,Int32 arcmap,float[] pos2,float[] pos3, Int32 arc_flag);

/*********************************************************
功能：三轴绝对坐标圆弧插补
参数：
	cardno	    卡号
	index		索引信息，用于标识本次运动信息，一般设置为0即可
	arcmap		轴选映射标志，最多只能标志三个位为1，也就是最多支持3轴来做圆弧插补
	pos2		圆弧的第二点绝对坐标,单位为mm
	pos3		圆弧的第三点绝对坐标,单位为mm
	arc_flag	0: 圆弧					1：整圆	
返回值			0：正确					非0：错误
备注：一段空间圆弧占用4段缓存空间
*********************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_inp_abs_arc3(Int32 cardno,Int32 index,Int32 arcmap,float[] pos2,float[] pos3, Int32 arc_flag);

/*********************************************************
功能：获取两轴圆弧长度
参数：
	axismap		轴选映射标志,bit0表示1号轴，bit1表示2号轴，…，可标志空间任意的两个轴做平面圆弧插补
	pos			圆弧的目标点坐标（相对于当前点）,单位为mm
	Center		圆弧的中心点坐标（相对于当前点）,单位为mm
	dir			圆弧方向（1为顺时针 0为逆时针）
	length		两轴圆弧长度指针
返回值			0：正确					非0：错误
*********************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_get_arc2_length(Int32 arcmap,float[] pos,float[] Center,Int32 dir,out float length);

/*********************************************************
功能：获取三轴圆弧长度
参数：
	arcmap		轴选映射标志，最多只能标志三个位为1，也就是最多支持3轴来做圆弧插补
	pos2		圆弧的第二点坐标（相对于当前点）,单位为mm
	pos3		圆弧的第三点坐标（相对于当前点）,单位为mm
	length		三轴圆弧长度指针
	arc_flag	0: 圆弧					1：整圆		
返回值			0：正确					非0：错误
*********************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_get_arc3_length(Int32 arcmap,float[] pos2,float[] pos3,out float length, Int32 arc_flag);

/*********************************************************
功能：NURBS插补
参数：
	cardno	    卡号
	index		索引信息，用于标识本次运动信息，一般设置为0即可
	axismap		轴选映射标志，最多只能标志三个位为1，也就是最多支持3轴来做NURBS插补
	conp		样条的控制点（相对于当前点,第一个控制点的坐标需为0，否则返回错误）,单位为mm
	weight		样条的控制点对应的权值。AutoCAD各控制点的权值默认为-1
	node		样条的节点值
	nodenum		样条节点个数
返回值			0：正确					非0：错误
备注：NURBS插补时建议设置较大的预处理缓存段数，并使用梯形加减速模式，调用设置圆弧速度钳制函数，会影响样条插补速度规划;
	  使用样条插补后，会占据控制卡较大的缓存段数，要继续调用插补指令，需提前查询剩余缓存容量。
*********************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_inp_NURBS(Int32 cardno,Int32 index,Int32 axismap,float[][] conp,float[] weight,float[] node,Int32 nodenum);


//-------------------------------------------------//
//               开关量输入输出类                  //
//-------------------------------------------------//

/*********************************************************
功能：按位读取输入点
参数：
	cardno	    卡号
	number      输入点(0-47)，其中0-18、36-47为快速输入点，19-35为总线式输入点
				其中，四个驱动轴的编码器信号(A相、B相、Z相)对应的端口为：
					IN36～IN39:	A1...A4	
					IN40～IN43:	B1...B4
					IN44～IN47:	Z1...Z4		
返回值			0：低电平		 1：高电平
*********************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_read_bit(Int32 cardno,Int32 number);

/*****************************************************
功能：获取输出点状态
参数：
	cardno	    卡号
	number		输出点(0-31),其中0-14为快速输出点，15-31为总线式输出点
返回值			返回值:指定端口的当前状态,-1表示参数错误  
备注：
*****************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_get_out(Int32 cardno, Int32 number);

/********************************************************
功能：按组获取输入/输出点状态
参数：
	cardno	    卡号
	gp			组号，其中：
					组号0x00，读取OUT0～OUT15
					组号0x01，读取OUT16～OUT31
					组号0x10，读取IN0～IN15
					组号0x11，读取IN16～IN31
					组号0x12，读取IN32～IN47
	levelmap    该组输入/输出点的状态指针（通过位值显示某个输入/输出点的状态，如OUT0对应bit0,OUT1对应bit1）
返回值			0：正确				-1：错误
备注：levelmap为16位有符号短整形数据，若要拼成32位的数据并放在低16位，则需作运算：levelmap&0xFFFF,以免影响高16位数据
*********************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_get_gpio(Int32 cardno,Int32 gp,out Int32 levelmap);


/********************************************************
功能：按位操作输出点
参数：
	cardno	    卡号
	number      输出点(0-31),其中0-14为快速输出点，15-31为总线式输出点
	value       0: 关闭				1: 打开
返回值			0：正确				-1：错误
*********************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_write_bit(Int32 cardno,Int32 number,Int32 value);

/********************************************************
功能：按组操作输出点
参数：
	cardno	    卡号
	gp			组号，其中：
					OUT0～OUT15，组号为0
					OUT16～OUT31，组号为1
	levelmap        该组输出点的状态设置（通过位值设定某个输出点的状态，如OUT0对应bit0,OUT1对应bit1）
返回值			0：正确				-1：错误
*********************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_gpio(Int32 cardno,Int32 gp,Int32 levelmap);

/********************************************************
功能：同时设置多个输出点电平
参数：
	cardno	    卡号
	gp			组号，其中：
					OUT0～OUT15，组号为0
					OUT16～OUT31，组号为1
	iomap		按位（bit0～bit15）指定要操作的输出点,位值为1则对相应的输出点进行操作，位值为0的输出点不受影响
	levelmap    该组输出点的状态设置（通过位值设定某个输出点的状态，如OUT0对应bit0,OUT1对应bit1），仅影响iomap位值为1的输出点
返回值			0：正确				-1：错误
*********************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_multi_io(Int32 cardno,Int32 gp,Int32 iomap,Int32 levelmap);


//-------------------------------------------------//
//                 设置缓存事件                    //
//-------------------------------------------------//

/*********************************************************
功能：查询1000段缓存事件区剩余段数
参数：
	cardno	    卡号
	len			要获取的缓存事件长度变量的指针	
返回值			0：正确					非0：错误
备注：插补数据与缓存事件存放在控制卡中不同的区域；
	  设置缓存事件函数有：
			adt8949_set_fifo_io(…)，
			adt8949_set_fifo_multi_io(…)，
			adt8949_set_fifo_delay(…)，
			adt8949_set_fifo_pulser(…)，
	  该函数属于查询API,如需连续查新，两次查询中间建议插入一条Sleep(1)语句。
*********************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_get_fifo_event_len(Int32 cardno,out Int32 len);

/********************************************************
功能：插补时设置单个输出点电平
参数：
	cardno	    卡号
	number      输出点(0-14)
	value       0: 关闭           1: 打开
	speed		-1默认IO动作前不作速度约束，其它：范围(0.0-100000.0 mm/sec)
返回值			0：正确				-1：错误
备注：单张控制卡FIFO事件容量共1000个，若函数返回值为非0，则代表事件缓存已满，需待事件缓存有余量时重发。
	  查询缓存事件区剩余段数可调用函数adt8949_get_fifo_event_len(…)。
*********************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_fifo_io(Int32 cardno,Int32 number,Int32 value,float speed);

/********************************************************
功能：插补时同时设置多个输出点电平
参数：
	cardno	    卡号
	gp			组号（OUT0～OUT14组号为0,暂开放第0组输出点设置）
	iomap		按位（bit0～bit14）指定要操作的输出点,位值为1则对相应的输出点进行操作，位值为0的输出点不受影响
	levelmap    该组输出点的状态设置（通过位值设定某个输出点的状态，如OUT0对应bit0,OUT1对应bit1），仅影响iomap位值为1的输出点
	speed		-1默认IO动作前不作速度约束，其它：范围(0.0-100000.0 mm/sec)
返回值			0：正确				-1：错误
备注：单张控制卡FIFO事件容量共1000个，若函数返回值为非0，则代表事件缓存已满，需待事件缓存有余量时重发。
	  查询缓存事件区剩余段数可调用函数adt8949_get_fifo_event_len(…)。
*********************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_fifo_multi_io(Int32 cardno,Int32 gp, Int32 iomap,Int32 levelmap,float speed);

/********************************************************
功能：插补时特定位置延时运动
参数：
	cardno			卡号
	millisecond      延时值，单位：毫秒
返回值			0：正确				-1：错误
备注：单张控制卡FIFO事件容量共1000个，若函数返回值为非0，则代表事件缓存已满，需待事件缓存有余量时重发。
	  查询缓存事件区剩余段数可调用函数adt8949_get_fifo_event_len(…)。
*********************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_fifo_delay(Int32 cardno,Int32 millisecond);

/********************************************************
功能：插补时插入脉冲发生器
参数：
	cardno			卡号
	port			作为脉冲发生器的输出点端口（0-14）
	NormalLevel		常态电平  0: 低电平    1: 高电平
	NormalTime		常态电平保持时间，单位：ms(毫秒)
	UnNormalTime	非常态电平保持时间，单位：ms(毫秒)
	ReverseNum		输出电平翻转次数
	speed			-1默认IO动作前不作速度约束，其它：范围(0.0-100000.0 mm/sec)
返回值：0：正确		-1：错误
备注：常态电平指开始计算翻转次数前的输出电平。若脉冲发生器动作前处于常态电平状态，则马上翻转，
      否则首先翻转到常态电平状态，此时使用一个常态电平时间，并且该次翻转不计入设定的翻转次数。
	  单张控制卡FIFO事件容量共1000个，若函数返回值为非0，则代表事件缓存已满，需待事件缓存有余量时重发。
	  查询缓存事件区剩余段数可调用函数adt8949_get_fifo_event_len(…)。
*********************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_fifo_pulser(Int32 cardno,Int32 port,Int32 NormalLevel,Int32 NormalTime,Int32 UnNormalTime,Int32 ReverseNum,float speed);

/********************************************************
功能：设置DA输出电压
参数：
	cardno		卡号	      
	port		设置DA输出端口（1-2）
	value		设置DA输出大小（0-10），单位：伏特
返回值			0：正确					非0：错误 
备注：	DA输出电压可以精确到小数点后两位
*********************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_set_daout(Int32 cardno,Int32 port,float value);

//-------------------------------------------------//
//                 回原点函数                      //
//-------------------------------------------------//

/********************************************************
功能：设置回零信号，步骤参数
参数：
 	m_nCardNum			卡号
 	m_nAxisNum			轴号
 	m_nHomeDir			回零方向 0:负方向 1:正方向
 	m_nStop0Active		stop0 有效电平设置；0：低电平停止	1：高电平停止
 	m_nLimitActive		limit信号 有效电平设置；0：低电平停止	1：高电平停止
 	m_nStop1Active		stop1 有效电平设置；0：低电平停止	1：高电平停止	-1:设置为无效
 	m_fBackRange		反向距离 >1,不能超过正限位和stop0之间距离
 	m_fEncoderZRange	编码器Z相范围 >1
 	m_fOffset			原点偏移量；==0不偏移，>0正方向偏移，<0负方向偏移	
返回值		0：正确		-1至-8：错误类型，-x表示第x个参数错误
*********************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_SetHomeMode_Ex(Int32 m_nCardNum, Int32 m_nAxisNum, Int32 m_nHomeDir, Int32 m_nStop0Active, Int32 m_nLimitActive, Int32 m_nStop1Active,
									float m_fBackRange,float m_fEncoderZRange,float m_fOffset);


/********************************************************
功能：回零速度参数
参数：
	m_nCardNum					卡号
	m_nAxisNum					轴号
	m_fStartSpeed				原点(STOP0)搜寻起始速度
	m_fSearchSpeed				原点搜寻速度
	m_fHomeSpeed				低速接近原点速度
	m_fAcc						回原点过程中的加速度
	m_fZPhaseSpeed				编码器Z相(STOP1)搜寻速度
返回值		0：正确				-1至-7：错误类型，-x表示第x个参数错误

*********************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_SetHomeSpeed_Ex(Int32 m_nCardNum, Int32 m_nAxisNum, float m_fStartSpeed, float m_fSearchSpeed, float m_fHomeSpeed, float m_fAcc, float m_fZPhaseSpeed);

/********************************************************
功能：启动回零
参数：
 	m_nCardNum				卡号
 	m_nAxisNum				轴号
 	m_fGear					电子齿轮比:(1-10000)
返回值		0：正确			-1至-3：错误类型，-x表示第x个参数错误
备注：调用该函数时启动回零动作
			启动后需定时调用adt8949_GetHomeStatus_Ex(…)，直到回零成功
*********************************************************/
[DllImport("adt8949.dll")]
public static extern Int32 adt8949_HomeProcess_Ex(Int32 m_nCardNum, Int32 m_nAxisNum, float m_fGear);

/********************************************************
功能：获取回零状态
参数：
 	m_nCardNum				卡号
 	m_nAxisNum				轴号
返回值		0:回零成功；-1表示参数1错误；-2表示参数2错误；-3表示回零未启动;
				1-10表示执行的步骤，分别表示：
			  	1 ：快速接近原点，搜索STOP0
			  	2 ：检查STOP0是否找到
		      3 ：反向退出原点
		      4 ：检查反向退出原点是否完成
		      5 ：低速接近原点，搜索STOP0
		      6 ：检查STOP0搜索是否完成
		  	  7 ：低速接近Z相，搜索STOP1.如果STOP1设置为-1，则跳过7,8两步。
		  	  8 ：检查STOP1搜索是否完成
		  	  9 ：原点偏移
		 	 		10 ：检查原点偏移
	   	   	-100x：回零第x步出现异常，例如-1001表示回零第1步出现异常
		   		-1020：回零被终止
备注：回零过程中需定时调用，直到回零成功		   	
*********************************************************/
[DllImport("adt8949.dll")]
 public static extern Int32 adt8949_GetHomeStatus_Ex(Int32 m_nCardNum, Int32 m_nAxisNum);

 	}
 	
}
