#ifndef _PXI5630_DEVICE_
#define _PXI5630_DEVICE_
#include "windows.h"
// #################### 人性化的数据类型定义 #####################
// Humanized data types definition
typedef char				I8;		// 8位有符号整型数据
typedef unsigned char		U8;		// 8位无符号整型数据
typedef short				I16;	// 16位有符号整型数据
typedef unsigned short		U16;	// 16位无符号整型数据
typedef long				I32;	// 32位有符号整型数据
typedef unsigned long		U32;	// 32位无符号整型数据
typedef __int64				I64;	// 64位有符号整型数据
typedef unsigned __int64	U64;	// 64位无符号整型数据
typedef float				F32;	// 32位浮点数据(单精度,同为labVIEW中的SGL)
typedef double				F64;	// 64位浮点数据(双精度,同为labVIEW中的DBL)

// ########################## 设备功能指标 ########################
#define PXI5630_AI_MAX_CHANNELS		64	// 本卡最多支持64路模拟量单端输入通道
#define PXI5630_AO_MAX_CHANNELS		4	// 本卡最多支持4个模拟量输出通道
#define PXI5630_DIO_MAX_PORTS		4	// 本卡最多支持3个数字量端口
#define PXI5630_DIO_PORT0_MAX_LINES	8	// 数字量端口0支持8条线输入\输出,方向可控,Port0只能为DIO
#define PXI5630_DIO_PORT1_MAX_LINES	8	// 数字量端口1支持8条线输入\输出,方向可控,PFI0~7
#define PXI5630_DIO_PORT2_MAX_LINES	8	// 数字量端口2支持8条线输入\输出,方向可控,PFI8~15
#define PXI5630_DIO_PORT3_MAX_LINES	8	// 数字量端口3支持8条线输入\输出,方向可控,PXI0~7



// ############# AI工作参数结构体PXI5630_AI_PARAM描述 #############
typedef struct _PXI5630_AI_CH_PARAM // AI通道参数结构体
{
	U32 nChannel;			// 通道号[0, 63],分别表示物理通道号AI0－AI63
	U32 nSampleGain;		// 采样增益,具体放大倍数请参考下面常量定义
	U32 nRefGround;			// 地参考方式

	U32 nReserved0;			// 保留(未用)
	U32 nReserved1;			// 保留(未用)
	U32 nReserved2;			// 保留(未用)
} PXI5630_AI_CH_PARAM, *PPXI5630_AI_CH_PARAM;

// AI硬件通道参数PXI5630_AI_CH_PARAM中的nSampleGain采样增益放大倍数所使用的选项
#define PXI5630_AI_SAMPGAIN_1MULT		0 // 1倍增益
#define PXI5630_AI_SAMPGAIN_2MULT		1 // 2倍增益
#define PXI5630_AI_SAMPGAIN_4MULT		2 // 4倍增益
#define PXI5630_AI_SAMPGAIN_8MULT		3 // 8倍增益

// AI硬件通道参数结构体PXI5630_AI_CH_PARAM中的nRefGround参数所使用的地参考选项
#define PXI5630_AI_REFGND_RSE			0 // 接地参考单端(Referenced Single Endpoint)
#define PXI5630_AI_REFGND_NRSE			1 // 非参考单端(Non Referenced Single Endpoint)
#define PXI5630_AI_REFGND_DIFF			2 // 差分(Differential)


typedef struct _PXI5630_AI_PARAM // 跟整个AI有关的硬件工作参数(简称AI工作参数)
{
	// 通道参数
	PXI5630_AI_CH_PARAM CHParam[PXI5630_AI_MAX_CHANNELS]; // 通道参数配置(此参数在单点采样有效,未此注明的参数则在单点采样模式中无效)
	U32 nSampChanCount;     // 采样通道总数[1, 63](此参数在单点采样有效,未此注明的参数则在单点采样模式中无效)
	U32 nChanScanMode;		// 通道扫描模式,0=通道连续扫描, 1=通道分组扫描(此功能暂不支持)
	U32 nGroupLoops;		// 组内循环次数[1, 65535](此功能暂不支持)
	U32 nGroupInterval;     // 组与组之间的时间间隔, 单位:微秒,取值范围[0, 107374182], 等于0时表示等间隔采样(不分组,此时nGroupLoops应等于1)(此功能暂不支持)
	U32 nSampleSignal;		// 采样信号(Sample Signal), 详见下面常量定义
	U32 nSampleRange;		// 采样范围(Sample Range)档位选择, 具体见下面常量名定义(此参数在单点采样有效,未此注明的参数则在单点采样模式中无效)

	// 时钟参数
	U32 nSampleMode;		// 采样模式, 0=单点采样(按需), 2=有限点采样, 3=连续采样
	U32 nSampsPerChan;		// 每个通道采样点数(也是每通道待读取点数),取值范围为单点采样模式时应等于1,有限点或连续采样时为[2, n]	
	F64 fSampleRate;		// 采样速率(Sample Rate), 单位为sps,取值范围为[1000sps, 500000sps],它是每个采样通道的采样速率, 它与nChannelCount的乘积不能大于500000sps
	U32 nClockSource;		// 时钟源选择, 详见下面常量定义
	U32 nClockOutput;		// 采样时钟输出选择, 详见下面常量定义
	U32 nReserved0;			// 保留字段(暂未定义)

	// 开始触发参数
	U32 bDTriggerEn;		// 数字触发DTR允许(Digital Trigger Enable), =FALSE:表示禁止; =TRUE:表示允许,触发信号由连接器CN2上的DIO1复用输入,因此初始化时会将DIO1的方向强制置为输入
	U32 nDTriggerDir;	    // 数字触发方向(Digital Trigger Direction)
	U32 nDTriggerSens;		// DTR触发灵敏度(Trigger Sensitive for Digital and Analog trigger),单位:微秒(uS),取值范围[0, 1638]
	U32 nDTrigChannel;		// DTR触发通道选择,详见下面常量定义

	U32 bATriggerEn;		// 模拟数字触发ATR允许(Analog Trigger Enable), =TRUE:表示允许, =FALSE:表示禁止
	U32 nATriggerDir;		// 模拟触发方向(Analog Trigger Direction)
	F32 fTriggerLevel;		// 触发电平(Trigger Level), 单位V
	U32 nATriggerSens;		// ATR触发灵敏度(Trigger Sensitive for Digital and Analog trigger),单位:微秒(uS),取值范围[0, 1638]
	U32 nATrigSource;		// ATR触发源选择,详见下面常量定义

	U32 nSyncTSOut;			// 同步触发信号输出通道选择, 详见下面常量定义
	U32 nDelaySamps;		// 触发延迟点数, 单位:采样点,取值范围32位有效[0, 4294967295],0:Post Trigger, >0:Delay Trigger
	U32 nReserved1;			// 保留字段(暂未定义)

	// 其他方面
	U32 nReserved2;			// 保留字段(暂未定义)
	U32 nReserved3;			// 保留字段(暂未定义)
	U32 nReserved4;			// 保留字段(暂未定义)
	U32 nReserved5;			// 保留字段(暂未定义)
} PXI5630_AI_PARAM, *PPXI5630_AI_PARAM;

// AI硬件参数结构体PXI5630_AI_PARAM中的nChanScanMode扫描模式所使用的选项
#define PXI5630_AI_CHAN_SCANMODE_CONTINUOUS		0 // 连续扫描
#define PXI5630_AI_CHAN_SCANMODE_GROUP			1 // 分组扫描

// AI硬件参数结构体PXI5630_AI_PARAM中的nSampleSignal采样信号所使用的选项
#define PXI5630_AI_SAMPSIGNAL_AI			0 // AI通道输入信号
#define PXI5630_AI_SAMPSIGNAL_0V			1 // 0V(AGND)
#define PXI5630_AI_SAMPSIGNAL_2D5V			2 // 2.5V(DC)
#define PXI5630_AI_SAMPSIGNAL_5V			3 // 5V(DC)
#define PXI5630_AI_SAMPSIGNAL_AO0			4 // AO0(DC)
#define PXI5630_AI_SAMPSIGNAL_AO1			5 // AO1(DC)
#define PXI5630_AI_SAMPSIGNAL_AO2			6 // AO2(DC)
#define PXI5630_AI_SAMPSIGNAL_AO3			7 // AO3(DC)

// AI硬件参数结构体PXI5630_AI_PARAM中的nSampleRange参数所使用的采样范围挡位选项
#define PXI5630_AI_SAMPRANGE_N10_P10V		0 // ±10V
#define PXI5630_AI_SAMPRANGE_N5_P5V			1 // ±5V
#define PXI5630_AI_SAMPRANGE_N2D5_P2D5V		2 // ±2.5V
#define PXI5630_AI_SAMPRANGE_0_P10V			3 // 0-10V
#define PXI5630_AI_SAMPRANGE_0_P5V			4 // 0-5V

// AI硬件参数结构体PXI5630_AI_PARAM中的nSampleMode采样模式所使用的选项
#define PXI5630_AI_SAMPMODE_ONE_DEMAND		0 // 软件按需单点采样
#define PXI5630_AI_SAMPMODE_FINITE			2 // 有限点采样
#define PXI5630_AI_SAMPMODE_CONTINUOUS		3 // 连续采样

// AI硬件参数结构体PXI5630_AI_PARAM中的nClockSource时钟源所使用的选项
// AO硬件参数结构体PXI5630_AO_PARAM中的nClockSource时钟源所使用的选项
#define PXI5630_AIO_CLKSRC_LOCAL			 0 // 本地时钟(通常为本地晶振时钟OSCCLK),也叫内部时钟
#define PXI5630_AIO_CLKSRC_PFI00			 1 // PFI00输入时钟
#define PXI5630_AIO_CLKSRC_PFI01			 2 // PFI01输入时钟
#define PXI5630_AIO_CLKSRC_PFI02			 3 // PFI02输入时钟
#define PXI5630_AIO_CLKSRC_PFI03			 4 // PFI03输入时钟
#define PXI5630_AIO_CLKSRC_PFI04			 5 // PFI04输入时钟
#define PXI5630_AIO_CLKSRC_PFI05			 6 // PFI05输入时钟
#define PXI5630_AIO_CLKSRC_PFI06			 7 // PFI06输入时钟
#define PXI5630_AIO_CLKSRC_PFI07			 8 // PFI07输入时钟
#define PXI5630_AIO_CLKSRC_PFI08			 9 // PFI08输入时钟
#define PXI5630_AIO_CLKSRC_PFI09			10 // PFI09输入时钟
#define PXI5630_AIO_CLKSRC_PFI10			11 // PFI10输入时钟
#define PXI5630_AIO_CLKSRC_PFI11			12 // PFI11输入时钟
#define PXI5630_AIO_CLKSRC_PFI12			13 // PFI12输入时钟
#define PXI5630_AIO_CLKSRC_PFI13			14 // PFI13输入时钟
#define PXI5630_AIO_CLKSRC_PFI14			15 // PFI14输入时钟
#define PXI5630_AIO_CLKSRC_PFI15			16 // PFI15输入时钟
#define PXI5630_AIO_CLKSRC_PXITRG0			17 // PXI_Trig0输入时钟
#define PXI5630_AIO_CLKSRC_PXITRG1			18 // PXI_Trig1输入时钟
#define PXI5630_AIO_CLKSRC_PXITRG2			19 // PXI_Trig2输入时钟
#define PXI5630_AIO_CLKSRC_PXITRG3			20 // PXI_Trig3输入时钟
#define PXI5630_AIO_CLKSRC_PXITRG4			21 // PXI_Trig4输入时钟
#define PXI5630_AIO_CLKSRC_PXITRG5			22 // PXI_Trig5输入时钟
#define PXI5630_AIO_CLKSRC_PXITRG6			23 // PXI_Trig6输入时钟
#define PXI5630_AIO_CLKSRC_PXITRG7			24 // PXI_Trig7输入时钟
#define PXI5630_AIO_CLKSRC_PXISTAR			25 // PXI_STAR输入时钟
#define PXI5630_AIO_CLKSRC_PXI10M			26 // PXI_10M时钟信号

// AI硬件参数结构体PXI5630_AI_PARAM中的nClockOutput时钟输出所使用的选项
// AO硬件参数结构体PXI5630_AO_PARAM中的nClockOutput时钟输出所使用的选项
#define PXI5630_AIO_CLKOUT_DISABLE			 0 // 禁止采样时钟输出
#define PXI5630_AIO_CLKOUT_PFI00			 1 // PFI00输出时钟
#define PXI5630_AIO_CLKOUT_PFI01			 2 // PFI01输出时钟
#define PXI5630_AIO_CLKOUT_PFI02			 3 // PFI02输出时钟
#define PXI5630_AIO_CLKOUT_PFI03			 4 // PFI03输出时钟
#define PXI5630_AIO_CLKOUT_PFI04			 5 // PFI04输出时钟
#define PXI5630_AIO_CLKOUT_PFI05			 6 // PFI05输出时钟
#define PXI5630_AIO_CLKOUT_PFI06			 7 // PFI06输出时钟
#define PXI5630_AIO_CLKOUT_PFI07			 8 // PFI07输出时钟
#define PXI5630_AIO_CLKOUT_PFI08			 9 // PFI08输出时钟
#define PXI5630_AIO_CLKOUT_PFI09			10 // PFI09输出时钟
#define PXI5630_AIO_CLKOUT_PFI10			11 // PFI10输出时钟
#define PXI5630_AIO_CLKOUT_PFI11			12 // PFI11输出时钟
#define PXI5630_AIO_CLKOUT_PFI12			13 // PFI12输出时钟
#define PXI5630_AIO_CLKOUT_PFI13			14 // PFI13输出时钟
#define PXI5630_AIO_CLKOUT_PFI14			15 // PFI14输出时钟
#define PXI5630_AIO_CLKOUT_PFI15			16 // PFI15输出时钟
#define PXI5630_AIO_CLKOUT_PXITRG0			17 // PXI_Trig0输出时钟
#define PXI5630_AIO_CLKOUT_PXITRG1			18 // PXI_Trig1输出时钟
#define PXI5630_AIO_CLKOUT_PXITRG2			19 // PXI_Trig2输出时钟
#define PXI5630_AIO_CLKOUT_PXITRG3			20 // PXI_Trig3输出时钟
#define PXI5630_AIO_CLKOUT_PXITRG4			21 // PXI_Trig4输出时钟
#define PXI5630_AIO_CLKOUT_PXITRG5			22 // PXI_Trig5输出时钟
#define PXI5630_AIO_CLKOUT_PXITRG6			23 // PXI_Trig6输出时钟
#define PXI5630_AIO_CLKOUT_PXITRG7			24 // PXI_Trig7输出时钟


// AI硬件参数结构体PXI5630_AI_PARAM中的nDTrigChannel DTR触发通道所使用的选项
// AO硬件参数结构体PXI5630_AO_PARAM中的nDTrigChannel DTR触发通道所使用的选项
#define PXI5630_AIO_DTRIG_PFI00			 0 // PFI00触发
#define PXI5630_AIO_DTRIG_PFI01			 1 // PFI01触发
#define PXI5630_AIO_DTRIG_PFI02			 2 // PFI02触发
#define PXI5630_AIO_DTRIG_PFI03			 3 // PFI03触发
#define PXI5630_AIO_DTRIG_PFI04			 4 // PFI04触发
#define PXI5630_AIO_DTRIG_PFI05			 5 // PFI05触发
#define PXI5630_AIO_DTRIG_PFI06			 6 // PFI06触发
#define PXI5630_AIO_DTRIG_PFI07			 7 // PFI07触发
#define PXI5630_AIO_DTRIG_PFI08			 8 // PFI08触发
#define PXI5630_AIO_DTRIG_PFI09			 9 // PFI09触发
#define PXI5630_AIO_DTRIG_PFI10			10 // PFI10触发
#define PXI5630_AIO_DTRIG_PFI11			11 // PFI11触发
#define PXI5630_AIO_DTRIG_PFI12			12 // PFI12触发
#define PXI5630_AIO_DTRIG_PFI13			13 // PFI13触发
#define PXI5630_AIO_DTRIG_PFI14			14 // PFI14触发
#define PXI5630_AIO_DTRIG_PFI15			15 // PFI15触发
#define PXI5630_AIO_DTRIG_PXITRG0			16 // PXI_Trig0触发
#define PXI5630_AIO_DTRIG_PXITRG1			17 // PXI_Trig1触发
#define PXI5630_AIO_DTRIG_PXITRG2			18 // PXI_Trig2触发
#define PXI5630_AIO_DTRIG_PXITRG3			19 // PXI_Trig3触发
#define PXI5630_AIO_DTRIG_PXITRG4			20 // PXI_Trig4触发
#define PXI5630_AIO_DTRIG_PXITRG5			21 // PXI_Trig5触发
#define PXI5630_AIO_DTRIG_PXITRG6			22 // PXI_Trig6触发
#define PXI5630_AIO_DTRIG_PXITRG7			23 // PXI_Trig7触发
#define PXI5630_AIO_DTRIG_PXISTAR			24 // PXI_STAR触发

// AI硬件参数结构体PXI5630_AI_PARAM中的nSyncTSOut同步触发信号输出通道所使用的选项
// AO硬件参数结构体PXI5630_AO_PARAM中的nSyncTSOut同步触发信号输出通道所使用的选项
#define PXI5630_AIO_STSO_DISABLE		 0 // 禁止同步触发信号
#define PXI5630_AIO_STSO_PFI00			 1 // PFI00输出同步触发信号
#define PXI5630_AIO_STSO_PFI01			 2 // PFI01输出同步触发信号
#define PXI5630_AIO_STSO_PFI02			 3 // PFI02输出同步触发信号
#define PXI5630_AIO_STSO_PFI03			 4 // PFI03输出同步触发信号
#define PXI5630_AIO_STSO_PFI04			 5 // PFI04输出同步触发信号
#define PXI5630_AIO_STSO_PFI05			 6 // PFI05输出同步触发信号
#define PXI5630_AIO_STSO_PFI06			 7 // PFI06输出同步触发信号
#define PXI5630_AIO_STSO_PFI07			 8 // PFI07输出同步触发信号
#define PXI5630_AIO_STSO_PFI08			 9 // PFI08输出同步触发信号
#define PXI5630_AIO_STSO_PFI09			10 // PFI09输出同步触发信号
#define PXI5630_AIO_STSO_PFI10			11 // PFI10输出同步触发信号
#define PXI5630_AIO_STSO_PFI11			12 // PFI11输出同步触发信号
#define PXI5630_AIO_STSO_PFI12			13 // PFI12输出同步触发信号
#define PXI5630_AIO_STSO_PFI13			14 // PFI13输出同步触发信号
#define PXI5630_AIO_STSO_PFI14			15 // PFI14输出同步触发信号
#define PXI5630_AIO_STSO_PFI15			16 // PFI15输出同步触发信号
#define PXI5630_AIO_STSO_PXITRG0			17 // PXI_Trig0输出同步触发信号
#define PXI5630_AIO_STSO_PXITRG1			18 // PXI_Trig1输出同步触发信号
#define PXI5630_AIO_STSO_PXITRG2			19 // PXI_Trig2输出同步触发信号
#define PXI5630_AIO_STSO_PXITRG3			20 // PXI_Trig3输出同步触发信号
#define PXI5630_AIO_STSO_PXITRG4			21 // PXI_Trig4输出同步触发信号
#define PXI5630_AIO_STSO_PXITRG5			22 // PXI_Trig5输出同步触发信号
#define PXI5630_AIO_STSO_PXITRG6			23 // PXI_Trig6输出同步触发信号
#define PXI5630_AIO_STSO_PXITRG7			24 // PXI_Trig7输出同步触发信号

// AO硬件参数结构体PXI5630_AO_PARAM中的nATrigSource ATR触发源选择所使用的选项(0)
// AI硬件参数结构体PXI5630_AI_PARAM中的nATrigSource ATR触发源选择所使用的选项(0,1)
#define PXI5630_AIO_ATRIG_APFI				0	// 选择APFI作为ATR触发源(触发范围为正负10V)
#define PXI5630_AI_ATRIG_FIRST				1	// 选择AI采样首通道作为ATR触发源(触发范围为AI量程)

// AI硬件参数结构体PXI5630_AI_PARAM中的nDTriggerDir/nATriggerDir触发方向所使用的选项
#define PXI5630_AI_TRIGDIR_FALLING			0 // 下降沿/低电平
#define PXI5630_AI_TRIGDIR_RISING			1 // 上升沿/高电平
#define PXI5630_AI_TRIGDIR_CHANGE			2 // 变化(即上下边沿/高低电平均有效)


// #################### AI工作状态结构体PXI5630_AI_STATUS描述 #####################
typedef struct _PXI5630_AI_STATUS
{
	U32 bTaskDone;				// 采集任务完成标志, =TRUE:表示采集任务完成, =FALSE:表示采集任务未完成,正在进行中
	U32 bTriggered;				// 触发标志, =TRUE:表示已被触发, =FALSE:表示未被触发(即正等待触发)

	U32 nTaskState;				// 采集任务状态, =1:正常, 其它值表示有异常情况
	U32 nAvailSampsPerChan;		// 每通道有效点数,只有它大于当前指定读数长度时才能调用AI_ReadAnalog()立即读取指定长度的采样数据
	U32 nMaxAvailSampsPerChan;	// 自AI_StartTask()后每通道出现过的最大有效点数,状态值范围[0, nBufSampsPerChan],它是为监测采集软件性能而提供,如果此值越趋近于1,则表示意味着性能越高,越不易出现溢出丢点的可能
	U32 nBufSampsPerChan;		// 每通道缓冲区大小(采样点数)
	I64 nSampsPerChanAcquired;	// 每通道已采样点数(自开始AI_StartTask()之后所采样的点数),这个只是给用户的统计数据

	U32 nHardOverflowCnt;		// 硬件溢出计数(在不溢出情况下恒等于0)
	U32 nSoftOverflowCnt;		// 软件溢出计数(在不溢出情况下恒等于0)
	U32 nInitTaskCnt;			// 初始化采集任务的次数(即调用AI_InitTask()的次数)
	U32 nReleaseTaskCnt;		// 释放采集任务的次数(即调用AI_ReleaseTask()的次数)
	U32 nStartTaskCnt;			// 开始采集任务的次数(即调用AI_StartTask()的次数)
	U32 nStopTaskCnt;			// 停止采集任务的次数(即调用AI_StopTask()的次数)
	U32 nTransRate;				// 传输速率, 即每秒传输点数(sps),作为USB及应用软件传输性能的监测信息

	U32 nReserved0;				// 保留字段(暂未定义)
	U32 nReserved1;				// 保留字段(暂未定义)
	U32 nReserved2;				// 保留字段(暂未定义)
} PXI5630_AI_STATUS, *PPXI5630_AI_STATUS;

// #################### AI主要信息结构体(PXI5630_AI_MAIN_INFO) #######################
typedef struct _PXI5630_AI_MAIN_INFO
{
	U32 nChannelCount;		// AI通道数量
	U32 nSampRangeCount;	// AI采样范围挡位数量
	U32 nSampGainCount;		// AI采样增益挡位数量
	U32 nCouplingCount;		// AI耦合挡位数量
	U32 nImpedanceCount;	// AI阻抗的挡位数量
	U32 nDepthOfMemory;		// AI板载存储器深度(点数)
	U32 nSampResolution;	// AI采样分辨率(如=8表示8Bit; =12表示12Bit; =14表示14Bit; =16表示16Bit)
	U32 nSampCodeCount;		// AI采样编码数量(如256, 4096, 16384, 65536)
	U32 nTrigLvlResolution;	// 触发电平分辨率(如=8表示8Bit; =12表示12Bit; =16表示16Bit)
	U32 nTrigLvlCodeCount;	// 触发电平编码数量(如256, 4096)

	U32 nReserved0;			// 保留字段(暂未定义)
	U32 nReserved1;			// 保留字段(暂未定义)
	U32 nReserved2;			// 保留字段(暂未定义)
	U32 nReserved3;			// 保留字段(暂未定义)
	U32 nReserved4;			// 保留字段(暂未定义)
} PXI5630_AI_MAIN_INFO, *PPXI5630_AI_MAIN_INFO;

// #################### AI电压范围信息结构体(PXI5630_AI_VOLT_RANGE_INFO) #######################
typedef struct _PXI5630_AI_VOLT_RANGE_INFO
{
	U32 nSampleRange;		// 当前采样范围挡位号
	U32 nReserved0;			// 保留字段(暂未定义)
	F64 fMaxVolt;			// 采样范围的最大电压值,单位:伏(V)
	F64 fMinVolt;			// 采样范围的最小电压值,单位:伏(V)
	F64 fAmplitude;			// 采样范围幅度,单位:伏(V)
	F64 fHalfOfAmp;			// 采样范围幅度的二分之一,单位:伏(V)
	F64 fCodeWidth;			// 编码宽度,单位:伏(V), 即每个单位码值所分配的电压值
	F64 fOffsetVolt;		// 偏移电压,单位:伏(V),一般用于零偏校准
	F64 fOffsetCode;		// 偏移码值,一般用于零偏校准,它代表的电压值等价于fOffsetVolt
	char strDesc[16];		// 采样范围字符描述,如"±10V", "0-10V"等

	U32 nPolarity;			// 采样范围的极性(0=双极性BiPolar, 1=单极性UniPolar)
	U32 nCodeCount;			// 原码数量
	I32 nMaxCode;			// 原码最大值
	I32 nMinCode;	        // 原码最小值

	U32 nReserved1;			// 保留字段(暂未定义)
	U32 nReserved2;			// 保留字段(暂未定义)
	U32 nReserved3;			// 保留字段(暂未定义)
	U32 nReserved4;			// 保留字段(暂未定义)
} PXI5630_AI_VOLT_RANGE_INFO, *PPXI5630_AI_VOLT_RANGE_INFO;

// 结构体AI_VOLT_RANGE_INFO的数据成员Polarity所用的采样范围极性选项
#define PXI5630_AI_POLAR_BIPOLAR	0 // 双极性
#define PXI5630_AI_POLAR_UNIPOLAR	1 // 单极性

// #################### AI增益信息结构体(PXI5630_AI_VOLT_GAIN_INFO) #######################
typedef struct _PXI5630_AI_VOLT_GAIN_INFO
{
	U32 nSampleGain;		// 当前采样增益挡位号
	U32 nReserved0;			// 保留字段(暂未定义)
	F64 fAmpFactor;			// 放大倍数(Amplification Factor)
	char strDesc[16];		// 采样增益字符描述,如"10倍", "100倍"等

	U32 nReserved1;			// 保留字段(暂未定义)
	U32 nReserved2;			// 保留字段(暂未定义)
	U32 nReserved3;			// 保留字段(暂未定义)
	U32 nReserved4;			// 保留字段(暂未定义)
} PXI5630_AI_VOLT_GAIN_INFO, *PPXI5630_AI_VOLT_GAIN_INFO;

// #################### AI速率信息结构体(PXI5630_AI_SAMP_RATE_INFO) #######################
typedef struct _PXI5630_AI_SAMP_RATE_INFO
{
	F64 fMaxRate;		// 单通道最大采样速率(sps),多通道时各通道平分最大采样率
	F64 fMinRate;		// 单通道最小采样速率(sps),多通道时各通道平分最小采样率
	F64 fTimerBase;		// 时钟基准（即板载晶振频率）单位:Hz
	U32 nDivideMode;	// 分频模式,0=整数分频(INTDIV), 1=DDS分频(DDSDIV)
	U32 nRateType;		// 速率类型,指fMaxRate和fMinRate的类型, =0:表示为所有采样通道的总速率, =1:表示为每个采样通道的速率

	U32 nReserved0;		// 保留字段(暂未定义)
	U32 nReserved1;		// 保留字段(暂未定义)
} PXI5630_AI_SAMP_RATE_INFO, *PPXI5630_AI_SAMP_RATE_INFO;


// ##################### AO工作参数结构体PXI5630_AO_PARAM描述 ###################
typedef struct _PXI5630_AO_CH_PARAM // AI通道参数结构体
{
	U32 bChannelEn;			// 通道采样允许
	U32 nSampleRange;		// 采样范围,具体定义请参考下面常量定义
	U32 nReserved0;			// 保留(未用)
	U32 nReserved1;			// 保留(未用)
	U32 nReserved2;			// 保留(未用)
	U32 nReserved3;			// 保留(未用)
} PXI5630_AO_CH_PARAM, *PPXI5630_AO_CH_PARAM;

// AO硬件参数结构体PXI5630_AO_CH_PARAM中的nSampleRange参数所使用的模拟量输入采样范围挡位选项
#define PXI5630_AO_SAMPRANGE_0_P5V			0 // 0-5V
#define PXI5630_AO_SAMPRANGE_0_P10V			1 // 0-10V
#define PXI5630_AO_SAMPRANGE_N5_P5V			2 // ±5V
#define PXI5630_AO_SAMPRANGE_N10_P10V		3 // ±10V
#define PXI5630_AO_SAMPRANGE_N2D5_P2D5V		4 // ±2.5V
#define PXI5630_AO_SAMPRANGE_N2D5_P7D5V		5 // -2.5~7.5V

typedef struct _PXI5630_AO_PARAM // 跟整个AO有关的硬件工作参数(简称AO工作参数)
{
	// 通道参数
	PXI5630_AO_CH_PARAM CHParam[4]; // 通道参数（通道使能,采样范围）

	// 时钟参数
	U32 nSampleMode;		// 采样模式, 0=单点采样(按需), 1、硬件定时单点(暂不支持),2=有限点采样, 3=连续采样
	U32 nSampsPerChan;		// 有限点每通道采生成点数(字)
	F64 fSampleRate;		// 采样速率(Sample Rate), 单位为sps,取值范围为[1sps, 500000sps],它是每个采样通道的采样速率
	U32 nClockSource;		// 时钟源选择, 详见上面常量定义
	U32 nClockOutput;		// 采样时钟输出选择,详见上面常量定义
	U32 bRegenModeEn;		// 波形重生成模式允许(在连续采样模式中有效),此卡暂不支持
	U32 nReserved0;			// 保留字段(暂未定义)

	// 开始触发参数
	U32 bDTriggerEn;		// 数字触发DTR允许(Digital Trigger Enable), =FALSE:表示禁止; =TRUE:表示允许,触发信号由连接器CN2上的DIO1复用输入,因此初始化时会将DIO1的方向强制置为输入
	U32 nDTriggerDir;	    // 数字触发方向(Digital Trigger Direction)
	U32 nDTriggerSens;		// DTR触发灵敏度(Trigger Sensitive for Digital and Analog trigger),单位:微秒(uS),取值范围[0, 1638]
	U32 nDTrigChannel;		// DTR触发通道选择,详见上面常量定义

	U32 bATriggerEn;		// 模拟数字触发ATR允许(Analog Trigger Enable), =TRUE:表示允许, =FALSE:表示禁止
	U32 nATriggerDir;		// 模拟触发方向(Analog Trigger Direction)
	F32 fTriggerLevel;		// 触发电平(Trigger Level)
	U32 nATriggerSens;		// ATR触发灵敏度(Trigger Sensitive for Digital and Analog trigger),单位:微秒(uS),取值范围[0, 1638]
	U32 nATrigSource;		// ATR触发源选择,详见下面常量定义

	U32 nSyncTSOut;			// 同步触发信号输出通道选择, 详见下面常量定义
	U32 nDelaySamps;		// 触发延迟点数, 单位:采样点,取值范围32位有效[0, 4294967295],0:Post Trigger, >0:Delay Trigger
	U32 nReserved1;			// 保留字段(暂未定义)

	// 其他参数
	U32 nReserved2;			// 保留字段(暂未定义)
	U32 nReserved3;			// 保留字段(暂未定义)
	U32 nReserved4;			// 保留字段(暂未定义)
	U32 nReserved5;			// 保留字段(暂未定义)
} PXI5630_AO_PARAM, *PPXI5630_AO_PARAM;

// AO硬件参数结构体PXI5630_AO_PARAM中的nSampleMode采样模式所使用的选项
#define PXI5630_AO_SAMPMODE_ONE_DEMAND		0 // 单点采样(按需)
#define PXI5630_AO_SAMPMODE_ONE_HWTIMED		1 // 单点采样(硬件定时,Hardware Timed, 本设备暂时不支持)
#define PXI5630_AO_SAMPMODE_FINITE			2 // 有限点采样
#define PXI5630_AO_SAMPMODE_CONTINUOUS		3 // 连续采样

// AO硬件参数结构体PXI5630_AO_PARAM中的nDTriggerDir触发方向所使用的选项
#define PXI5630_AO_TRIGDIR_FALLING			0 // 下降沿/低电平
#define PXI5630_AO_TRIGDIR_RISING			1 // 上升沿/高电平
#define PXI5630_AO_TRIGDIR_CHANGE			2 // 变化(即上下边沿/高低电平均有效)

// #################### AO工作状态结构体PXI5630_AO_STATUS描述 #####################
typedef struct _PXI5630_AO_STATUS
{
	U32 bTaskDone;				// 生成任务完成标志, =TRUE:表示生成任务完成, =FALSE:表示生成任务未完成,正在进行中
	U32 bTriggered;				// 触发标志, =TRUE:表示已被触发, =FALSE:表示未被触发(即正等待触发)

	U32 nTaskState;			// 生成任务状态, =1:正常, 其它值表示有异常情况
	U32 nAvailSampsPerChan;		// 可写点数,最好等它大于参数nWriteSampsPerChan时才能调用AO_WriteAnalog()写入采样数据
	U32 nMaxAvailSampsPerChan;	// 自AO_StartTask()后出现过的最大可写点数,状态值范围[0, nBufSampsPerChan],它是为监测采集软件性能而提供,如果此值越趋近于1,则表示意味着性能越高,越不易出现溢出丢点的可能
	U32 nBufSampsPerChan;		// 每通道缓冲区大小(采样点数)
	U64 nSampsPerChanAcquired;	// 每通道已采样点数(自开始AO_StartTask()之后所采样的点数),这个只是给用户的统计数据

	U32 nHardUnderflowCnt;		// 硬件缓冲下溢次数(在不下溢情况下恒等于0)
	U32 nSoftUnderflowCnt;		// 软件缓冲下溢次数(在不下溢情况下恒等于0)
	U32 nInitTaskCnt;			// 初始化生成任务的次数(即调用AO_InitTask()的次数)
	U32 nReleaseTaskCnt;		// 释放生成任务的次数(即调用AO_ReleaseTask()的次数)
	U32 nStartTaskCnt;			// 开始生成任务的次数(即调用AO_StartTask()的次数)
	U32 nStopTaskCnt;			// 停止生成任务的次数(即调用AO_StopTask()的次数)
	U32 nTransRate;				// 传输速率, 即每秒传输点数(sps),作为USB及应用软件传输性能的监测信息

	U32 nReserved0;				// 保留字段(暂未定义)
	U32 nReserved1;				// 保留字段(暂未定义)
	U32 nReserved2;				// 保留字段(暂未定义)
	U32 nReserved3;				// 保留字段(暂未定义)
	U32 nReserved4;				// 保留字段(暂未定义)
} PXI5630_AO_STATUS, *PPXI5630_AO_STATUS;

// #################### AO主要信息结构体(PXI5630_AO_MAIN_INFO) #######################
typedef struct _PXI5630_AO_MAIN_INFO
{
	U32 nChannelCount;		// AO通道数量
	U32 nSampRangeCount;	// AO采样范围挡位数量
	U32 nSampGainCount;		// AO增益挡位数量
	U32 nCouplingCount;		// AO耦合挡位数量
	U32 nImpedanceCount;	// AO阻抗的挡位数量
	U32 nDepthOfMemory;		// AO板载存储器深度(点数)
	U32 nSampResolution;	// AO采样分辨率(如=8表示8Bit; =12表示12Bit; =14表示14Bit; =16表示16Bit)
	U32 nSampCodeCount;		// AO采样编码数量(如256, 4096, 16384, 65536)
	U32 nTrigLvlResolution;	// 触发电平分辨率(如=8表示8Bit; =12表示12Bit; =16表示16Bit)
	U32 nTrigLvlCodeCount;	// 触发电平编码数量(如256, 4096)

	U32 nReserved0;			// 保留字段(暂未定义)
	U32 nReserved1;			// 保留字段(暂未定义)
	U32 nReserved2;			// 保留字段(暂未定义)
	U32 nReserved3;			// 保留字段(暂未定义)
} PXI5630_AO_MAIN_INFO, *PPXI5630_AO_MAIN_INFO;

// #################### AO采样范围信息结构体(PXI5630_AO_VOLT_RANGE_INFO) #######################
typedef struct _PXI5630_AO_VOLT_RANGE_INFO
{
	U32 nSampleRange;		// 当前采样范围挡位号
	U32 nReserved0;			// 保留字段(暂未定义)
	F64 fMaxVolt;			// 采样范围的最大电压值,单位:伏(V)
	F64 fMinVolt;			// 采样范围的最小电压值,单位:伏(V)
	F64 fAmplitude;			// 采样范围幅度,单位:伏(V)
	F64 fHalfOfAmp;			// 采样范围幅度的二分之一,单位:伏(V)
	F64 fCodeWidth;			// 编码宽度,单位:伏(V), 即每个单位码值所分配的电压值
	F64 fOffsetVolt;		// 偏移电压,单位:伏(V),一般用于零偏校准
	F64 fOffsetCode;		// 偏移码值,一般用于零偏校准,它代表的电压值等价于fOffsetVolt
	char strDesc[16];		// 采样范围字符描述,如"±10V", "0-10V"等

	U32 nPolarity;			// 采样范围的极性(0=双极性BiPolar, 1=单极性UniPolar)
	U32 nCodeCount;			// 原码数量
	I32 nMaxCode;			// 原码最大值
	I32 nMinCode;	        // 原码最小值

	U32 nReserved1;			// 保留字段(暂未定义)
	U32 nReserved2;			// 保留字段(暂未定义)
	U32 nReserved3;			// 保留字段(暂未定义)
	U32 nReserved4;			// 保留字段(暂未定义)
} PXI5630_AO_VOLT_RANGE_INFO, *PPXI5630_AO_VOLT_RANGE_INFO;

// 结构体AO_VOLT_RANGE_INFO的数据成员Polarity所用的采样范围极性选项
#define PXI5630_AO_POLAR_BIPOLAR	0 // 双极性
#define PXI5630_AO_POLAR_UNIPOLAR	1 // 单极性

// #################### AO速率信息结构体(PXI5630_AO_SAMP_RATE_INFO) #######################
typedef struct _PXI5630_AO_SAMP_RATE_INFO
{
	F64 fMaxRate;		// 单通道最大采样速率(sps),多通道时各通道平分最大采样率
	F64 fMinRate;		// 单通道最小采样速率(sps),多通道时各通道平分最小采样率
	F64 fTimerBase;		// 时钟基准（即板载晶振频率）单位:Hz
	U32 nDivideMode;	// 分频模式,0=整数分频(INTDIV), 1=DDS分频(DDSDIV)
	U32 nRateType;		// 速率类型,指fMaxRate和fMinRate的类型, =0:表示为所有采样通道的总速率, =1:表示为每个采样通道的速率

	U32 nReserved0;		// 保留字段(暂未定义)
	U32 nReserved1;		// 保留字段(暂未定义)
} PXI5630_AO_SAMP_RATE_INFO, *PPXI5630_AO_SAMP_RATE_INFO;

// AO_GetVoltRangeInfo()函数的参数nSampleRange所用的采样范围挡位选项
#define PXI5630_AO_SAMPRANGE_FROM_DEVICE 0xFFFFFFFF	// 来自设备当前的采样范围挡位

typedef struct _PXI5630_CTR_PARAM     
{
	U32 lCNTFunSel;			// 计数器功能选择
	U32 SampMode;			// 采集模式(有效功能:边沿计数、频率测量、周期测量、脉宽测量、两边沿间隔)
	U32 Edge1Dir;			// 有效边沿1(有效功能:边沿计数、频率测量(高频、大范围)、两边沿间隔)
	U32 Edge2Dir;			// 有效边沿2(有效功能:频率测量(低频)、脉宽测量、两边沿间隔)
	U32 NSampPara;			// N采样有效时,为N采样深度; 脉冲序列输出有效时,为N脉冲序列输出个数
	U32 lClkSource;			// 时钟源选择(有效功能:(DI数字量输入:N采样,连续采样)、（DO数字量输出:N采样,连续采样)、(边沿计数:N采样,连续采样))
	U32 lClkDir;			// 时钟源有效边沿选择(有效功能:(DI数字量输入:N采样,连续采样)、（DO数字量输出:N采样,连续采样)、(边沿计数:N采样,连续采样))
	U32 lInitVal;			// 计数初值(有效功能:边沿计数、编码器)
	U32 CntWay;				// 计数方式(有效功能:边沿计数)
	U32 MeasureWay;			// 测量方法(有效功能:频率、周期测量)
	U32 MeasureTime;		// 测量时间(单位:ms)(有效功能:频率、周期测量(高频))
	U32 MeasureDivisor;		// 除数(最小为3,有效功能:频率、周期测量(大范围))	
	U32 CntInputMode;		// 编码器解码类型
	U32 ZIndexEnable;		// Z索引使能(=TRUE,使能; =FALSE,禁止)
	U32 ZIndexPhase;		// Z索引相位
	U32 ZIndexValue;		// Z索引值(有效功能:编码器)
	U32 PulseOutputWay;		// 脉冲输出方式控制
	U32 PulseOutputFreeSts;	// 脉冲输出空闲状态控制
	F64 dPulseDelay;		// 初始延时时间(单位:ns)(有效功能:脉冲序列输出)
	F64 dLowLevelTime;		// 低电平时间(单位:ns)(有效功能:脉冲序列时间输出)
	F64 dHighLevelTime;		// 高电平时间(单位:ns)(有效功能:脉冲序列时间输出)
	U32 lDuty;				// 占空比(1:99 有效功能:脉冲序列频率输出) 
	F32 fFrequency;			// 频率(单位Hz,精确到0.1Hz)(有效功能:脉冲序列频率输出) 
} PXI5630_CTR_PARAM, *PPXI5630_CTR_PARAM;

//***********************************************************
// CNT参数PXI5630_CTR_PARAM中的lCNTFunSel使用的计数器功能选项
#define PXI5630_CTR_FUN_CNT					0x00 // 边沿计数
#define PXI5630_CTR_FUN_FREPERI				0x01 // 频率测量/周期测量
#define PXI5630_CTR_FUN_HALFPERIOD			0x02 // 半周期测量
#define PXI5630_CTR_FUN_PULSEWIDTH			0x03 // 脉宽测量
#define PXI5630_CTR_FUN_EDGEINTERVAL			0x04 // 两边沿间隔测量
#define PXI5630_CTR_FUN_ENCODER				0x05 // 编码器
#define PXI5630_CTR_FUN_PULSEOUTPUT			0x06 // 脉冲序列输出

//***********************************************************
// CNT参数PXI5630_CTR_PARAM中的SampMode使用的采集模式选项
#define PXI5630_CTR_SAMP_MODE_SINGLE				0x00 // 单点采样/单脉冲
#define PXI5630_CTR_SAMP_MODE_N					0x01 // N采样/N脉冲
#define PXI5630_CTR_SAMP_MODE_SEQUENCE			0x02 // 连续采样/连续脉冲

//***********************************************************
// CNT参数PXI5630_CTR_PARAM中的Edge1Dir使用的有效边沿1选项
#define PXI5630_CTR_EDGE1_DIR_POSITIVE			0x00 // 上升沿有效
#define PXI5630_CTR_EDGE1_DIR_NEGATIVE			0x01 // 下降沿有效

//***********************************************************
// CNT参数PXI5630_CTR_PARAM中的Edge2Dir使用的有效边沿2选项
#define PXI5630_CTR_EDGE2_DIR_POSITIVE			0x00 // 上升沿有效
#define PXI5630_CTR_EDGE2_DIR_NEGATIVE			0x01 // 下降沿有效

//***********************************************************
// CNT参数PXI5630_CTR_PARAM中的CntWay使用的计数方式选项
#define PXI5630_CTR_WAY_DEC					0x00 // 减计数
#define PXI5630_CTR_WAY_ADD					0x01 // 加计数
#define PXI5630_CTR_WAY_EXIT					0x02 // 外部控制计数

//***********************************************************
// CNT参数PXI5630_CTR_PARAM中的MeasureWay使用的测量方法选项
#define PXI5630_CTR_MEASURE_WAY_LOWFRE			0x00 // 低频
#define PXI5630_CTR_MEASURE_WAY_HIGHFRE			0x01 // 高频
#define PXI5630_CTR_MEASURE_WAY_LARGE			0x02 // 大范围

//***********************************************************
// CNT参数PXI5630_CTR_PARAM中的PulseOutputWay使用的脉冲输出方式选项
#define PXI5630_CTR_PULSE_OUTPUTWAY_FRE			0x00 // 频率
#define PXI5630_CTR_PULSE_OUTPUTWAY_TIME		0x01 // 时间

//***********************************************************
// CNT参数PXI5630_CTR_PARAM中的PulseOutputFreeSts使用的脉冲输出空闲状态选项
#define PXI5630_CTR_PULSE_OUTPUTFREESTS_LOW		 0x00 // 低电平
#define PXI5630_CTR_PULSE_OUTPUTFREESTS_HIGH	 0x01 // 高电平

//***********************************************************
// CNT参数PXI5630_CTR_PARAM中的CntInputMode使用的编码器解码类型选项
#define PXI5630_CTR_CNTMODE_QUADRATURE_X1		0x00	// 计数器单端输入,Channel A上升沿有效开始计数
#define PXI5630_CTR_CNTMODE_QUADRATURE_X2		0x01	// 计数器单端输入,Channel A只要有跳变就开始计数
#define PXI5630_CTR_CNTMODE_QUADRATURE_X4		0x02	// 计数器单端输入,Channel A或Channel B只要有跳变就开始计数
#define PXI5630_CTR_CNTMODE_2_PULSE				0x03	// 双脉冲模式,一个做顺时针计数,另一个做逆时针计数, 当Channel B在上升沿时有效
#define PXI5630_CTR_CNTMODE_1_PULSE				0x04	// A线为脉冲,B线为方向;例:如果Channel B 是 1,则Channel A在上升沿有效开始

//***********************************************************
// CNT参数PXI5630_CTR_PARAM中的ZIndexPhase使用的Z索引相位选项
#define PXI5630_CTR_ZINDEX_PHASE_AHBH			0x00	// A高B高
#define PXI5630_CTR_ZINDEX_PHASE_AHBL			0x01	// A高B低
#define PXI5630_CTR_ZINDEX_PHASE_ALBH			0x02	// A低B高
#define PXI5630_CTR_ZINDEX_PHASE_ALBL			0x03	// A低B低

// CTR硬件参数结构体PXI5630_CTR_PARAM中的lClkSource所使用的选项
#define PXI5630_CTR_CLKSRC_PFI00			 0 // PFI00输入时钟
#define PXI5630_CTR_CLKSRC_PFI01			 1 // PFI01输入时钟
#define PXI5630_CTR_CLKSRC_PFI02			 2 // PFI02输入时钟
#define PXI5630_CTR_CLKSRC_PFI03			 3 // PFI03输入时钟
#define PXI5630_CTR_CLKSRC_PFI04			 4 // PFI04输入时钟
#define PXI5630_CTR_CLKSRC_PFI05			 5 // PFI05输入时钟
#define PXI5630_CTR_CLKSRC_PFI06			 6 // PFI06输入时钟
#define PXI5630_CTR_CLKSRC_PFI07			 7 // PFI07输入时钟
#define PXI5630_CTR_CLKSRC_PFI08			 8 // PFI08输入时钟
#define PXI5630_CTR_CLKSRC_PFI09			 9 // PFI09输入时钟
#define PXI5630_CTR_CLKSRC_PFI10			10 // PFI10输入时钟
#define PXI5630_CTR_CLKSRC_PFI11			11 // PFI11输入时钟
#define PXI5630_CTR_CLKSRC_PFI12			12 // PFI12输入时钟
#define PXI5630_CTR_CLKSRC_PFI13			13 // PFI13输入时钟
#define PXI5630_CTR_CLKSRC_PFI14			14 // PFI14输入时钟
#define PXI5630_CTR_CLKSRC_PFI15			15 // PFI15输入时钟
#define PXI5630_CTR_CLKSRC_PXITRG0			16 // PXI_Trig0输入时钟
#define PXI5630_CTR_CLKSRC_PXITRG1			17 // PXI_Trig1输入时钟
#define PXI5630_CTR_CLKSRC_PXITRG2			18 // PXI_Trig2输入时钟
#define PXI5630_CTR_CLKSRC_PXITRG3			19 // PXI_Trig3输入时钟
#define PXI5630_CTR_CLKSRC_PXITRG4			20 // PXI_Trig4输入时钟
#define PXI5630_CTR_CLKSRC_PXITRG5			21 // PXI_Trig5输入时钟
#define PXI5630_CTR_CLKSRC_PXITRG6			22 // PXI_Trig6输入时钟
#define PXI5630_CTR_CLKSRC_PXITRG7			23 // PXI_Trig7输入时钟
#define	PXI5630_CTR_CLKSRC_PXISTAR			24 // PXI_STAR输入时钟

//***********************************************************
// CNT参数PXI5630_CTR_PARAM中的lClkDir使用的时钟源有效边沿选项
#define PXI5630_CTR_CLK_DIR_POSITIVE			 0x00 // 上升沿有效
#define PXI5630_CTR_CLK_DIR_NEGATIVE			 0x01 // 下降沿有效



// ############# 端口参数结构体PXI5630_PORT_PARAM描述 #############
typedef struct _PXI5630_PORT_PARAM // IO端口通道参数结构体
{
	U32 nDIODir[8];			// DIO方向,0:输入 1:输出
	U32 nDIOVal[8];			// DIO方向为输出时输出值,0:低高平 1:高电平
} PXI5630_PORT_PARAM, *PPXI5630_PORT_PARAM;

// IO端口参数PXI5630_PORT_CH_PARAM中的nDIODir功能选择所使用的选项
#define PXI5630_PORT_DIR_IN				0	// 输入
#define PXI5630_PORT_DIR_OUT			1	// 输出

// IO端口参数功能选择所使用的选项
#define PXI5630_PORT_FUN_DIO			0	// DIO,端口0只能为DIO
#define PXI5630_PORT_FUN_PFI			1	// PFI


typedef struct _PXI5630_P0_DI_PARAM // Port0 DI有关的硬件工作参数(简称DI工作参数)
{
	U32 nSampleMode[8];		// 采样模式, 将已将方向置为输入的线(DI)配置模式,所有的DI只能为(单点和有限)或(单点和连续)
	U32 nSampsPoints;		// 有限点采样点数
	U32 nSClockSource;		// 采集时钟源选择, 详见下面常量定义
	// 其他方面
	U32 nReserved0;			// 保留字段(暂未定义)
} PXI5630_P0_DI_PARAM, *PPXI5630_P0_DI_PARAM;

typedef struct _PXI5630_P0_DO_PARAM // Port0 DO有关的硬件工作参数(简称DO工作参数)
{
	U32 nGeneraMode[8];		// 生成模式, 将已将方向置为输出的线(DO)配置模式,所有的DO只能为(单点和有限)或(单点和连续)
	U32 nGeneraPoints;		// 有限点生成点数
	U32 nGClockSource;		// 生成时钟源选择, 详见下面常量定义
	// 其他方面
	U32 nReserved0;			// 保留字段(暂未定义)
} PXI5630_P0_DO_PARAM, *PPXI5630_P0_DO_PARAM;


// DI硬件参数结构体PXI5630_P0_DI_PARAM中的采样/生成模式所使用的选项
#define PXI5630_DIO_SGMODE_ONE_DEMAND	0 // 单点采样
#define PXI5630_DIO_SGMODE_FINITE		1 // 有限点采样
#define PXI5630_DIO_SGMODE_CONTINUOUS	2 // 连续采样


// DI硬件参数结构体PXI5630_P0_DI_PARAM中的nSClockSource采集时钟源所使用的选项
// DO硬件参数结构体PXI5630_P0_DO_PARAM中的nGClockSource生成时钟源所使用的选项
#define PXI5630_DIO_CLKSRC_PFI00			 0 // PFI00输入时钟
#define PXI5630_DIO_CLKSRC_PFI01			 1 // PFI01输入时钟
#define PXI5630_DIO_CLKSRC_PFI02			 2 // PFI02输入时钟
#define PXI5630_DIO_CLKSRC_PFI03			 3 // PFI03输入时钟
#define PXI5630_DIO_CLKSRC_PFI04			 4 // PFI04输入时钟
#define PXI5630_DIO_CLKSRC_PFI05			 5 // PFI05输入时钟
#define PXI5630_DIO_CLKSRC_PFI06			 6 // PFI06输入时钟
#define PXI5630_DIO_CLKSRC_PFI07			 7 // PFI07输入时钟
#define PXI5630_DIO_CLKSRC_PFI08			 8 // PFI08输入时钟
#define PXI5630_DIO_CLKSRC_PFI09			 9 // PFI09输入时钟
#define PXI5630_DIO_CLKSRC_PFI10			10 // PFI10输入时钟
#define PXI5630_DIO_CLKSRC_PFI11			11 // PFI11输入时钟
#define PXI5630_DIO_CLKSRC_PFI12			12 // PFI12输入时钟
#define PXI5630_DIO_CLKSRC_PFI13			13 // PFI13输入时钟
#define PXI5630_DIO_CLKSRC_PFI14			14 // PFI14输入时钟
#define PXI5630_DIO_CLKSRC_PFI15			15 // PFI15输入时钟
#define PXI5630_DIO_CLKSRC_PXITRG0			16 // PXI_Trig0输入时钟
#define PXI5630_DIO_CLKSRC_PXITRG1			17 // PXI_Trig1输入时钟
#define PXI5630_DIO_CLKSRC_PXITRG2			18 // PXI_Trig2输入时钟
#define PXI5630_DIO_CLKSRC_PXITRG3			19 // PXI_Trig3输入时钟
#define PXI5630_DIO_CLKSRC_PXITRG4			20 // PXI_Trig4输入时钟
#define PXI5630_DIO_CLKSRC_PXITRG5			21 // PXI_Trig5输入时钟
#define PXI5630_DIO_CLKSRC_PXITRG6			22 // PXI_Trig6输入时钟
#define PXI5630_DIO_CLKSRC_PXITRG7			23 // PXI_Trig7输入时钟
#define PXI5630_DIO_CLKSRC_PXISTAR			24 // PXI_STAR输入时钟


// #################### AO工作状态结构体PXI5630_P0_DO_STATUS描述 #####################
typedef struct _PXI5630_P0_DO_STATUS
{
	U32 bTaskDone;				// 生成任务完成标志, =TRUE:表示生成任务完成, =FALSE:表示生成任务未完成,正在进行中

	U32 nTaskState;			// 生成任务状态, =1:正常, 其它值表示有异常情况
	U32 nAvailSampsPerChan;		// 可写点数,最好等它大于参数nWriteSampsPerChan时才能调用AO_WriteAnalog()写入采样数据
	U32 nBufSampsPerChan;		// 缓冲区大小

	U32 nHardUnderflowCnt;		// 硬件缓冲下溢次数(在不下溢情况下恒等于0)
	U32 nSoftUnderflowCnt;		// 软件缓冲下溢次数(在不下溢情况下恒等于0)
	U32 nTransRate;				// 传输速率, 即每秒传输点数(sps),作为USB及应用软件传输性能的监测信息

	U64 nSampsPerChanAcquired;	// 已采样点数(自开始AO_StartTask()之后所采样的点数),这个只是给用户的统计数据

	U32 nReserved0;				// 保留字段(暂未定义)
	U32 nReserved1;				// 保留字段(暂未定义)
	U32 nReserved2;				// 保留字段(暂未定义)
	U32 nReserved3;				// 保留字段(暂未定义)
	U32 nReserved4;				// 保留字段(暂未定义)
} PXI5630_P0_DO_STATUS, *PPXI5630_P0_DO_STATUS;


// ################################ 函数错误信息 ################################
#define ERROR_NO_AVAILABLE_SAMPS	(0xE0000000+1)	// 无有效点数
#define ERROR_TASK_FAIL				(0xE0000000+2)  // 任务失败
#define ERROR_RATE_OVER_RANGE		(0xE0000000+3)	// 采样速率超限

//***********************************************************
// 用户函数接口
#ifndef _PXI5630_DRIVER_
#define DEVAPI __declspec(dllimport)
#else
#define DEVAPI __declspec(dllexport)
#endif

#ifdef __cplusplus
extern "C" {
#endif
	//######################## 设备对象管理函数 ##############################
	HANDLE DEVAPI WINAPI PXI5630_DEV_Create(LONG DeviceLgcID = 0);		// 用逻辑号创建设备对象
	HANDLE DEVAPI WINAPI PXI5630_DEV_CreateEx(LONG DeviceID = 0);		// 物理ID创建设备对象
	LONG DEVAPI WINAPI PXI5630_DEV_GetCount(HANDLE hDevice);			// 取得设备总台数
	BOOL DEVAPI WINAPI PXI5630_DEV_GetCurrentIdx(HANDLE hDevice,		// 取得当前设备相应的ID号
									PLONG DeviceLgcID, 
									PLONG DevicePhysID);
	BOOL DEVAPI WINAPI PXI5630_DEV_ListDlg(HANDLE hDevice); // 以对话框窗体方式列表系统当中的所有的该PCI设备
	BOOL DEVAPI WINAPI PXI5630_DEV_Release(HANDLE hDevice); // 仅释放设备对象

	// ################################ AI模拟量输入实现函数 ################################
	BOOL DEVAPI WINAPI PXI5630_AI_InitTask(				// 初始化AI采集任务(Initialize Task)
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									PPXI5630_AI_PARAM pAIParam); // AI工作参数, 它仅在此函数中决定硬件初始状态和各工作模式,可以事先由AI_VerifyParam()进行参数校验

	BOOL DEVAPI WINAPI PXI5630_AI_StartTask(				// 开始采集任务
									HANDLE hDevice);		// 设备对象句柄,它由DEV_Create()函数创建

	BOOL DEVAPI WINAPI PXI5630_AI_SendSoftTrig(			// 发送软件触发事件(Send Software Trigger),软件触发也叫强制触发
									HANDLE hDevice);		// 设备对象句柄,它由DEV_Create()函数创建

	BOOL DEVAPI WINAPI PXI5630_AI_GetStatus(HANDLE hDevice, PPXI5630_AI_STATUS pAIStatus);   // 取得AI各种状态

	BOOL DEVAPI WINAPI PXI5630_AI_WaitUntilTaskDone(		// 采集任务结束前等待,返回TRUE表示采集任务结束,不支持连续采样
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									F64 fTimeout);			// 用于等待的时间,单位:秒(S)

	BOOL DEVAPI WINAPI PXI5630_AI_ReadAnalog(				// 从采集任务中读取采样数据(电压数据序列)(Read analog data from the task)
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									F64 fAnlgArray[],		// 模拟数据数组(电压数组),用于返回采样的电压数据,取值区间由各通道采样时的采样范围决定(单位:V)
									U32 nReadSampsPerChan,	// 每通道请求读取的点数(单位:点)
									U32* pSampsPerChanRead,	// 返回每通道实际读取的点数(单位:点)
									U32* pAvailSampsPerChan,// 任务中还存在的可读点数, =NULL,表示无须返回
									F64 fTimeout);			// 超时时间,单位:秒(S)

	BOOL DEVAPI WINAPI PXI5630_AI_ReadBinary(				// 从采集任务中读取采样数据(原码数据序列)(Continuous Read All Channels for Code),返回余下的可读段数
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									U16 nBinArray[],		// 二进制数据数组（原码数组）,用于返回采样的原码数据,取值区间为[0, 65535]
									U32 nReadSampsPerChan,	// 每通道请求读取的点数(单位:点)
									U32* pSampsPerChanRead,	// 返回每通道实际读取的点数(单位:点)
									U32* pAvailSampsPerChan,// 任务中还存在的可读点数, =NULL,表示无须返回
									F64 fTimeout);			// 超时时间,单位:秒(S)

	BOOL DEVAPI WINAPI PXI5630_AI_StopTask(HANDLE hDevice);	// 停止采集任务

	BOOL DEVAPI WINAPI PXI5630_AI_ReleaseTask(HANDLE hDevice); // 释放采集任务

	// ========================= AI辅助操作函数 =========================
	BOOL DEVAPI WINAPI PXI5630_AI_GetMainInfo(				// 获得AI的主要信息
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									PPXI5630_AI_MAIN_INFO pMainInfo);// 获得AI主要信息

	BOOL DEVAPI WINAPI PXI5630_AI_GetVoltRangeInfo(			// 获得采样范围的各种信息(幅度、分辨率、极性)
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									U32 nChannel,			// AI物理通道号(由于本设备所有通道共享一个采样范围选择,故恒等于0)
									U32 nSampleRange,		// 采样范围选择[0, 4]
									PPXI5630_AI_VOLT_RANGE_INFO pRangeInfo); // 采样范围信息

	BOOL DEVAPI WINAPI PXI5630_AI_GetVoltGainInfo(			// 获得增益的各种信息(幅度、分辨率、极性)
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									U32 nChannel,			// AI物理通道号[0, 15]
									U32 nSampleGain,		// 增益选择[0, 3]
									PPXI5630_AI_VOLT_GAIN_INFO pGainInfo); // 增益信息

	BOOL DEVAPI WINAPI PXI5630_AI_GetRateInfo(				// 获得采样速率信息
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									PPXI5630_AI_SAMP_RATE_INFO pRateInfo); // 采样速率信息

	BOOL DEVAPI WINAPI PXI5630_AI_ScaleBinToVolt(			// 根据指定采样范围将单个通道的采样原码数据量化成电压数据,返回实际量化的点数
									PPXI5630_AI_VOLT_RANGE_INFO pRangeInfo, // 当前转换数据需要的采样范围信息
									PPXI5630_AI_VOLT_GAIN_INFO pGainInfo,   // 当前转换数据需要的采样增益信息(若于=NULL,表示不使用增益)
									F64 fVoltArray[],		// 电压数据数组,用于返回量化后的电压数据,单位V
									U16 nBinArray[],		// 二进制原码数组,用于传入量化前的原码数据,取值区间为[0, 65535], (单指某个通道的连续数据)
									U32 nScaleSamps,		// 请求量化的采样点数
									U32* pSampsScaled);		// 返回实际量化的采样点数, =NULL,表示无须返回

	BOOL DEVAPI WINAPI PXI5630_AI_ScaleVoltToBin(			// 根据指定采样范围将单个通道的电压数据量化成二进制原码数据,返回实际量化的点数
									PPXI5630_AI_VOLT_RANGE_INFO pRangeInfo, // 当前转换数据需要的采样范围信息
									PPXI5630_AI_VOLT_GAIN_INFO pGainInfo,   // 当前转换数据需要的采样增益信息(若于=NULL,表示不使用增益)
									U16 nBinArray[],		// 原码缓冲区,用于返回量化后的原码数据,取值区间为[0, 65535], (单指某个通道的连续数据)
									F64 fVoltArray[],		// 电压缓冲区,用于传入量化前的电压数据,单位V
									U32 nScaleSamps,		// 请求量化的采样点数
									U32* pSampsScaled);		// 返回实际量化的采样点数, =NULL,表示无须返回

	BOOL DEVAPI WINAPI PXI5630_AI_VerifyParam(				// 校验AI工作参数(Verify Parameter),建议在初始化AI参数前调用此函数校验各参数合法性
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									PPXI5630_AI_PARAM pAIParam);// 待校验的AI工作参数

	BOOL DEVAPI WINAPI PXI5630_AI_LoadParam(HANDLE hDevice, PPXI5630_AI_PARAM pAIParam); // 从PXI5630.ini中加载AI参数
	BOOL DEVAPI WINAPI PXI5630_AI_SaveParam(HANDLE hDevice, PPXI5630_AI_PARAM pAIParam); // 保存AI参数至PXI5630.ini
	BOOL DEVAPI WINAPI PXI5630_AI_ResetParam(HANDLE hDevice, PPXI5630_AI_PARAM pAIParam); // 将当前AI参数复位至出厂值

	// ################################ AO模拟量输出实现函数 ################################
	BOOL DEVAPI WINAPI PXI5630_AO_InitTask(					// 初始化生成任务(Initialize Task)
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									PPXI5630_AO_PARAM pAOParam); // AO工作参数, 它仅在此函数中决定硬件初始状态和各工作模式,可以事先由AI_VerifyParam()进行参数校验

	BOOL DEVAPI WINAPI PXI5630_AO_Reset(					// 复位AO相关配置以启动新任务
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									I32* pSBWPerChan);		// 复位后启动之前为防止AO溢出强烈建议每通道写入的点数

	BOOL DEVAPI WINAPI PXI5630_AO_StartTask(				// 开始生成任务(Start Task) 
									HANDLE hDevice);		// 设备对象句柄,它由DEV_Create()函数创建

	BOOL DEVAPI WINAPI PXI5630_AO_SendSoftTrig(				// 发送软件触发事件(Send Software Trigger),软件触发也叫强制触发
									HANDLE hDevice);		// 设备对象句柄,它由DEV_Create()函数创建

	BOOL DEVAPI WINAPI PXI5630_AO_GetStatus(HANDLE hDevice, PPXI5630_AO_STATUS pAOStatus);   // 取得AO各种状态

	BOOL DEVAPI WINAPI PXI5630_AO_WaitUntilTaskDone(		// 生成任务结束前等待,返回TRUE表示生成任务结束
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									F64 fTimeout);			// 超时时间,单位:秒(S)

	BOOL DEVAPI WINAPI PXI5630_AO_WriteAnalog(				// 向生成任务中写入AO输出的模拟量电压数据(Write analog data to the task)
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									F64 fAnlgArray[],		// AO0、AO1电压混合缓冲区,存放AO的模拟(电压)数据,取值区间由各通道采样时的采样范围决定(单位:V)
									U32 nWriteSampsPerChan,	// 每通道请求写入的点数(单位:点)
									U32* pSampsPerChanWritten,// 返回每通道实际写入的点数(单位:点), =NULL,表示无须返回
									U32* pAvailSampsPerChan,// 返回当前可写入的采样点数, =NULL,表示无须返回
									F64 fTimeout);			// 超时时间,单位:秒(S)

	BOOL DEVAPI WINAPI PXI5630_AO_WriteBinary(				// 向生成任务中写入AO输出的二进制原码数据(Write binary data to the task)
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									U16 nBinArray[],		// AO0、AO1原码混合缓冲区,用于输出生成的原码数据,取值区间为[0, 4095]
									U32 nWriteSampsPerChan,	// 每通道请求写入的点数(单位:点), =NULL,表示无须返回
									U32* pSampsPerChanWritten,// 返回每通道实际写入的点数(单位:点), =NULL,表示无须返回
									U32* pAvailSampsPerChan,// 返回当前可写入的采样点数, =NULL,表示无须返回
									F64 fTimeout);			// 超时时间,单位:秒(S)

	BOOL DEVAPI WINAPI PXI5630_AO_ReadbackAnalog(			// 回读所有AO通道的当前生成的模拟量数据(电压数据序列)(Read back analog data from the task)
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									F64 fAnlgArray[4]);		// fAnlgArray[0]=AO0电压数据,fAnlgArray[1]=AO1电压数据, 取值区间由相应通道的采样范围决定

	BOOL DEVAPI WINAPI PXI5630_AO_ReadbackBinary(			// 回读所有AO通道的当前生成的模拟量数据(二进制原码数据序列)(Read back binary data from the task)
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									U16 nBinArray[4]);		// nBinArray[0]=AO0原码数据,nBinArray[1]=AO1原码数据, 取值区间[0, 4095]

	BOOL DEVAPI WINAPI PXI5630_AO_StopTask(HANDLE hDevice);// 停止生成任务

	BOOL DEVAPI WINAPI PXI5630_AO_ReleaseTask(HANDLE hDevice);// 释放生成任务

	// ========================= AO辅助操作函数 =========================
	BOOL DEVAPI WINAPI PXI5630_AO_GetMainInfo(				// 获得AO的主要信息
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									PPXI5630_AO_MAIN_INFO pMainInfo); // 获得AI主要信息

	BOOL DEVAPI WINAPI PXI5630_AO_GetVoltRangeInfo(		// 获得采样范围的各种信息(幅度、分辨率、极性)
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									U32 nChannel,			// AO物理通道号[0, 3]
									U32 nSampleRange,		// 由用户指定的采样范围挡位号[0, 5],若=AO_SAMPRANGE_FROM_DEVICE(0xFFFFFFFF),表示依据设备当前的挡位号取得采样范围信息
									PPXI5630_AO_VOLT_RANGE_INFO pRangeInfo); // 采样范围信息

	BOOL DEVAPI WINAPI PXI5630_AO_GetRateInfo(				// 获得采样速率信息
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									PPXI5630_AO_SAMP_RATE_INFO pRateInfo); // 采样速率信息

	BOOL DEVAPI WINAPI PXI5630_AO_ScaleBinToVolt(			// 根据指定采样范围将单个通道的采样原码数据量化成电压数据,返回实际量化的点数
									PPXI5630_AO_VOLT_RANGE_INFO pRangeInfo, // 当前转换数据需要的采样范围信息
									F64 fVoltArray[],		// 电压缓冲区,用于返回量化后的电压数据,单位V
									U16 nBinArray[],		// 二进制原码缓冲区,用于传入量化前的原码数据,取值区间为[0, 4095], (单指某个通道的连续数据)
									U32 nScaleSamps,		// 请求量化的采样点数
									U32* pSampsScaled);		// 返回实际量化的采样点数

	BOOL DEVAPI WINAPI PXI5630_AO_ScaleVoltToBin(			// 根据指定采样范围将单个通道的电压数据量化成采样原码数据,返回实际量化的点数
									PPXI5630_AO_VOLT_RANGE_INFO pRangeInfo,// 当前转换数据需要的采样范围信息
									U16 nBinArray[],		// 原码缓冲区,用于返回量化后的原码数据,取值区间为[0, 4095], (单指某个通道的连续数据)
									F64 fVoltArray[],		// 电压缓冲区,用于传入量化前的电压数据,单位V
									U32 nScaleSamps,		// 请求量化的采样点数
									U32* pSampsScaled);		// 返回实际量化的采样点数

	BOOL DEVAPI WINAPI PXI5630_AO_VerifyParam(					// 校验AO工作参数(Verify Parameter),建议在初始化AO参数前调用此函数校验各参数合法性
									HANDLE hDevice,					// 设备对象句柄,它由DEV_Create()函数创建
									PPXI5630_AO_PARAM pAOParam);	// 待校验的AO工作参数

	BOOL DEVAPI WINAPI PXI5630_AO_LoadParam(HANDLE hDevice, PPXI5630_AO_PARAM pAOParam); // 从PXI5630.ini中加载AO参数
	BOOL DEVAPI WINAPI PXI5630_AO_SaveParam(HANDLE hDevice, PPXI5630_AO_PARAM pAOParam); // 保存AO参数至PXI5630.ini
	BOOL DEVAPI WINAPI PXI5630_AO_ResetParam(HANDLE hDevice, PPXI5630_AO_PARAM pAOParam); // 将当前AO参数复位至出厂值

	// ############################ CTR计数器函数 ############################
	BOOL DEVAPI WINAPI PXI5630_CTR_InitTask(			// 初始采集任务
									HANDLE hDevice,		// 设备对象句柄,它由DEV_Create()函数创建
									U32 nChannel,		// 通道号(本设备有2个通道,取值范围[0,1])
									PPXI5630_CTR_PARAM pCTRParam); // 工作参数

	BOOL DEVAPI WINAPI PXI5630_CTR_StartTask(			// 开珆采集任务
									HANDLE hDevice,		// 设备对象句柄,它由DEV_Create()函数创建
									U32 nChannel);		// 通道号(本设备有2个通道,取值范围[0,1])

	BOOL DEVAPI FAR PASCAL PXI5630_CTR_GetSts(			// 计数器工作状态
									HANDLE hDevice,			// 设备对象句柄,它由CreateDevice函数创建
									PLONG lCNTSts,			// 1:忙 0:空闲
									ULONG ulChannel);		// 通道号[0~7]

	BOOL DEVAPI WINAPI PXI5630_CTR_ReadCounter(		// 从任务中读取数据
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									U32 nChannel,			// 通道号(本设备有2个通道,取值范围[0,1])
									U32 nCountValArray[],	// 数据数组,用于返回计数数据
									U32 nSizePoints,		// 请求读取的点数(单位:点)
									U32* pSampsRead,		// 返回实际读取的点数(单位:点)
									U32* pAvailSamps,		// 任务中还存在的可读点数, =NULL,表示无须返回
									F64 fTimeout);			// 超时时间,单位:秒(S)

	BOOL DEVAPI WINAPI PXI5630_CTR_StopTask(			// 停止(或暂停)采集任务
									HANDLE hDevice,		// 设备对象句柄,它由DEV_Create()函数创建
									U32 nChannel);		// 通道号(本设备有2个通道,取值范围[0,1])

	BOOL DEVAPI WINAPI PXI5630_CTR_ReleaseTask(			// 释放采集任务
									HANDLE hDevice,		// 设备对象句柄,它由DEV_Create()函数创建
									U32 nChannel);		// 通道号(本设备有2个通道,取值范围[0,1])

	BOOL DEVAPI WINAPI PXI5630_CTR_LoadParam(HANDLE hDevice, U32 nChannel, PPXI5630_CTR_PARAM pCTRParam); // 从PXI5630.ini中加载CTR参数
	BOOL DEVAPI WINAPI PXI5630_CTR_SaveParam(HANDLE hDevice, U32 nChannel, PPXI5630_CTR_PARAM pCTRParam); // 保存CTR参数至PXI5630.ini
	BOOL DEVAPI WINAPI PXI5630_CTR_ResetParam(HANDLE hDevice, U32 nChannel, PPXI5630_CTR_PARAM pCTRParam); // 将当前CTR参数复位至出厂值

	// ################################ IO端口控制函数 ################################
	// 创建设备时Port0各线的方向和值不做修改，Port1~Port3会回读端口下各线功能,如果是PFI/PXI会强制置为开关量输入(DI),如果为DIO,方向和值不做修改
	// AI AO CTR工作后所使用的PFI不可做为DIO,释放AI AO CTR时,将功能置为DI
	BOOL DEVAPI WINAPI PXI5630_Port_Config(HANDLE hDevice, U32 nPort, PPXI5630_PORT_PARAM pPortParam);		// IO端口配置函数 nPort[0~3],只有在线功能为DIO修改才会起作用
	BOOL DEVAPI WINAPI PXI5630_Port_GetConfig(HANDLE hDevice, U32 nPort, PPXI5630_PORT_PARAM pPortParam);	// 获取IO端口配置函数 nPort[0~3]

	BOOL DEVAPI WINAPI PXI5630_Port_GetFuns(			// 获取各线功能
									HANDLE hDevice,		// 设备对象句柄,它由DEV_Create()函数创建
									U32 bFuncArray[32]);// 功能缓冲区, 0表示为DIO,1表示为PFI或PXI

	BOOL DEVAPI WINAPI PXI5630_Port_LoadParam(HANDLE hDevice, U32 nPort, PPXI5630_PORT_PARAM pPortParam); // 从PXI5630.ini中加载Port参数
	BOOL DEVAPI WINAPI PXI5630_Port_SaveParam(HANDLE hDevice, U32 nPort, PPXI5630_PORT_PARAM pPortParam); // 保存Port参数至PXI5630.ini
	BOOL DEVAPI WINAPI PXI5630_Port_ResetParam(HANDLE hDevice, U32 nPort, PPXI5630_PORT_PARAM pPortParam); // 将当前Port参数复位至出厂值
	// ############################ DIO数字量输入输出实现函数,需先进行端口配置 ############################
	BOOL DEVAPI WINAPI PXI5630_P0_DI_InitTask(				// 初始化Port0采集任务(Initialize Task)
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									PPXI5630_P0_DI_PARAM pP0DIParam); // Port0工作参数, 它仅在此函数中决定硬件初始状态和各工作模式
	BOOL DEVAPI WINAPI PXI5630_P0_DI_StartTask(HANDLE hDevice);		// 开始Port0采集任务
	BOOL DEVAPI WINAPI PXI5630_P0_DI_ReadArray(		// 从任务中读取Port0端口数据
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									U8 nValArray[],	// 数据数组,用于返回DI值
									U32 nSizePoints,		// 请求读取的点数(单位:点)
									U32* pSampsRead,		// 返回实际读取的点数(单位:点)
									U32* pAvailSamps,		// 任务中还存在的可读点数, =NULL,表示无须返回
									F64 fTimeout);			// 超时时间,单位:秒(S)
	BOOL DEVAPI WINAPI PXI5630_P0_DI_StopTask(HANDLE hDevice);	// 停止采集任务
	BOOL DEVAPI WINAPI PXI5630_P0_DI_ReleaseTask(HANDLE hDevice); // 释放采集任务

	BOOL DEVAPI WINAPI PXI5630_P0_DO_InitTask(				// 初始化Port0生成任务(Initialize Task)
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									PPXI5630_P0_DO_PARAM pP0DOParam); // Port0工作参数, 它仅在此函数中决定硬件初始状态和各工作模式

	BOOL DEVAPI WINAPI PXI5630_P0_DO_Reset(					// 复位P0_DO相关配置以启动新任务
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									I32* pSBWPerChan);		// 复位后启动之前为防止DO溢出强烈建议根据需要写入一些数据(数据量小于1M)

	BOOL DEVAPI WINAPI PXI5630_P0_DO_StartTask(HANDLE hDevice);	// 开始Port0生成任务
	BOOL DEVAPI WINAPI PXI5630_P0_DO_WriteBinary(				// 向生成任务中写入DO输出的二进制原码数据(Write binary data to the task)
									HANDLE hDevice,			// 设备对象句柄,它由DEV_Create()函数创建
									U8 nBinArray[],			// 原码缓冲区,用于输出的DO数据,取值区间为[0, 255]
									U32 nWritePoints,		// 写入的点数(单位:点)
									U32* pRetWritten,		// 返回实际写入的点数(单位:点), =NULL,表示无须返回
									U32* pAvailPoints,		// 返回当前可写入的点数, =NULL,表示无须返回
									F64 fTimeout);			// 超时时间,单位:秒(S)
	BOOL DEVAPI WINAPI PXI5630_P0_DO_GetStatus(HANDLE hDevice, PPXI5630_P0_DO_STATUS pDOStatus);   // 取得AO各种状态
	BOOL DEVAPI WINAPI PXI5630_P0_DO_StopTask(HANDLE hDevice);		// 停止采集任务
	BOOL DEVAPI WINAPI PXI5630_P0_DO_ReleaseTask(HANDLE hDevice);	// 释放采集任务

	BOOL DEVAPI WINAPI PXI5630_DIO_ReadPort(			// 读数字量端口值(Read Port Data from DI Port)
									HANDLE hDevice,		// 设备对象句柄,它由DEV_Create()函数创建
									U32 nPort,			// 端口号, 取值范围为[0,3] 
									U32* pPortData);	// 返回的端口数据, 有效位Bit[7:0], 读Port0时为DI输入,读Port1时为DO回读

	BOOL DEVAPI WINAPI PXI5630_DIO_WritePort(			// 写数字量端口值(Write Port Data to DO Port)
									HANDLE hDevice,		// 设备对象句柄,它由DEV_Create()函数创建
									U32 nPort,			// 端口号, 取值范围为[0,3] 
									U32 nPortData);		// 端口数据, 有效位Bit[7:0]

	BOOL DEVAPI WINAPI PXI5630_DIO_ReadLines(			// 读数字量端口多线值(Read Mult Lines Data from the DI Port)
									HANDLE hDevice,		// 设备对象句柄,它由DEV_Create()函数创建
									U32 nPort,			// 端口号, 取值范围为[0,3] 
									U32 bLineDataArray[8]);// 线数据缓冲区, 同时返回端口中各线的状态值bLineDataArray[n]=0:表示关(或低)状态, =1表示开(或高)状态

	BOOL DEVAPI WINAPI PXI5630_DIO_WriteLines(			// 写数字量端口值(Write Mult Lines Data to the Digital Port)
									HANDLE hDevice,		// 设备对象句柄,它由DEV_Create()函数创建
									U32 nPort,			// 端口号, 取值范围为[0,3] 
									U32 bLineDataArray[8]); // 线数据缓冲区, 端口中各线的状态值bLineDataArray[n]=0:表示关(或低)状态, =1表示开(或高)状态

	BOOL DEVAPI WINAPI PXI5630_DIO_ReadLine(			// 读线值(Readback Single Line Data from the DI Port)
									HANDLE hDevice,		// 设备对象句柄,它由DEV_Create()函数创建
									U32 nPort,			// 端口号, 取值范围为[0,3] 
									U32 nLine,			// 线号[0, 7]
									U32* pLineData);	// 线数据, 取值0或1 

	BOOL DEVAPI WINAPI PXI5630_DIO_WriteLine(			// 写线值(Write Single Line Data to DO Port)
									HANDLE hDevice,		// 设备对象句柄,它由DEV_Create()函数创建
									U32 nPort,			// 端口号, 取值范围为[0,3] Port0为单向输入,Port1为单向输出,仅能写Port1
									U32 nLine,			// 线号[0, 7]
									U32 bLineData);		// 线值,取值0或1

	//################# 内存映射寄存器直接操作及读写函数 ########################
	// 适用于用户对本设备更直接、更特殊、更低层、更复杂的控制;比如根据特殊的
	// 控制对象需要特殊的控制流程和控制效率时,则用户可以使用这些接口予以实现
	BOOL DEVAPI WINAPI PXI5630_GetDeviceBar(			// 取得指定的指定设备寄存器组BAR地址
									HANDLE hDevice,			// 设备对象句柄,它由CreateDevice函数创建
									__int64 pbPCIBar[6]);	// 返回PCI BAR所有地址,具体PCI BAR中有多少可用地址请看硬件说明书

    BOOL DEVAPI WINAPI PXI5630_WriteRegisterByte(		// 往指定寄存器空间位置写入单节字数据
									HANDLE hDevice,			// 设备对象句柄,它由CreateDevice函数创建
									__int64 pbLinearAddr,		// 指定寄存器的线性基地址,它等于GetDeviceAddr中的pbLinearAddr参数返回值
									ULONG OffsetBytes,		// 相对于线性基地址基地址的偏移位置(字节)
									BYTE Value);			// 往指定地址写入单字节数据（其地址由线性基地址和偏移位置决定）

	BOOL DEVAPI WINAPI PXI5630_WriteRegisterWord(		// 写双字节数据（其余同上）
									HANDLE hDevice, 
									__int64 pbLinearAddr, 
									ULONG OffsetBytes,  
									WORD Value);

	BOOL DEVAPI WINAPI PXI5630_WriteRegisterULong(		// 写四节字数据（其余同上）
									HANDLE hDevice, 
									__int64 pbLinearAddr, 
									ULONG OffsetBytes,
									ULONG Value);

	BYTE DEVAPI WINAPI PXI5630_ReadRegisterByte(		// 读入单字节数据（其余同上）
									HANDLE hDevice, 
									__int64 pbLinearAddr, 
									ULONG OffsetBytes);

	WORD DEVAPI WINAPI PXI5630_ReadRegisterWord(		// 读入双字节数据（其余同上）
									HANDLE hDevice, 
									__int64 pbLinearAddr, 
									ULONG OffsetBytes);

	ULONG DEVAPI WINAPI PXI5630_ReadRegisterULong(		// 读入四字节数据（其余同上）
									HANDLE hDevice, 
									__int64 pbLinearAddr, 
									ULONG OffsetBytes);

	//################# I/O端口直接操作及读写函数 ########################
	// 适用于用户对本设备更直接、更特殊、更低层、更复杂的控制;比如根据特殊的
	// 控制对象需要特殊的控制流程和控制效率时,则用户可以使用这些接口予以实现
	// 但这些函数主要适用于传统设备,如ISA总线、并口、串口等设备,不能用于本PCI设备
    BOOL DEVAPI WINAPI PXI5630_WritePortByte(			// 8位写端口
									HANDLE hDevice,			// 设备句柄(由CreateDevice创建)
									__int64 pPort,				// 端口地址
									BYTE Value);			// 写出的8位整型数据

    BOOL DEVAPI WINAPI PXI5630_WritePortWord(HANDLE hDevice, __int64 pPort, WORD Value);
    BOOL DEVAPI WINAPI PXI5630_WritePortULong(HANDLE hDevice, __int64 pPort, ULONG Value);

    BYTE DEVAPI WINAPI PXI5630_ReadPortByte(HANDLE hDevice, __int64 pPort);
    WORD DEVAPI WINAPI PXI5630_ReadPortWord(HANDLE hDevice, __int64 pPort);
    ULONG DEVAPI WINAPI PXI5630_ReadPortULong(HANDLE hDevice, __int64 pPort);
	// 如果您要在用户模式下,直接访问硬件端口,请安装并使用ISA\CommUser下的驱动ReadPortByteEx等函数

	//########################### 附加操作函数 ######################################
	HANDLE DEVAPI WINAPI PXI5630_CreateSystemEvent(void); // 创建内核事件对象,供InitDeviceDmaAD和VB子线程等函数使用
	BOOL DEVAPI WINAPI PXI5630_ReleaseSystemEvent(HANDLE hEvent); // 释放内核事件对象

#ifdef __cplusplus
}
#endif


// 自动包含驱动函数导入库
#ifndef _PXI5630_DRIVER_
	#ifndef _WIN64
		#pragma comment(lib, "PXI5630_32.lib")
		#pragma message("======== Welcome to use our art company's products!")
		#pragma message("======== Automatically linking with PXI5630_32.dll...")
		#pragma message("======== Successfully linked with PXI5630_32.dll")
	#else
		#pragma comment(lib, "PXI5630_64.lib")
		#pragma message("======== Welcome to use our art company's products!")
		#pragma message("======== Automatically linking with PXI5630_64.dll...")
		#pragma message("======== Successfully linked with PXI5630_64.dll")
	#endif
#endif

#endif // _PXI5630_DEVICE_