///******************************************************************
//
// Moudle Name  :   mtn_lib20_ext.h
// Abstract     :   GaoChuan Motion 2.0 external user header 
// Note :			1.结构体定义中所有的‘reservedxxx’的成员都是保留参数,为保持兼容性,请设置为0
//					2.无特别说明,所有API返回RTN_CMD_SUCCESS（即0值）表示执行成功,其他则表示错误代码
//					3.所有的API参数中,无特别说明,axisHandle表示操作轴的句柄,devHandle表示目标控制器的句柄,crdHandle表示目标坐标系组句柄
// Modification History :
///******************************************************************
#ifndef _H_MTN_LIB20_EXT_H_
#define _H_MTN_LIB20_EXT_H_
#include "mtn_lib20.h"

#ifdef __cplusplus
extern "C" {
#endif

//------------------------------------------------------------------------------------------------------------
//
//           指令分组索引
//
//------------------------------------------------------------------------------------------------------------
//	1.设备高级配置等
//	2.单轴配置读取
//	3.单轴高级指令
//	4.缓冲区高级指令
//	5.硬件捕获及不常用指令
//	6.平台相关指令
//	7.数据采集模块(高级指令)
//	8.激光
//	9.龙门
//  10.通讯扩展等其他
//  11.手轮
//  12.PT
//  13.线性距离位置比较
//  14.二维位置点比较
//  15.多维位置比较输出
//  16.坐标系输出转换
//  17.结构体初始化函数及常见习惯指令
//  18.闭环
//  19.点胶
//  20.模拟量控制

///////////////////////////////////////////////////////////////////指令
//------------------------------------------------------------------------------------------------------------
//
//	1.设备高级配置等
//
//------------------------------------------------------------------------------------------------------------

// 设置通讯参数
// devHandle : 设备句柄
// waitTimeInUs：等待时间,微秒
// retryTimes： 通讯重试次数
MTN_API short __stdcall NMC_SetCommPara( HAND devHandle, UInt32  waitTimeInUs, UInt32  retryTimes );

// 板卡打开（根据名称）
// idStr: 板卡ID字符串, 可通过指令写入。pDevHandle: 返回设备操作句柄
// 注：ID号用户可写入,掉电不丢失,可用于区分板卡。出厂板卡号ID号为0
MTN_API short __stdcall NMC_DevOpenByID   ( char *idStr, PHAND pDevHandle );

// 修改板卡ID号
// pIdStr: 要写入的板卡ID字符串,最长16字节,以\0结尾
// 注：修改ID号完成后,板卡要掉电重启,新的ID才有效。
MTN_API short __stdcall NMC_DevWriteID   ( HAND devHandle, char *pIdStr );

// 读取板卡ID号
// pIdStr: 存储字符串的数组,数组长度大于16字节
MTN_API short __stdcall NMC_DevReadID(HAND devHandle, char *pIdStr );

// 读取库的版本
// pVersion：接收版本信息
// example(c):
//          char dllVersion[128];
//          NMC_GetDllVersion(dllVersion);
MTN_API short  __stdcall NMC_GetDllVersion(char *pVersion);

// 当前运动控制器固件的版本等信息
typedef struct
{
	char strVer[16];
	char strOemVer[16];
	char strBuild[32];
}TMtLibVersion;
// 读取当前运动控制器固件的版本等信息
// devHandle : 设备句柄
// pVersion：版本信息
MTN_API short __stdcall NMC_GetMtLibVersion ( HAND devHandle, TMtLibVersion *pVersion );

typedef struct
{
	char strVer[16];           // 控制器版本号
	char strOemVer[16];        // OEM版本号(定制控制器才有),默认为0
	short time[6];          // 时间,年月日,时分秒
	short axisNum;          // 支持的轴数
	short encNum;           // 支持的编码器数
	short diNum;            // 数字输入数量
	short doNum;            // 数字输出数量
	short daNum;            // 模拟量通道
	short adNum;            // 模拟量输入通道
	short shioNum;          // 同步高速IO通道
    short reserved;         // 保留
	char ipv4[4];           // IP地址
	char idStr[16];         // 板卡名称,多卡时可用名称打开参考NMC_DevOpenByID
    UInt32  uid[4];   // 唯一序列号
}TCardInfo;
// 读取当前运动控制器信息
MTN_API short __stdcall NMC_GetCardInfo ( HAND devHandle, TCardInfo *pInfo );

// 启动指令调试
// enable:0关闭调试信息,默认关闭
// debugOutputFile:调试输出文件
MTN_API short  __stdcall NMC_SetCmdDebug( short enable,char *debugOutputFile);

// 加载配置文件
MTN_API short __stdcall NMC_LoadConfigFromFile(HAND devHandle, char *pFilePath);

// 保存为配置文件
MTN_API short __stdcall NMC_SaveConfigToFile(HAND devHandle, char *pFilePath);

// 保存基本的配置信息,将这些信息保存到系统参数区,控制器重启或者NMC_DevReset后,系统将使用这些参数
// 保存的参数包括报警、限位、脉冲方式、编码器方式、安全参数、滤波参数
// enable:1表示保存当前配置,并使能自动加载参数功能,0：表示关闭自动加载参数功能
MTN_API short __stdcall NMC_SaveMotionConfig(HAND devHandle,short enable);


//------------------------------------------------------------------------------------------------------------
//
//	2.单轴配置读写
//
//------------------------------------------------------------------------------------------------------------
// 设置限位开关输入是否停止运动
// posEn：正向限位触发允许设置,1为允许,0为禁止
// negEn: 负向限位触发允许设置
MTN_API short  __stdcall NMC_MtLmtOnOff    ( HAND axisHandle, short posSwt, short negSwt );

// 设置限位开关触发电平
// posSwt：正向限位触发电平设置,1为高电平触发,0为低电平触发
// negSwt: 负向限位触发电平设置
MTN_API short  __stdcall NMC_MtLmtSns      ( HAND axisHandle, short posSwt, short negSwt );

// 设置原点开关触发电平，注意：这里的电平设置不会影响捕获的电平
// sns：原点电平设置,1为高电平触发,0为低电平触发
MTN_API short  __stdcall NMC_MtHomeSns( HAND axisHandle, short sns);

// 读取原点开关触发电平
// pSns：当前的原点电平设置,1为高电平触发,0为低电平触发
MTN_API short  __stdcall NMC_MtGetHomeSns( HAND axisHandle, short *pSns);

// 设置伺服报警开关是否停止运动
// swt：伺服报警开关输入允许设置,1为允许,0为禁止。（默认为高电平触发）
MTN_API short  __stdcall NMC_MtAlarmOnOff  ( HAND axisHandle, short swt );

// 设置伺服报警开关电平
// swt：伺服报警触发电平设置,1为高电平触发,0为低电平触发
MTN_API short  __stdcall NMC_MtAlarmSns    ( HAND axisHandle, short swt );

// 获取轴规划模式
// pMode：返回轴运动模式
MTN_API short __stdcall NMC_MtGetPrfMode(HAND axisHandle,short *pMode);

// 获取Ptp参数
// pAxPara：参数
MTN_API short __stdcall NMC_MtGetPtpPara( HAND axisHandle, TPtpPara *pAxPara );

// 获取Jog参数
// pAxPara：参数
MTN_API short __stdcall NMC_MtGetJogPara   ( HAND axisHandle, TJogPara *pAxPara );

// 获取目标运动速度
// pVel: 目标速度（最大速度）,单位是 脉冲/ms
MTN_API short __stdcall NMC_MtGetVel( HAND axisHandle, double *pVel );

// 获取目标运动位置,只针对PTP
// pPos: 目标位置,单位是 脉冲
MTN_API short __stdcall NMC_MtGetPtpTgtPos( HAND axisHandle, Int32  *pPos );

// 读编码器通道位置
// devHandle : 控制器句柄
// encId: 编码器ID,取值范围[0,n]
// pPos:返回编码器数值
MTN_API short  __stdcall NMC_GetEncPos( HAND devHandle, short encId, Int32  *pPos );

// 写编码器通道位置
// devHandle : 控制器句柄
// encId: 编码器ID,对于轴编码器通道,取值范围[0,n]
//				  对于扩展编码器通道,256表示第一个扩展编码器通道,257表示第二个,以此类推
// encPos:编码器数值
MTN_API short  __stdcall NMC_SetEncPos( HAND devHandle, short encId, Int32  encPos );

// 设置允许的位置误差,当位置误差超过设定值时,电机停止运动,提示位置误差超限
// posErr为0表示不检查
MTN_API short  __stdcall NMC_MtSetPosErrLmt( HAND axisHandle, Int32  posErr );

// 读取允许的位置误差设定值
MTN_API short  __stdcall NMC_MtGetPosErrLmt( HAND axisHandle, Int32  *pPosErr );

// 读取编码器模式
// encId: 编码器ID,对于轴编码器通道,取值范围[0,n]
//				  对于扩展编码器通道,256表示第一个扩展编码器通道,257表示第二个,以此类推
// encMode:返回编码器模式,参考宏定义
MTN_API short  __stdcall NMC_GetEncMode (HAND devHandle, short encId,  short *encMode );

// 读取限位开关输入是否停止运动
// posEn：正向限位触发允许设置,1为允许,0为禁止
// negEn: 负向限位触发允许设置
MTN_API short  __stdcall NMC_MtGetLmtOnOff    ( HAND axisHandle, short *pPosSwt, short *pNegSwt );

// 读取限位开关触发电平
// posSwt：正向限位触发电平设置,1为高电平触发,0为低电平触发
// negSwt: 负向限位触发电平设置
MTN_API short  __stdcall NMC_MtGetLmtSns      ( HAND axisHandle, short *pPosSwt, short *pNegSwt );

// 读取伺服报警开关是否停止运动
// swt：伺服报警开关输入允许设置,1为允许,0为禁止。（默认为高电平触发）
MTN_API short  __stdcall NMC_MtGetAlarmOnOff  ( HAND axisHandle, short *pSwt );

// 读取伺服报警开关电平
// swt：伺服报警触发电平设置,1为高电平触发,0为低电平触发
MTN_API short  __stdcall NMC_MtGetAlarmSns    ( HAND axisHandle, short *pSwt );

// 读取软件限位是否停止运动
// enable：软件限位触发允许设置,1为允许,0为禁止
MTN_API short  __stdcall NMC_MtGetSwLmtOnOff  ( HAND axisHandle, short *pSwt );

// 读取软件限位数值
// posLmt：正向软件限位设置值
// negLmt：负向软件限位设置值。单位为脉冲数
MTN_API short  __stdcall NMC_MtGetSwLmtValue  ( HAND axisHandle, Int32  *pPosLmt,Int32  *pNegLmt );

//  读取轴安全参数
MTN_API short  __stdcall NMC_MtGetSafePara( HAND axisHandle, TSafePara *pPara );

// 读取脉冲输出模式
// pInv, 1：取反,0：不取反
// pMode 0：脉冲方向 1：正负脉冲
MTN_API short  __stdcall NMC_MtGetStepMode ( HAND axisHandle, short *pInv, short *pMode );

// 读取轴速度滤波参数
MTN_API short __stdcall NMC_MtGetAxisVelFilter(HAND axisHandle,short *pFilterCoef);

// 读取回零参数
// pHomePara: 回零参数结构,参考结构定义
MTN_API short __stdcall NMC_MtGetHomePara( HAND axisHandle, THomeSetting *pHomePara );

//------------------------------------------------------------------------------------------------------------
//
//	3.单轴高级指令
//
//------------------------------------------------------------------------------------------------------------

// 读取机械坐标的位置
// pPos : 返回位置,单位是 脉冲
MTN_API short __stdcall NMC_MtGetAxisPos   ( HAND axisHandle, Int32  *pPos );

// 读发送到执行器的位置
// pPos : 返回位置,单位是 脉冲
MTN_API short __stdcall NMC_MtGetCmdPos   ( HAND axisHandle, Int32  *pPos );

// 设定机械位置, 轴静止时执行,如果后面是update指令,需要延时一个周期
// axisPos: 设定机械位置值
// 注：只能在轴静止时使用
MTN_API short  __stdcall NMC_MtSetAxisPos( HAND axisHandle, Int32  axisPos);

// 设定编码器位置, 轴静止时执行,如果后面是update指令,需要延时一个周期
// encPos: 设定编码器位置值
// 注：只能在轴静止时使用
MTN_API short  __stdcall NMC_MtSetEncPos( HAND axisHandle, Int32  encPos);

// 设置单轴规划高级参数
// axisHandle : 轴句柄
// mapAxisNo：轴号,取值范围[0,n]
// port：端口号,取值范围[0,1],默认为0
// startPos：偏置,默认为0
// pCrdHandle：坐标系组句柄
MTN_API short __stdcall NMC_MtPrfConfig(HAND axisHandle,short mapAxisNo,short port,Int32  startPos);

// 读取单轴规划高级参数
MTN_API short __stdcall NMC_MtGetPrfConfig(HAND axisHandle,short *mapAxisNo,short *port,Int32  *startPos);

// 设置单轴比例系数
// axisHandle : 轴句柄
// inCoe：单轴比例系数,取值范围(0,1]
MTN_API short __stdcall NMC_MtSetPrfCoe(HAND axisHandle,double inCoe);

// 读取单轴比例系数
// axisHandle : 轴句柄
// pInCoe：单轴比例系数,取值范围(0,1]
MTN_API short __stdcall NMC_MtGetPrfCoe(HAND axisHandle,double *pInCoe);

// 设置轴通道编码器的系数,默认为1
// axisHandle : 轴句柄
// encCoe：单轴通道编码器比例系数,取值范围(0,1]
MTN_API short __stdcall NMC_MtSetEncCoe(HAND axisHandle,double encCoe);

// 读取轴通道编码器的系数
// axisHandle : 轴句柄
// pEncCoe：比例系数,取值范围(0,1]
MTN_API short __stdcall NMC_MtGetEncCoe(HAND axisHandle,double *pEncCoe);

// 设置轴的到位误差参数
// axisHandle : 轴句柄
// arrivalBand: 到位误差,单位Pulse 取值大于0
// stableTime: 到位保持时间,单位 ms 取值大于0
MTN_API short __stdcall NMC_MtSetAxisArrivalPara(HAND axisHandle,Int32  arrivalBand,Int32  stableTime);


// 获取轴的到位误差参数
// axisHandle : 轴句柄
// pArrivalBand:到位误差,单位Pulse 
// pStableTime：到位保持时间,单位 ms
MTN_API short __stdcall NMC_MtGetAxisArrivalPara(HAND axisHandle,Int32  *pArrivalBand,Int32  *pStableTime);


// 设置螺距误差的补偿参数
// number:补偿段数量
// startPos:开始补偿位置
// lenPos:补偿间隔
MTN_API short __stdcall NMC_MtSetLeadScrewPara( HAND axisHandle, short number,Int32  startPos,Int32  lenPos );

// 按序号设置螺距位置补偿的值
// index：补偿段序号
// positivePos:正向补偿值
// negativePos:负向补偿值
MTN_API short __stdcall NMC_MtSetLeadScrewCompPos( HAND axisHandle, short index,Int32  positivePos,Int32  negativePos );


// 使能或禁止螺距位置补偿
// enable:1：使能,0：禁用
MTN_API short __stdcall NMC_MtEnableLeadScrew(HAND axisHandle, short enable);

// 设置单轴急停DI
// gpiIndex：通用输入序号,[0,]
// sense :触发电平,0：低电平,1：高电平
MTN_API short __stdcall NMC_MtSetEstopDI( HAND axisHandle, short gpiIndex,short sense);

// 读取单轴急停DI
// gpiIndex：通用输入序号,[0,]
// sense :触发电平,0：低电平,1：高电平
MTN_API short __stdcall NMC_MtGetEstopDI( HAND axisHandle, short *gpiIndex,short *sense);


// 捕获源
#define CAPT_EX_SRC_GPI				0   // 通用输入
#define CAPT_EX_SRC_NEGLMT          1   // 负向限位
#define CAPT_EX_SRC_POSLMT          2   // 正向限位
#define CAPT_EX_SRC_HOME			3   // 原点
#define CAPT_EX_SRC_Z				4   // Z向信号
#define CAPT_EX_SRC_PRFPOS          5   // 规划位置（当规划位置达到设定值时触发）
#define CAPT_EX_SRC_ENCPOS          6   // 编码器位置

typedef struct
{
	short capPosIndex;	// 捕获的位置源序号,0~N：轴1~N+1。（默认0）注：捕获的编码器位置根据用户设置的编码器模式决定 
	
	short trigSrc;		// 触发源,见上面的定义。（默认：CAPT_EX_SRC_GPI）
	short trigIndex;	// 触发源序号。（默认0）
	short filter;		// 滤波时间常数,单位0.1毫秒,取值范围[0,255]
    Int32   trigValue;	// 触发值,对于触发源为IO,表示信号触发的有效电平；对于触发源为位置,则表示触发捕获的位置。（默认0）
}TAdvCaptureParam;

// 设置高级捕获参数,并启动捕获
// pParam:参数
// ch：高级捕获通道号,[0~3]
MTN_API short __stdcall NMC_MtSetAdvCaptParam( HAND devHandle, TAdvCaptureParam *pParam,short ch);

// 清除高级捕获状态,并取消该通道的捕获
// ch：高级捕获通道号,[0~3]
MTN_API short __stdcall NMC_MtClrAdvCaptSts( HAND devHandle,short ch);

// 读取高级捕获状态
// captSts:捕获状态,bit0表示设置的信号前沿触发到,bit1表示信号的后沿触发到。
// pPosArray : 返回位置,在触发到时,位置为捕获到的位置值。
//				pPosArray[0]:信号前沿触发位置,pPosArray[1]:信号后沿触发位置,单位:脉冲
MTN_API short  __stdcall NMC_MtGetAdvCaptPos( HAND devHandle, short *captSts,Int32  *pPosArray ,short ch);

//------------------------------------------------------------------------------------------------------------
//
//	4.缓冲区高级指令
//
//------------------------------------------------------------------------------------------------------------

// 坐标系运动：扩展参数
typedef struct
{
	double startVel;					//起跳速度（默认0）
	double T;							//前瞻时间常数 (默认1)
	double smoothDec;					//停止减速度（默认accMax）
	double abruptDec;					//急停减速度（默认无穷大）
	short  lookAheadSwitch;				//前瞻启动开关( 默认有前瞻)
	short eventTime;					// 最小的匀速段时间,单位ms
	short reserved[2];
}TExtCrdPara;
// 设置坐标系扩展参数 
// extCrdPara:坐标系扩展参数,参考‘坐标系运动：扩展参数’TExtCrdPara结构体定义
MTN_API short __stdcall NMC_CrdSetExtPara( HAND crdHandle, TExtCrdPara *extCrdPara);

// 设置坐标系运动缓冲区是否启用,NMC_CrdConfig后默认为启用状态
// enFlag:启用,1：启动,0：不启用
// 注意：如果不想使用坐标系运动缓冲区,请在NMC_CrdConfig之后调用该指令
MTN_API short __stdcall NMC_EnableCrdSdram( HAND crdHandle, short enFlag);

// 读取坐标系扩展参数
// extCrdPara:坐标系扩展参数
MTN_API short __stdcall NMC_CrdGetExtPara( HAND crdHandle, TExtCrdPara *extCrdPara);
 
// 坐标系运动：圆弧插补配置
#define MAX_ERR_TABLE_SECTION	2
typedef struct
{
	double minSectionLen;				// 分解的最小段长,默认1脉冲,范围[1,10000]
	double maxArcDiff;					// 最大的圆弧有效性误差,单位：脉冲
		
	// 圆弧插补误差配置表
	// 注意：MTN通过限制圆弧插补速度,从而保证插补误差。r全部为0,则表示关闭这个功能
	double r[MAX_ERR_TABLE_SECTION];	// 半径
	double err[MAX_ERR_TABLE_SECTION+1];	// 半径对应的插补误差,半径 [0,r0],对应err0;半径[r0,r1],对应err1;半径[r1,+max],对应err2

}TArcSecSetting;
// 设置圆弧插补参数（高级指令）
// pSetting : 设置
MTN_API short __stdcall NMC_CrdSetArcSecPara( HAND crdHandle,  TArcSecSetting *pSetting);
                                          
// 读圆弧插补参数（高级指令）
MTN_API short __stdcall NMC_CrdGetArcSecPara( HAND crdHandle,  TArcSecSetting *pSetting);

// 坐标系运动参数
typedef struct
{
	short orgFlag;		// 是否自定义坐标系原点
	short reserved[3];		// 保留
    Int32  offset[4];		// 自定义坐标系原点偏置（基于机械原点）
	double synAccMax;	// 最大合成加速度
	double synVelMax;	// 最大合成速度
}TCrdPara;
// 设置坐标系参数(必须)
// pCrdPara:坐标系参数
MTN_API short __stdcall NMC_CrdSetPara( HAND crdHandle, TCrdPara *pCrdPara );

// 读取插补坐标系系统配置信息
// pConfig:返回坐标系配置,参考结构体定义
MTN_API short __stdcall NMC_CrdGetConfig( HAND crdHandle, TCrdConfig *pConfig );

// 获取坐标系参数
// pCrdPara:坐标系参数
MTN_API short __stdcall NMC_CrdGetPara( HAND crdHandle, TCrdPara *pCrdPara );

// 获取坐标系速度倍率
// overRide：坐标系速度倍率
MTN_API short __stdcall NMC_CrdGetOverRide( HAND crdHandle, double *pOverRide );

// 坐标系状态字位定义:内部扩展 
#define BIT_CORD_POSREC         (0x00000040)    // bit 6 , 伺服位置到达,步进模式时位置到达,伺服模式时实际位置到达误差限    
#define BIT_CORD_AUXAXIS_BUSY   (0x00000080)    // bit 7 , 坐标系运动中的关联轴启动前处于运动状态错误
#define BIT_CORD_AUXAXIS_ERR    (0x00000100)    // bit 8 , 插补辅助轴错误             
#define BIT_CORD_AXIS_ERR       (0x00000200)    // bit 9 , 插补轴存在报警错误（如限位、驱动报警）   
#define BIT_CORD_SDRAM_CALC_ERR (0x00000400)    // bit 10 , SDRAM缓冲区计算错误  
// 读取内部坐标系状态
// pStsWord：返回状态字,定义64bits(二维的long数组),便于后续扩展状态位
MTN_API short __stdcall NMC_CrdGetInnerSts     ( HAND crdHandle, Int32  *pStsWord );

// 直接修改坐标系偏移
// pOffsetArray:坐标系偏移
// cnt:数组长度
MTN_API short __stdcall NMC_CrdModifyOffset( HAND crdHandle, Int32  *pOffsetArray, short cnt);

// 缓冲区设置急停DI
// axis:轴号,取值范围[0,n)
// gpiIndex:通用输入序号
// sense:触发电平
MTN_API short  __stdcall NMC_CrdBufSetEstopDI ( HAND crdHandle,Int32  segNo,short axis,short gpiIndex,short sense);

// 缓冲区数据打包
#define BUF_LINE	0 //缓冲区直线插补
#define BUF_DO		1 //缓冲区DO输出
#define BUF_OUT		2 //缓冲区OUT输出
#define BUF_DELAY   3 //缓冲区延时
#define BUF_AXMOVE	4 //缓冲区单轴运动
#define BUF_DOEX    5 //缓冲区DO输出（根据掩码输出）
#define BUF_ARC_R   6 //平面圆弧插补：终点位置、半径、方向
#define BUF_ARC_C   7 //平面圆弧插补：终点位置、圆心、方向

typedef struct
{  
    Int32  segNo;        // 用户自定义段号
    Int32  tgPos[3];     // 目标位置
	double endVel;     // 终点速度
	double vel;        // 最大速度
	double synAcc;     // 插补加速度
	short mask;        // 参与的轴,按位表示
	short lookaheadDis;//是否使用前瞻
}TCrdBufLine;

typedef struct
{
    Int32  segNo;     // 用户自定义段号
	short group;    // Out输出类型 
	short ch;       // 通道号,取值范围[0,n]
    Int32  outValue;	// 输出
}TCrdBufOut;

typedef struct
{
    Int32  segNo;     // 用户自定义段号
	short group;    // 缓冲区输出DO组 
	short ch;       // 位序号,取值范围[0,31]
    Int32  value;     // 输出值,取值范围[0,1]
}TCrdBufDO;

typedef struct
{
    Int32  segNo;     // 用户自定义段号
    Int32  scale;     // 延时单位,0表示单位为毫秒,1表示单位为秒
    Int32  count;     // 延时时长
}TCrdBufDelay;

typedef struct
{
    Int32  segNo;     // 用户自定义段号
    Int32  group;    // 缓冲区输出DO组
    Int32  doMask;    // 输出操作位,bit位为1表示要输出
    Int32  value;     // 输出值,bit位指示输出值
}TCrdBufDOEx;

typedef struct
{
    Int32  segNo;         // 用户自定义段号
	short axis;		    // 单轴移动的轴号 [0,n],非坐标系内轴	
	short soomthCoef;   // smoothCoef:平滑系数
	short blockEn;      // 是否为阻塞模式 0 不阻塞 ,1 阻塞
	short synEn;        // 是否为同步模式 0 异步 ,1 同步
	double vel;         // 运动速度
	double acc;         // 运动加速度
    Int32   tgPos;	    // 目标位置
}TCrdBufAxMove;

typedef struct
{
    Int32  segNo;         // 用户自定义段号
    Int32  tgPos[2];		// 目标位置
	short circleDir;    // 是否为同步模式 0 异步 ,1 同步
	short lookaheadDis;	// 是否使用前瞻
	short panelIndex;	// 圆弧插补平面：0：XY平面，1：YZ平面，其他：ZX平面
	double radius;		// 半径
	double endVel;      // 终点速度
	double vel;         // 运动速度
	double acc;         // 运动加速度
}TCrdBufArcR;

typedef struct
{
    Int32  segNo;         // 用户自定义段号
    Int32  tgPos[2];		// 目标位置
    Int32  centerPos[2];	// 目标位置
	short circleDir;    // 是否为同步模式 0 异步 ,1 同步
	short lookaheadDis;	// 是否使用前瞻
	short panelIndex;	// 圆弧插补平面：0：XY平面，1：YZ平面，其他：ZX平面
	double endVel;      // 终点速度
	double vel;         // 运动速度
	double acc;         // 运动加速度
}TCrdBufArcC;

// 打包插补数据
// pBufData 插补数据结构存储数组
// dataLen 数据长度
MTN_API short __stdcall NMC_CrdBufDataPack(HAND crdHandle,  unsigned char *pBufData, short dataLen);

//功能：缓冲区探位置停止并后续加位置偏置
// useCaptPos：是否使用捕获位置  1使用,0不使用
// axis:轴序号
// sense:触发电平,0：低电平,1：高电平
// gpiIndex:通用输入序号
MTN_API short  __stdcall NMC_CrdBufSetStopOffset ( HAND crdHandle, Int32  segNo,
	short axis,short gpiIndex,short sense,short useCaptPos);

//功能：解除缓冲区探位置停止并后续加位置偏置
MTN_API short  __stdcall NMC_CrdBufClrStopOffset ( HAND crdHandle, Int32  segNo,short axis);

// 设置是否计算所有线段长度
MTN_API short __stdcall NMC_CrdSetBufLengthFlag(HAND crdHandle, short flag);

// 读取插补线段长度
MTN_API short __stdcall NMC_CrdGetBufLength(HAND crdHandle, double *pLen);

MTN_API short  __stdcall NMC_CrdSetIsShortLine(HAND crdHandle,short isShortLine);

MTN_API short  __stdcall NMC_CrdSetLookAheadCentriAcc(HAND crdHandle,short isUsingSetAcc,double centriAcc);

//------------------------------------------------------------------------------------------------------------
//
//	5.硬件捕获及不常用指令
//
//------------------------------------------------------------------------------------------------------------

// 编码器硬件捕获模式选择 
#define CAPT_MODE_Z          0   // 编码器Z相捕获 
#define CAPT_MODE_IO         1   // IO 捕获 
#define CAPT_MODE_Z_AND_IO   2   // IO+Z相 捕获 
#define CAPT_MODE_Z_AFT_IO   3   // 先IO触发再Z相触发 捕获 

// 编码器硬件捕获IO源选择 
#define CAPT_IO_SRC_HOME    0   // 原点输入作为捕获IO 
#define CAPT_IO_SRC_LMTN    1   // 负向限位输入作为捕获IO 
#define CAPT_IO_SRC_LMTP    2   // 正向限位输入作为捕获IO 
#define CAPT_IO_SRC_DI0     3   // 通用数字输入0作为捕获IO 
#define CAPT_IO_SRC_DI1     4   // 通用数字输入1作为捕获IO 
#define CAPT_IO_SRC_DI2     5   // 通用数字输入2作为捕获IO 
#define CAPT_IO_SRC_DI3     6   // 通用数字输入3作为捕获IO 
#define CAPT_IO_SRC_DI4     7   // 通用数字输入4作为捕获IO 
#define CAPT_IO_SRC_DI5     8   // 通用数字输入5作为捕获IO 
#define CAPT_IO_SRC_DI6     9   // 通用数字输入6作为捕获IO 
#define CAPT_IO_SRC_DI7     10  // 通用数字输入7作为捕获IO 
#define CAPT_IO_SRC_DI8     11  // 通用数字输入8作为捕获IO 
#define CAPT_IO_SRC_DI9     12  // 通用数字输入9作为捕获IO 
#define CAPT_IO_SRC_DI10    13  // 通用数字输入10作为捕获IO 
#define CAPT_IO_SRC_DI11    14  // 通用数字输入11作为捕获IO 
#define CAPT_IO_SRC_DI12    15  // 通用数字输入12作为捕获IO 
// 设置捕获有效电平
// mode : 模式选择,参考宏定义
// ioSrc：IO输入源选择,参考宏定义
// level: 触发沿。bit0:index电平（0为下降沿,1为上升沿）,bit1:IO电平
MTN_API short  __stdcall NMC_MtSetCaptSns( HAND axisHandle, short mode, short ioSrc, short level );

// 读取捕获有效电平
// mode : 模式选择,参考宏定义
// ioSrc：IO输入源选择,参考宏定义
// level: 触发沿。0为下降沿,1为上升沿
MTN_API short  __stdcall NMC_MtGetCaptSns( HAND axisHandle, short *pMode, short *pIoSrc, short *pLevel );

// 设置启动捕获
// 注：捕获触发标志在轴状态字里。
MTN_API short  __stdcall NMC_MtSetCapt( HAND axisHandle );

// 清除轴的捕获状态
MTN_API short __stdcall NMC_MtClrCaptSts   ( HAND axisHandle);

// 读捕获位置
// pPos : 返回位置,单位:脉冲
MTN_API short  __stdcall NMC_MtGetCaptPos( HAND axisHandle, Int32  *pPos );

// 读取通用输出(按通道,支持超过32位)
// groupID:DO组,取值范围[0,n],,0: 本地DO31~DO0, 1: 本地DO63~DO32,其他指扩展IO模块
// pDoValue: 设置通用数字量输出。1, 高电平,0,低电平
MTN_API short  __stdcall NMC_GetDO( HAND devHandle, short groupID, Int32 *pDoValue);

// 设置通用输出(按通道,支持超过32位)
// groupID:DO组,取值范围[0,n],具体需要看控制器是否存在多组数字量输出
// value: 设置通用数字量输出。1, 输出高电平,0,输出低电平
MTN_API short  __stdcall NMC_SetDO( HAND devHandle, short groupID, Int32 value ) ;

// 读通用输入(按通道,支持超过32位) 
// groupID:DI组,取值范围[0,n],0: 本地DI31~DI0, 1: 本地DI63~DI32,其他指扩展IO模块
// pInValue: 通用数字量输入值。1, 高电平,0,低电平
MTN_API short __stdcall NMC_GetDI( HAND devHandle, short groupID, Int32 *pInValue );

// 读取脉冲输出滤波
// pCoe系数： 范围0~65535,0不滤波,数值越大滤波效果越明显。
MTN_API short  __stdcall NMC_MtGetStepFilter ( HAND axisHandle, unsigned short  *pCoe );

// 多轴同时启动
// axisHandle:任意轴
// mask：按bit对应相应轴号,bit为1表示启动,bit为0表示不启动
MTN_API short __stdcall NMC_MtUpdateMulti( HAND axisHandle,Int32  mask );

// 多轴同时停止
// axisHandle:任意轴
// mask：按bit对应相应轴号,bit为1表示启动,bit为0表示不启动
MTN_API short __stdcall NMC_MtStopMulti( HAND axisHandle,Int32  mask  );

// 按位设置通用输入信号取反
// bitIndex:取值范围[0,n],位序号,前64位为本地的通用输入,大于64为扩展Di
// revs:是否取反,1：取反,0：不取反
MTN_API short  __stdcall NMC_SetDIBitRevs ( HAND devHandle,short bitIndex,short revs);

// 按位读取通用输入信号取反
// bitIndex:取值范围[0,n],位序号,前64位为本地的通用输入,大于64为扩展Di
// pRevs:是否取反,1：取反,0：不取反
MTN_API short  __stdcall NMC_GetDIBitRevs ( HAND devHandle,short bitIndex,short *pRevs);

// 按位设置通用输出信号取反
// bitIndex:取值范围[0,n],位序号,前64位为本地的通用输出,大于64为扩展Do
// revs:是否取反,1：取反,0：不取反
MTN_API short  __stdcall NMC_SetDOBitRevs ( HAND devHandle,short bitIndex,short revs);

// 按位读取通用输出信号取反
// bitIndex:取值范围[0,n],位序号,前64位为本地的通用输出,大于64为扩展Do
// pRevs:是否取反,1：取反,0：不取反
MTN_API short  __stdcall NMC_GetDOBitRevs ( HAND devHandle,short bitIndex,short *pRevs);

// DO输出定时脉冲
// bitIndex:取值范围[0,n],位序号,前64位为本地的通用输出,大于64为扩展Do
// value:设置通用数字量输出。1, 输出高电平,0,输出低电平
// reverseTime:持续的电平,单位:毫秒
MTN_API short  __stdcall NMC_SetDOBitAutoReverse(HAND devHandle,short bitIndex,short value,short reverseTime);

// DIO映射
#define DIO_MAP_MAX_NUM		8	// 最多允许的映射关系

// 信号类型定义
#define DIO_TYPE_GPI		1	// 通用输入
#define DIO_TYPE_HOME		2	// 轴Home信号
#define DIO_TYPE_ALM		3	// 驱动器报警信号
#define DIO_TYPE_LMTN		4	// 轴负向限位信号
#define DIO_TYPE_LMTP		5	// 轴正向限位信号
#define DIO_TYPE_GPO		6	// 通用输出信号
#define DIO_TYPE_SVON		7	// 伺服使能信号
#define DIO_TYPE_SVCLR		8	// 报警清除信号


// DIo映射参数配置
typedef struct 
{
	unsigned char  enable;		// 1：启用，0：禁用
	unsigned char  pinGrp;      // 映射的信号类型
	unsigned char  pinIndex;    // 映射的信号序号
	unsigned char  outEnable;	// 输出允许       
	unsigned char  newGrp;      // 映射到的信号类型
	unsigned char  newIndex;	// 映射到的信号序号
}TDioMappingCfg;

// 增加一组映射，映射关系目前最多存在DIO_MAP_MAX_NUM组
MTN_API short  __stdcall NMC_SetDioMapping(HAND devHandle,TDioMappingCfg *pDioCfg);

// 获取所有的DIO映射数据
// pDioCfg：映射数据数组,目前为DIO_MAP_MAX_NUM组
MTN_API short  __stdcall NMC_GetAllDioMapping(HAND devHandle,TDioMappingCfg *pDioCfg);

// 清除所有的DIO映射关系
MTN_API short  __stdcall NMC_ClrAllDioMapping(HAND devHandle);


//------------------------------------------------------------------------------------------------------------
//
//	6.平台相关指令
//
//------------------------------------------------------------------------------------------------------------
// 
#define     VAR_PWM0_CTL    256		// pwm通道0打开关闭,1表示打开,0表示关闭
#define     VAR_PWM0_VALUE  257		// pwm通道0输出值
#define     VAR_PWM1_CTL    258		// pwm通道1打开关闭,1表示打开,0表示关闭
#define     VAR_PWM1_VALUE  259		// pwm通道1输出值
#define     VAR_EXT_DAC0    260		// 扩展的DAC通道0
#define     VAR_EXT_DAC1    261		// 扩展的DAC通道1
#define     VAR_OUT_OPTION	262		// PWM输出通道选项
#define     VAR_DAC0		263		// DAC通道0~7
#define     VAR_DAC1		264
#define     VAR_DAC2		265
#define     VAR_DAC3		266
#define     VAR_DAC4		267
#define     VAR_DAC5		268
#define     VAR_DAC6		269
#define     VAR_DAC7		270
#define     VAR_ADC0		271		// ADC通道0~7
#define     VAR_ADC1		272
#define     VAR_ADC2		273
#define     VAR_ADC3		274
#define     VAR_ADC4		275
#define     VAR_ADC5		276
#define     VAR_ADC6		277
#define     VAR_ADC7		278
// 设置通用可寻址变量 8字节数据类型（可涵盖常用的类似,如：char/short/long/double 等）
MTN_API short __stdcall NMC_SetVar8B( HAND devHandle, Int32  varID, Int64  value );

// 读取通用可寻址变量 8字节数据类型（可涵盖常用的类似,如：char/short/long/double 等）
MTN_API short __stdcall NMC_GetVar8B( HAND devHandle, Int32  varID, Int64  *pValue );

// 系统变量宏定义
#define SYS_VAR_SET_STAT_ENABLE		100
#define SYS_VAR_GET_CLOCK			101
#define SYS_VAR_GET_USERAPP_COUNT	107
#define SYS_VAR_GET_USERAPP_MIN		108
#define SYS_VAR_GET_USERAPP_MAX		109
#define SYS_VAR_GET_USERAPP_AVG		110
#define SYS_VAR_GET_USERAPP_CURT	111
#define SYS_VAR_GET_PRFINT_COUNT	112
#define SYS_VAR_GET_PRFINT_MIN		113
#define SYS_VAR_GET_PRFINT_MAX		114
#define SYS_VAR_GET_PRFINT_AVG		115
#define SYS_VAR_GET_PRFINT_CURT		116
#define SYS_VAR_GET_MAINLP_COUNT	117
#define SYS_VAR_GET_MAINLP_MIN		118
#define SYS_VAR_GET_MAINLP_MAX		119
#define SYS_VAR_GET_MAINLP_AVG		120
#define SYS_VAR_GET_MAINLP_CURT		121

// 设置通用可寻址系统变量 8字节数据类型（可涵盖常用的类似,如：char/short/long/double 等）
MTN_API short __stdcall NMC_SysSetVar8B( HAND devHandle, Int32  varID, Int64  value );

// 读取通用可寻址系统变量 8字节数据类型（可涵盖常用的类似,如：char/short/long/double 等）
MTN_API short __stdcall NMC_SysGetVar8B( HAND devHandle, Int32  varID, Int64  *pValue );

//向备份内存写数据(总长度约510byte)
//src: 要写入的数据
//len: 要写入的长度,单位：byte
//off: 要写入的地址(偏移量)
// 注：1)写入的数据掉电不丢失。
//     2)一次最多写1440字节。总长度约1500byte
MTN_API short __stdcall NMC_BackSramWrite(HAND devHandle,const void *src, Int32  len, Int32  off);

//从备份内存读数据
//dst: 读出的数据暂存区
//len: 要读出的长度,单位：byte,一次最多读1440字节。总长度约1500byte
//off: 读数据的地址(偏移量)
MTN_API short __stdcall NMC_BackSramRead(HAND devHandle,void *dst, Int32  len, Int32  off);

// 平台：控制器时间结构
typedef    struct
{
    short   year;           // 年,真实年份。取值范围[2000,2099]
    short   mon;            // 月,取值范围[1,12]
    short   day;            // 日,取值范围[1,31]
    short   hour;           // 时,取值范围[0,23]
    short   min;            // 分,取值范围[0,59]
    short   second;         // 秒,取值范围[0,59]
} TNMCTime;
// 读时间
// pTime ：返回时间结构,参考 TNMCTime 结构定义
// 注：时间在出厂时根据实际时间设定,用户不可通过指令修改
MTN_API short  __stdcall NMC_GetTime( HAND devHandle, TNMCTime *pTime );


// 写时间
// pTime ：时间结构,参考 TNMCTime 结构定义
// pPassword : 控制器系统密码,长度最多为16个字节
MTN_API short  __stdcall NMC_SetTime( HAND devHandle, TNMCTime *pTime,char *pPassword);

MTN_API short  __stdcall NMC_SetBackSramLock( HAND devHandle,char *pPassword);
MTN_API short  __stdcall NMC_SetBackSramUnLock( HAND devHandle,char *pPassword);



// 修改控制器系统密码,密码用于修改系统时钟等
// pPasswordOld : 控制器系统当前密码,长度最多为15个字符
// pPasswordNew : 新的控制器系统密码,长度最多为15个字符
// 注意：1.初始出厂无密码
//            2.修改密码后,请务必记住新的密码。忘记密码只能返厂复位。
//            3.密码大小写敏感
MTN_API short  __stdcall NMC_ChangePassword( HAND devHandle, char *pPasswordOld,char *pPasswordNew);

// 验证系统密码
// pPassword : 控制器系统当前密码,长度最多为15个字符
// 返回0表示验证通过,其他表示错误
MTN_API short  __stdcall NMC_VerifyPassword( HAND devHandle, char *pPassword);

// 清除系统密码及用户密码
// pData:解密数据，长度为8
MTN_API short  __stdcall NMC_ClrPassword( HAND devHandle, short *pData);

// 读设备唯一序列号
// pUID ：返回设备唯一序列号,为四个Int32的数据
// example:UInt32  devID[4];
//         NMC_GetUID(g_hDev,devID);
MTN_API short  __stdcall NMC_GetUID( HAND devHandle, UInt32  *pUID );

// 写用户参数
// add ：参数区的偏移地址(字节地址)
// len : 写入长度,单位：byte
// pWrData ：要写入的数据；
// 注：1)写入的数据掉电不丢失。
//     2)一次最多写256字节。参数区总长度为2048字节。
//     3)此指令比其它指令操作时间会长,如果出现通讯错误（返回-1）,则需要将通过NMC_SetCommPara延长指令通讯时间
MTN_API short  __stdcall NMC_UserParaWr( HAND devHandle, UInt32  add, UInt32  len, unsigned char *pWrData );

// 读用户参数
// add ：参数区的偏移地址(字节地址)
// len : 写入长度,单位：byte
// pRdData ：要读取的数据存储
// 注：一次最多读256字节。参数区总长度为2048字节。（参考函数 ： NMC_UserParaWr）
MTN_API short  __stdcall NMC_UserParaRd( HAND devHandle, UInt32  add, UInt32  len, unsigned char *pRdData );


// 掉电保存：备份数据定义
typedef struct
{
    Int32  crdSegNo;		// 坐标系运动的段号
    Int32  crdPrfPos[3];	// 坐标系运动的规划位置
    Int32  axPrfPos[8];	// 规划位置
    Int32  axisPos[8];	// 机械位置
    Int32  encPos[8];		// 编码器位置
}TBackGroup1;
// 读取当前备份的变量数值（断电自动保存）
// pBackVar : 备份的变量值,参考结构体定义
MTN_API short __stdcall NMC_GetBackedVarGroup1( HAND devHandle, TBackGroup1 *pBackVar);

// 掉电保存：备份数据定义（12轴）
typedef struct
{
    Int32  crdSegNo[2];		// 坐标系运动的段号
    Int32  crdPrfPos[2][3];	// 坐标系运动的规划位置
    Int32  axPrfPos[12];		// 规划位置
    Int32  axisPos[12];		// 机械位置
    Int32  encPos[12];		// 编码器位置
}TBackGroup2;
// 读取当前备份的变量数值（断电自动保存）
// pBackVar : 备份的变量值,参考结构体定义
MTN_API short __stdcall NMC_GetBackedVarGroup2( HAND devHandle, TBackGroup2 *pBackVar);

// 开始或者关闭变量的自动备份（断电自动保存,默认为关闭状态）
// en:是否开启,1：开启变量的自动备份,0：停止变量的自动备份
MTN_API short __stdcall NMC_SetBackedVarOnOff( HAND devHandle, short en);

// 读取当前自动备份的开启状态
// pEn:当前的开启状态
MTN_API short __stdcall NMC_GetBackedVarOnOff( HAND devHandle, short *pEn);

// paraID
#define     PARA_IP_ADDR   	100		// IP地址,四个字节分别表示四段
#define     PARA_IP_MSK    	101		// IP mask
#define     PARA_IP_GW   	102		// Gateway
#define     PARA_IP_DHCP   	103		// DHCP
#define     PARA_WRITE_EN	999		// 参数保存
// 读取系统参数（Int32  型）
// paraID :　系统参数ID,参见后面定义。pValue : 返回值
// 注：此函数可用于设置板卡上的扩展资源
MTN_API short  __stdcall NMC_DevGetPara( HAND devHandle, UInt32  paraID, Int32  *pValue );

// 设置系统参数（Int32  型）
// paraID :　系统参数ID,参见后面定义。value : 设置值
// 注：此函数可用于读取板卡上的扩展资源
// 注：IP地址等参数写成功后,需要调用NMC_DevSetPara(devHandle,PARA_WRITE_EN,1)才能使得写下去的参数保存
// 注：IP地址等参数写成功后,将在控制器重新启动后生效
MTN_API short  __stdcall NMC_DevSetPara( HAND devHandle, UInt32  paraID, Int32  value );

// 设置用户密码
// pUserName    : 指定的用户名,目前只支持"USER1"
// pPasswordOld : 该用户的当前密码,长度最多为15个字符
// pPasswordNew : 新的该用户的密码,长度最多为15个字符
// 注意：1.初始出厂无密码,一旦设置密码,则必须要登陆后,控制器某些指令才能正常工作（包括启动运动指令,设置DO输出指令）
//      2.修改密码后,请务必记住新的密码。忘记密码只能返厂复位。
//      3.密码大小写敏感
MTN_API short  __stdcall NMC_UserSetPassword( HAND devHandle, char *pUserName,char *pPasswordOld,char *pPasswordNew);

// 用户登陆
// pUserName    : 指定的用户名,目前只支持"USER1"
// pPassword    : 该用户的密码
MTN_API short  __stdcall NMC_UserLogin( HAND devHandle, char *pUserName,char *pPassword);

// 用户退出登陆
// pUserName    : 指定的用户名,目前只支持"USER1"
MTN_API short  __stdcall NMC_UserLogout( HAND devHandle, char *pUserName);

//------------------------------------------------------------------------------------------------------------
//
//	7.数据采集模块(高级指令)
//
//------------------------------------------------------------------------------------------------------------

// Collect模块：变量类型
#define COLLECT_ADDRESS_PRF_POS				(0)	// 规划位置
#define COLLECT_ADDRESS_AXIS_POS			(1)	// 机械位置
#define COLLECT_ADDRESS_ENC_POS				(2)	// 编码器位置
#define COLLECT_ADDRESS_CMD_POS				(3)	// 命令位置
#define COLLECT_ADDRESS_AXIS_VEL			(4)	// 电机速度
#define COLLECT_ADDRESS_CRD_POS				(5)	// 坐标系0位置
#define COLLECT_ADDRESS_CRD_VEL				(6)	// 坐标系0速度
#define COLLECT_ADDRESS_CRD_POS0			(5)	// 坐标系0位置
#define COLLECT_ADDRESS_CRD_VEL0			(6)// 坐标系0速度
#define COLLECT_ADDRESS_CRD_POS1			(9)// 坐标系1位置		
#define COLLECT_ADDRESS_CRD_VEL1			(10)// 坐标系1速度
#define COLLECT_ADDRESS_ENC_VEL				(7)	// 编码器速度
#define COLLECT_ADDRESS_CMD_VEL				(8)	// 命令速度
#define	COLLECT_ADDRESS_LASER_OUTPUT		(11)// 激光输出
#define COLLECT_ADDRESS_LASER_GATE			(12)// 激光gate信号状态
// 获取需要采集数据变量的地址
//  index:变量的序号(从0开始)
//  type: 变量的类型,参数‘Collect模块：变量类型’宏定义
//  pAddr: 返回的数据地址
// pDataLen: 返回的该数据长度
MTN_API short  __stdcall NMC_GetCollectDataAddr( HAND devHandle, short index,short dataType,UInt32  *pAddr, short *pDataLen);

// 采集模块：采集配置
#define COLLECT_LIST_MAX		(8) 			//每组最多采集8个数据
typedef struct
{
	short  count;								// 需要采集的变量个数
	short  interval;							// 采集的间隔时间,0表示每隔1毫米采集一次数据,1表示每隔2ms...
    UInt32   address[COLLECT_LIST_MAX];	// 变量的地址
	short  length[COLLECT_LIST_MAX];			// 每个变量的长度（单位：char）
}TCollectCfg;

// 采集模块：触发模式
#define COLLECT_MODE_NONE	0	// 无条件
#define COLLECT_MODE_G_SRC1	1	// 采集源1数值大于比较值
#define COLLECT_MODE_L_SRC1	2	// 采集源1数值小于比较值
#define COLLECT_MODE_DIFF	3	// 采集源1与采集源2两项差值大于比较值
typedef struct
{
	short  mode;								// 触发模式,
	short  source1;								// 触发源1
	short  source2;								// 触发源2
	short  startDelay;							// 触发启动的延时
	double  value;								// 触发比较值
}TCollectTrig;
// 配置采集数据通道,需要配置对应结构体参数
// pCollect:采集模块配置
// pTrig:采集模块触发方式配置
MTN_API short  __stdcall NMC_ConfigCollect( HAND devHandle, TCollectCfg *pCollect,TCollectTrig *pTrig );

// 启动或停止数据采集
// en：1启动 0停止
MTN_API short  __stdcall NMC_CollectOnOff ( HAND devHandle, short en);

// Collect模块：采集状态
#define COLLECT_BUSY						(0x0001)
#define COLLECT_OVERRIDE_DATA				(0x0002)	
#define COLLECT_PUSH_DATA_ERR				(0x0004)
// 获取采集状态:
// pSts：采集状态,按位表示各自状态,参考‘Collect模块：采集状态’宏定义
// pDataLen: 采集的数据量
MTN_API short  __stdcall NMC_GetCollectSts ( HAND devHandle, short *pSts, Int32  *pDataLen );

// 获取采数据:
// len：采集数据长度（单位：char,一次最多读1440字节）
// pData: 采集的数据（均以char为单元存储）
MTN_API short  __stdcall NMC_GetCollectData ( HAND devHandle, short len, unsigned char *pData );

// 清除采集状态
MTN_API short  __stdcall NMC_ClearCollectSts ( HAND devHandle);

//------------------------------------------------------------------------------------------------------------
//
//	8.激光
//
//------------------------------------------------------------------------------------------------------------
#define MAX_LASER_NUMS			    (2)	    // 最大激光通道

// 激光控制模式
#define LASER_DISABLE_MODE			    (0)	    // 禁用激光功能
#define BASIC_OUTPUT_MODE			    (1)		// 基本控制模式
#define TIME_ARRAY_OUTPUT_MODE			(2)    	// 波形控制模式
#define SHIO_OUTPUT_MODE				(3)     // 位置比较控制模式

//设置激光控制的模式。该模式的设定,约束相应指令的功能和操作
//mode: 激光控制模式,参考上述宏定义
MTN_API short  __stdcall NMC_LaserSetMode  (HAND devHandle, short mode, short ch );

 // 激光物理信号类型
#define LASER_NONE 			(0)			// 关闭激光输出模式
#define LASER_DA  			(1)			// DA输出
#define LASER_PWM_DUTY		(2)			// 占空比输出
#define LASER_PWM_FRQ		(3)			// 频率输出
#define LASER_PWM_FRQ_EXT	(4)			// 频率输出,脉宽固定

// 激光物理信号输出类型配置
// outputType：输出的类型
// index :输出通道序号,取值范围[0,n]
// optionVal: 当作为占空比输出时,该值为PWM的频率,单位HZ；
//            当为LASER_PWM_FRQ时,该值作为占空比值,（0~100）；
//            当为LASER_PWM_FRQ_EXT时,该值为脉宽,单位为0.5微秒,取值范围(0,~)
// ch :激光通道,取值范围[0,n]
MTN_API short  __stdcall NMC_LaserSetOutputType ( HAND devHandle,short outputType,short index,Int32  optionVal,short ch);

// 激光物理信号输出类型配置(高精度)
// outputType：输出的类型
// index :输出通道序号,取值范围[0,n]
// optionVal: 当作为占空比输出时,该值为PWM的频率,单位HZ；
//            当为LASER_PWM_FRQ时,该值作为占空比值,单位为百分比；
//            当为LASER_PWM_FRQ_EXT时,该值为脉宽,单位为微秒,取值范围(0,~)
// ch :激光通道,取值范围[0,n]
MTN_API short  __stdcall NMC_LaserSetOutputTypeEx ( HAND devHandle,short outputType,short index,double optionVal,short ch);

// 功能：设置立即输出激光的能量,
// outVal: 激光能量（设定值意义与NMC_LaserSetOutputType设置的输出类型对应）
// ch：输出通道 (需要根据不同物理信号端口数量进行设定)
MTN_API short  __stdcall NMC_LaserSetPower ( HAND devHandle,Int32  outVal,short ch);

// 功能：读取当前激光的能量 
// pVal: 激光能量值
// ch：通道号
MTN_API short  __stdcall NMC_LaserGetPower ( HAND devHandle,double *pVal,short ch);

// 功能：读取当前激光开关状态 
// pOnOffState: 激光开关状态，1：激光处于打开状态，0:激光处于关闭状态
// ch：通道号
MTN_API short  __stdcall NMC_LaserGetOnOff ( HAND devHandle,short *pOnOffState,short ch);

// 功能：设置立即输出激光的能量(高精度)
// chn：输出通道 (需要根据不同物理信号端口数量进行设定)
// outVal: 激光能量（设定值意义与NMC_LaserSetOutputTypeEx设置的输出类型对应）
MTN_API short  __stdcall NMC_LaserSetPowerEx ( HAND devHandle,double outVal,short ch);

// 功能：激光立即输出开关 
// onOffl: 0或者1表示打开或关闭激光输出
// ch：输出通道 (需要根据不同物理信号端口数量进行设定)
MTN_API short  __stdcall NMC_LaserOnOff ( HAND devHandle,short onOff,short ch);

// 设置激光参数
// onDelay:开光延时,单位us,取值范围[0,65535]
// offDelay:关光延时,单位us,取值范围[0,65535]
// minValue:最小输出值,取值范围[0,32767]
// maxValue:最大输出值,取值范围[0,32767]
// standbyPower:待机能量,为0表示取消待机能量输出功能
// ch:激光控制通道
MTN_API short  __stdcall NMC_LaserSetParam ( HAND devHandle, Int32  onDelay ,
                Int32  offDelay, Int32  minValue ,Int32  maxValue,Int32  standbyPower,short ch);

// 读取激光参数
MTN_API short  __stdcall NMC_LaserGetParam ( HAND devHandle, Int32  *pOnDelay,
            Int32  *pOffDelay, Int32  *pMinValue ,Int32  *pMaxValue,Int32  *pStandbyPower,short ch);

// 设置缓冲区激光能量跟随
// segNo:段号
// overRide:跟随倍率,为0表示取消激光能量跟随
// followType:跟随类型,0：跟随规划速度,1：跟随实际速度
// ch:激光通道号,取值范围[0,n]
MTN_API short __stdcall NMC_CrdBufLaserSetFollow(HAND crdHandle,Int32  segNo,double overRide,short followType,short ch);

// 缓冲区激光开关
// segNo:段号
// onOff:开关,0：关光,1：开光
// ch:激光控制通道
MTN_API short  __stdcall NMC_CrdBufLaserOnOff ( HAND crdHandle,Int32  segNo,short onOff,short ch);

// 缓冲区设置激光能量,激光能量跟随模式下,调用这条指令无效
// segNo:段号
// onOff:开关,0：关光,1：开光
// ch:激光控制通道
MTN_API short  __stdcall NMC_CrdBufLaserPower ( HAND crdHandle,Int32  segNo,Int32  power,short ch);

// 
#define LASER_GROUP		(12)			// 最大激光能量组数
#define LASET_POINT		(40)			// 每组最大点数

typedef struct
{
	short pwmEnable;		// 是否需要输出PWM
	short outputType;		// 开关信号输出类型：0：gate,1：GPO
	short outputCh;			// 开关信号输出通道
	short reserved;			// 保留
    Int32  pwmPeriod;			// PWM周期,单位us,不能小于时间数组的总周期
    Int32  pwmWidth;			// PWM脉宽,单位us,此参数保留,脉宽等于时间数组的总周期
}TTimeArrayPara;

// 设置时间数组输出参数
// ch : 激光通道
// pPara ： 参数
// 注：1.仅时间数组输出方式下有效
MTN_API short  __stdcall NMC_LaserSetTimeArrayPara  ( HAND devHandle,TTimeArrayPara *pPara,short ch);
	

typedef struct
{
	short time[LASET_POINT];		// 每个点之间的间隔时间
	short power[LASET_POINT];		// 各点的能量大小
	short count;					// 实际压入点数
}TLaserPower;

// 设置激光的能量,对于立即输出模式,group无效,pLaserPower为指定的单个能量信息
// group : 设置哪一组激光能量
// pLaserPower ： 设置的数据
// 注：1.即波形设置 
//     2.该接口对于SHIO模式无效
MTN_API short  __stdcall NMC_LaserSetTimeArrayPower  ( HAND devHandle,short group,TLaserPower *pLaserPower );
	
// 执行时间序列激光,只在时间序列输出模式下有效
// group : 设置哪一组激光能量
// ch:激光通道
// 注：1.启用时间数组输出后,直到最后一个点,如果最后一个点能量不为0,则维持最后一个能量输出
//    2.如果最后一个点能量为0,且没有PWM输出配合,则自动关闭激光。有PWM配合则需要调用NMC_LaserOnOff或者NMC_CrdBufLaserOnOff关闭激光
MTN_API short  __stdcall NMC_LaserTimeArrayExe  (HAND devHandle, short group,short ch );

// 缓冲区执行时间序列激光,只在时间序列输出模式下有效
// segNo:段号
// group:设置哪一组激光能量
// ch:激光控制通道
// 注：1.启用时间数组输出后,直到最后一个点,如果最后一个点能量不为0,则维持最后一个能量输出
//    2.如果最后一个点能量为0,且没有PWM输出配合,则自动关闭激光。有PWM配合则需要调用NMC_LaserOnOff或者NMC_CrdBufLaserOnOff关闭激光
MTN_API short  __stdcall NMC_CrdBufLaserTimeArrayExe ( HAND crdHandle,Int32  segNo,short group,short ch);

typedef struct
{
	short isArray; 		// 是否固定间距还是数组。0：固定间距（仅支持）,默认0
	short outMode; 		// 输出模式。默认1
						// 1：只输出gate 立即开或关,
						// 2: 根据位移输出gate。( 优先 )
						// 3: 根据位移输出gate,gate 和同部trigger 信号同步
						// 4: 根据位移输出gate,gate 和信号输入同步
	short posSrc; 		// 比较模式,外部编码器还是内部规划值。
						// 0：外部编码器（优先）,1：内部规划值。
						// 默认0。
	short axisMask; 	// 轴号,按bit 位对应。（一般两个轴）。
						// 默认 0。
	double delay; 		// 延时开关光时间( 暂不用 ),单位：s。默认 0。
	double gateTime; 	// 设置gate 打开时间,单位：s（内部最小值：1/36us ）,取值范围(0,0.0009)
						// 默认0。
    Int32  gateDistance; 	// 固定模式下的位置间隔 单位：pulse。
						// 默认0,模式2~4 下会进行有效性检查。
    Int32  reserved1;		// 保留参数,应设为0。
    Int32  reserved2; 	// 保留参数,应设为0。
    Int32  reserved3; 	// 保留参数,应设为0。
    Int32  reserved4; 	// 保留参数,应设为0。
    Int32  reserved5; 	// 保留参数,应设为0。
}TSHIOPara;

// 配置SHIO功能的参数
MTN_API short  __stdcall NMC_SHIOConfigPara  (HAND devHandle, TSHIOPara *pSHIOPara,short ch);

// 切换轴（允许和坐标系不完全一致）
MTN_API short  __stdcall NMC_SHIOChangeAxisMask( HAND devHandle, short axisMask,short ch );

// 允许GATE输出
// 注：设置后根据模式输出
MTN_API short  __stdcall NMC_SHIOGateOn ( HAND devHandle ,short ch);

// 禁止GATE输出
// 注：设置后立即禁止输出
MTN_API short  __stdcall NMC_SHIOGateOff ( HAND devHandle ,short ch);

// 设置Trigger 输出,
// triggerFreq : 设置triger 脉冲频率单位：HZ。
// triggerWidth : 设置triger 脉冲宽度,单位：s（内部最小值：1/36us ）。默认0。
// 注：设置后立即输出
MTN_API short __stdcall NMC_SHIOTriggerOn ( HAND devHandle,double freq,double width ,short ch);

// 禁止GATE输出
// 注：设置后马上输出
MTN_API short  __stdcall NMC_SHIOTriggerOff ( HAND devHandle ,short ch);

// 允许GATE输出
// 注：设置后根据模式输出
MTN_API short  __stdcall NMC_BufSHIOGateOn ( HAND crdHandle, Int32  segNo,short ch);

//禁止GATE输出
//注：缓冲区执行到该指令后立即禁止输出
MTN_API short  __stdcall NMC_BufSHIOGateOff ( HAND crdHandle, Int32  segNo,short ch);

//------------------------------------------------------------------------------------------------------------
//
//	9.龙门
//
//------------------------------------------------------------------------------------------------------------
// 设置龙门主动轴
// axisHandle: 龙门主动轴句柄
// group     : 龙门组号,取值范围[0,n]
MTN_API short __stdcall NMC_SetGantryMaster( HAND axisHandle, short group );

// 设置龙门从动轴
// axisHandle  : 龙门从动轴句柄;
// group       : 龙门组号,取值范围[0,n]
// gantryErrLmt: 龙门保护误差,取值范围(0,...)
MTN_API short __stdcall NMC_SetGantrySlave( HAND axisHandle , short group, Int32  gantryErrLmt );

// 龙门功能关闭
// group :       龙门组号,取值范围[0,n]
MTN_API short __stdcall NMC_DelGantryGroup( HAND axisHandle, short group );

//------------------------------------------------------------------------------------------------------------
//
//	10.通讯扩展等其他
//
//------------------------------------------------------------------------------------------------------------
// 通讯扩展
// 用户指令传输,只写
MTN_API short  __stdcall NMC_UserCmdWrite( HAND devHandle, unsigned char *sendBuffer, UInt32  sendLen );

// 用户指令传输,只读
MTN_API short  __stdcall NMC_UserCmdRead( HAND devHandle, unsigned char *sendBuffer, 
    UInt32  sendLen, unsigned char *recBuffer, UInt32  waitLen );

// 批量数据传输,只写
MTN_API short  __stdcall NMC_DataTransfer( HAND devHandle, unsigned char *sendBuffer, UInt32  sendLen );

// 禁止用户程序运行
MTN_API short __stdcall NMC_SysSetUserApp   ( HAND devHandle, unsigned char mode );

// 升级
MTN_API short __stdcall NMC_SysUpgrade   ( HAND devHandle );

// 升级固件
MTN_API short __stdcall NMC_SysUpgradeEx( HAND devHandle, unsigned char cmd, 
    unsigned char *sendBuffer, UInt32  sendLen, unsigned char *recBuffer, UInt32  recvedLen );

// 设置调试信息
MTN_API short __stdcall NMC_SetDebugErrorEn(  HAND devHandle, short debugErrEn );

// 读取最后一次的错误代码
// 返回值：错误代码
MTN_API short __stdcall NMC_GetLastErr(void);

// 设置指令错误返回值模式
// mode:0-标准模式,将返回详细的错误代码(默认)；1--简洁模式,只返回错误代码类别
MTN_API short __stdcall NMC_SetErrCodeMode(short mode);

// 设置指令通讯看门狗
// timeout:看门狗超时时间,单位毫秒,小于等于0代表关闭看门狗功能
// stopMode:超时停止模式,1:马上停止,0:缓冲区执行完毕后停止
// groupID:超时输出do的组号
// doValue:超时输出do状态
MTN_API short __stdcall NMC_SetWatchDog(HAND devHandle,Int32  timeout,short stopMode,short groupID,Int32  doValue);

//------------------------------------------------------------------------------------------------------------
//
//	11.手轮
//
//------------------------------------------------------------------------------------------------------------
// 退出手轮
MTN_API short __stdcall NMC_ClrHandWheel(HAND devHandle);

// 选择手轮跟随的编码器通道
// index:编码器通道编号,如果是轴通道,取值范围[0,n]
//                    如果是扩展编码器通道,则256表示第一个扩展编码器通道,257表示第二个,以此类推
MTN_API short __stdcall NMC_SetHandWheelInput(HAND devHandle,short index);

// 设置手轮跟随的倍率
// ratio:跟随倍率,取值范围(0,..]
MTN_API short __stdcall NMC_SetHandWheelRatio(HAND devHandle,double ratio);


//------------------------------------------------------------------------------------------------------------
//
//	12.PT
//
//------------------------------------------------------------------------------------------------------------
// onOff:		1：数据驻存模式   0：数据刷新模式(默认模式)
// loopCount:	循环次数 ：仅数据驻存模式下有效
MTN_API short  __stdcall NMC_MtPtSetStatic(HAND axisHandle,short onOff,Int32  loopCount);

// onOff:		1：数据驻存模式   0：数据刷新模式(默认模式)
// loopCount:	循环次数 ：仅数据驻存模式下有效
MTN_API short  __stdcall NMC_MtPtGetStatic(HAND axisHandle,short *pOnOff,Int32  *pLoopCount);

// 查询PT数据剩余空间大小
// pSpace:返回的剩余空间大小
// pUsed: 已使用的空间段数
MTN_API short  __stdcall NMC_MtPtGetSpace(HAND axisHandle,short *pSpace,short *pUsed);


// PT数据段类型
#define MT_PT_NORMAL	(0)
#define MT_PT_STOP		(1)

// 向Pt运动缓存区中压运动数据段
// count:压入的数据段数
// pPosArray:段运行距离
// pTimeArray:段运行时间
// pTypeArray:段类型,见宏定义
MTN_API short  __stdcall NMC_MtPtPush(HAND axisHandle,short count,double *pPosArray,Int32  *pTimeArray,short *pTypeArray);

// 清空PT数据
MTN_API short  __stdcall NMC_MtPtBufClr(HAND axisHandle);

// 启动Pt运动
// otherSynAxCnts： 不包括axisHandle 的其他同步启动轴数量
// pOtherSynAxArray: 其他同步启动轴的序号：0~N	
// 注：同步的轴必须属于同一个控制器
MTN_API short  __stdcall NMC_MtPtStartMtn(HAND devHandle,short otherSynAxCnts,short *pOtherSynAxArray);


//-------------------------------------------------------------------------------
// 13.线性距离位置比较
//-------------------------------------------------------------------------------

// 精确输出结构体
typedef struct
{
	short dimens;
	short compMode;
	short axMask;
	short src;
	double gateTime;
}TLinearCmpPara;


// 功能：设置精确位置比较的参数
// dimens:比较的维数 1或者2
// axisMask：选比较的轴号,按bit选择:不能超过2个bit同时为1
// src：比较源：0内部  1 编码器
// cmpMode：比较的模式：0 按输出数组位置比较,1 线性比较,按interval间距比较
// gateTime:输出的脉冲宽度
// chn：输出通道 目前只支持0
MTN_API short __stdcall NMC_LinearCompSetParam(HAND devHandle,short dimens, short axisMask,short src,short cmpMode,double gateTime,short chn);


// 获取配置参数
MTN_API short __stdcall NMC_LinearCompGetParam(HAND devHandle,TLinearCmpPara *pLinearCmpPara,short chn);


// 功能：设置精确比较位置数据
// pStartPos：起始比较位置
// pPos :比较的位置数组地址。1维比较传入1维数组,2维比较传入2维数组地址
// count：比较的位置个数
// chn：输出通道 目前只支持0
MTN_API short __stdcall NMC_LinearCompSetData(HAND devHandle,Int32  *pStartPos,Int32  *pPos,Int32  count, short chn);


// 功能：线性比较输出
// pStartPos：起始比较位置
// interval:线性比较间距（小于32767）
// count: 线性比较次数
MTN_API short __stdcall NMC_LinearCompInterval(HAND devHandle,Int32  *pStartPos,Int32  interval,Int32  count, short chn);


// 功能：精确位置比较使能
// onOff： 0 停止,1输出
// chn：输出通道 目前只支持0
MTN_API short __stdcall NMC_LinearCompOnOff(HAND devHandle,short onOff, short chn);


// 功能：比较的输出状态（目前没有比较输出的个数）
// pStatus: 0 未启动比较 1 比较输出中
// pOutCount：输出的个数
// chn：输出通道 目前只支持0
MTN_API short __stdcall NMC_LinearCompStatus(HAND devHandle,short *pStatus, short *pOutCount,short chn);



//-------------------------------------------------------------------------------
//14.二维位置点比较
//-------------------------------------------------------------------------------
#define CMP_OUTPUT_CHN_MAX	(3)

// 二维位置点比较结构体
typedef struct
{
	short outputchn[CMP_OUTPUT_CHN_MAX];		// 比较输出的通道:-1表示不输出处理
	short outputType[CMP_OUTPUT_CHN_MAX]; 		// 输出方式0：脉冲1：电平
	short chnType[CMP_OUTPUT_CHN_MAX];      	// 通道类型：0 GPO, 1  GATE通道
	short dir1No; 								// 方向1 的位置源轴号（0~11）
	short dir2No; 								// 方向2 的位置源轴号（0~11）
	short posSrc; 								// 轴位置类型 ：0规划1：编码器
	short stLevel[CMP_OUTPUT_CHN_MAX];			// 电平模式下的起始电平（0或1）
	short gateTime[CMP_OUTPUT_CHN_MAX]; 		// 脉冲方式脉冲时间:单位ms
	short errZone; 								// 进入比较点容差半径范围（pulse）
} TComp2DimensParam;


// 功能：设置2维位置比较的参数
// param: 二维比较参数
// group:组号,0 或者1
// chn:保留,设为0
MTN_API short __stdcall NMC_Comp2DimensSetParam(HAND devHandle,short group,TComp2DimensParam *param,short chn);


// 功能：获取2维位置比较的参数
// param: 二维比较参数
// group:组号,0 或者1
// chn:保留,设为0
MTN_API short __stdcall NMC_Comp2DimensGetParam(HAND devHandle,short group,TComp2DimensParam *param,short chn);


// 功能：设置二维比较数据
// pArrayPos:比较数组地址
// count:位置点数
// group:组号,0 或者1
// chn:保留,设为0
MTN_API short __stdcall NMC_Comp2DimensSetData(HAND devHandle,short group,Int32  *pArrayPos,short count,short chn);


// 功能：2维位置比较使能
// onOff： 0 停止,1输出
// group:组号,0 或者1
// chn:保留,设为0
MTN_API short __stdcall NMC_Comp2DimensOnoff(HAND devHandle,short group,short onOff,short chn);


// 功能：2维位置比较的输出状态
// pStatus: 0 未启动比较 1 比较输出中
// pOutCount：输出的个数
// group:组号,0 或者1
// chn:保留,设为0
MTN_API short __stdcall NMC_Comp2DimensStatus(HAND devHandle,short group,short *pStatus, short *pOutCount,short chn);
//-------------------------------------------------------------------------------
//15.多维位置比较输出通用接口
//-------------------------------------------------------------------------------
// X维位置点比较结构体
typedef struct
{
	short dimens; 		                    // 维度
	short axMask;                           // 使用的轴,按位
	short src; 		                        // 轴位置类型 ：0规划1：编码器

	short outCnts; 							// 输出数量
	short outType[CMP_OUTPUT_CHN_MAX]; 		// 输出方式0：脉冲1：电平
	short outChnType[CMP_OUTPUT_CHN_MAX];	// 通道类型：0 GPO, 1  GATE通道
	short outIndex[CMP_OUTPUT_CHN_MAX];     // GPO：0~63  GATE：0
	short outStLevel[CMP_OUTPUT_CHN_MAX];   // 电平模式下的起始电平（0或1）
	short outGateTime[CMP_OUTPUT_CHN_MAX]; 	// 脉冲模式下的脉冲时间:单位ms
	short errZone; 							// 进入比较点容差半径范围（pulse）
} TCompXDimensParam;

// 功能：设置X维位置比较的参数
// param: X维比较参数
// ch:组号,0~2
MTN_API short __stdcall NMC_CompXDimensSetParam(HAND devHandle,TCompXDimensParam *param,short chn);

// 功能：获取X维位置比较的参数
// param: 二维比较参数
// chn:组号
MTN_API short __stdcall NMC_CompXDimensGetParam(HAND devHandle,TCompXDimensParam *param,short chn);

// 功能：设置X维位置比较的输出模式
// outMode: 输出模式 0：同时输出模式 1： 轮循输出模式
// ch:组号,0~N
MTN_API short __stdcall NMC_CompXDimensSetCmpOutMode(HAND devHandle,short outMode ,short chn);

// 功能：设置X维比较数据
// pArrayPos:比较数组地址,注：若是1维比较,则pPosArray传入一维数组地址,若是2维比较,则pPosArray应传入2维数组地址
// outValue
// count:位置点数,注：若为2维数组比较时,每两个数据为一个点数
// ch:组号,0~N
// 注：按结构体定义的IO,同时输出
MTN_API short __stdcall NMC_CompXDimensSetData(HAND devHandle, Int32  *pPosArray, short count, short chn);

// 功能：X维位置比较使能
// onOff： 0 停止,1输出
// chn： 组号
MTN_API short __stdcall NMC_CompXDimensOnoff(HAND devHandle,short onOff, short chn);

// 功能：X维位置比较的输出状态
// pStatus: 0 未启动比较 1 比较输出中
// pOutCount：输出的个数
// chn：组号
MTN_API short __stdcall NMC_CompXDimensStatus(HAND devHandle,short *pStatus, short *pOutCount,short chn);

//-------------------------------------------------------------------------------
//16.坐标系输出转换（根据机械结构进行转换）
//-------------------------------------------------------------------------------
// 功能：使能旋转转换处理
//       用户数据是按照直角坐标描述,实际加工在一个旋转面上加工,可以用此功能
// rotAxisNo：旋转轴轴号
// angleRadEqual：旋转轴脉冲转弧度系数
// firstAxisInitPos：旋转中心,X轴的位置
// secAxisInitPos：旋转中心,Y轴的位置
MTN_API short  __stdcall NMC_CrdSetTransRotate(HAND crdHandle,short rotAxisNo,
                                double angleRadEqual,Int32  firstAxisInitPos,Int32  secAxisInitPos);

// 功能：关闭旋转转换处理
MTN_API short  __stdcall NMC_CrdDelTransRotate(HAND crdHandle);

// 功能：使能极坐标转换处理
//       用户数据是按照直角坐标描述,实际机械机构是一个旋转轴和一个进给轴
//参数：	rotAxNo：旋转轴轴号
//		transAxNo：平移轴轴号
//		rotEquiv：旋转轴当量,2PI/电机一圈脉冲数
MTN_API short  __stdcall NMC_CrdSetTransPolar(HAND crdHandle, short rotAxNo,short transAxNo, double rotEquiv);

// 功能：运行至设定的极坐标位置并且进行圈数清零处理（利用单轴PTP运行到指定位置）
//参数：	xPos:极坐标系下X方向位置
//		yPos:极坐标系下Y方向位置,比如运动到（5000,5000）的位置,则相当于旋转轴转到45度角,进给轴运动到根号2*5000的位置
//		rotVel:旋转速度
//		transVel:进给速度
MTN_API short  __stdcall NMC_CrdRunToPolarPos(HAND crdHandle,double xPos,double yPos,double rotVel,double transVel);

// 功能：运行至设定的极坐标角度位置（利用单轴PTP运行到指定位置）
//参数：	theta:旋转轴目标角度
//				vel:旋转速度
//				clrRoundFlag:是否清除圈数
MTN_API short  __stdcall NMC_CrdRunToPolarTheta(HAND crdHandle,double theta,double vel,short clrRoundFlag);

// 功能：销毁极坐标机型（只恢复直角坐标系）
MTN_API short  __stdcall  NMC_CrdDelTransPolar(HAND crdHandle);

//-------------------------------------------------------------------------------
//17.结构体初始化函数
//-------------------------------------------------------------------------------
MTN_API short  __stdcall NMC_TSafeParaStructInit(HAND devHandle,TSafePara *pPara);
MTN_API short  __stdcall NMC_TCrdConfigStructInit(HAND devHandle,TCrdConfig *pPara);
MTN_API short  __stdcall NMC_TCrdSafeParaStructInit(HAND devHandle,TCrdSafePara *pPara);
MTN_API short  __stdcall NMC_THomeSettingStructInit(HAND devHandle,THomeSetting *pPara);
MTN_API short  __stdcall NMC_TArcSecSettingStructInit(HAND devHandle,TArcSecSetting *pPara);
MTN_API short  __stdcall NMC_TCrdParaStructInit(HAND devHandle,TCrdPara *pPara);
MTN_API short  __stdcall NMC_TCollectCfgStructInit(HAND devHandle,TCollectCfg *pPara);
MTN_API short  __stdcall NMC_TCollectTrigStructInit(HAND devHandle,TCollectTrig *pPara);
MTN_API short  __stdcall NMC_TTimeArrayParaStructInit(HAND devHandle,TTimeArrayPara *pPara);
MTN_API short  __stdcall NMC_TLaserPowerStructInit(HAND devHandle,TLaserPower *pPara);
MTN_API short  __stdcall NMC_TSHIOParaStructInit(HAND devHandle,TSHIOPara *pPara);
MTN_API short  __stdcall NMC_TLinearCmpParaStructInit(HAND devHandle,TLinearCmpPara *pPara);
MTN_API short  __stdcall NMC_TComp2DimensParamStructInit(HAND devHandle,TComp2DimensParam *pPara);
MTN_API short  __stdcall NMC_TPtpParaStructInit(HAND devHandle,TPtpPara *pPara);
MTN_API short  __stdcall NMC_TJogParaStructInit(HAND devHandle,TJogPara *pPara);
MTN_API short  __stdcall NMC_TNMCTimeStructInit(HAND devHandle,TNMCTime *pPara);

// 清除轴错误状态,同时多个
MTN_API short  __stdcall NMC_MtClrErrorEx(HAND axisHandle,short count);

// 输出DO,16位
// bitsFlag,0:低16位,1：高16位
MTN_API short  __stdcall NMC_SetDOGroupEx( HAND devHandle, Int32  value, short groupID,short bitsFlag) ;

//-------------------------------------------------------------------------------
//18.闭环
//-------------------------------------------------------------------------------

// PID参数
typedef struct
{
    float kp;											// 增益系数
    float ki;											// 积分系数
    float kd;											// 微分系数
    float kvff;											// 速度前馈系数
    Int32  integralLimit;                                 // 积分饱和极限
    Int32  derivativeLimit;                               // 微分饱和极限
    short outLimit;                                     // 输出饱和极限
} TPidPara;

// Dac参数
typedef struct
{
	short inverse;			// 电压是否取反
	short bias;				// Dac零漂
	short dacLmt;			// Dac输出极限值
}TDacMotor;

// 设置单轴闭环控制的DA参数,轴与DA通道的对应
MTN_API short  __stdcall NMC_MtSetCloseLoopDac (HAND axisHandle,TDacMotor *pDacPara);

// 获取单轴闭环控制的DA参数
MTN_API short  __stdcall NMC_MtGetCloseLoopDac (HAND axisHandle,TDacMotor *pDacPara);

// 设置单轴的控制模式：默认使用对应轴的编码器作为输入反馈,对应序号的DAC作为输出
// 闭环模式下,先调用NMC_SetCloseLoopDac指令
//mode: 0 脉冲控制  1 DA闭环控制
MTN_API short  __stdcall NMC_MtSetCtrlMode(HAND axisHandle,short mode);

// 读取单轴的控制模式
MTN_API short  __stdcall NMC_MtGetCtrlMode(HAND axisHandle,short *pMode);


//设置对应组号的PID参数
MTN_API short  __stdcall NMC_MtSetPIDPara(HAND axisHandle,short index, TPidPara *pidPara);

// 获取对应组号的PID参数
MTN_API short  __stdcall NMC_MtGetPIDPara(HAND axisHandle,short index, TPidPara *pPidPara);

// 设置使用哪组PID
MTN_API short  __stdcall NMC_MtSetPIDIndex(HAND axisHandle,short index);

// 获取正使用的PID组号
MTN_API short  __stdcall NMC_MtGetPIDIndex(HAND axisHandle,short *pIndex);

//-------------------------------------------------------------------------------
//19.点胶
//-------------------------------------------------------------------------------
// 点胶输出最大组数
#define MAX_DISPENSE_GROUP	2

// 点胶输出参数
typedef struct
{
	short outType;				// 输出类型
	short outGroup;				// 输出组
	short outIndex;				// 输出序号
    Int32   minOnTime;			// 最小的开启时间，单位：微秒
	unsigned char reserved[32];	// 保留
}TDipenseParam;

// 设置点胶输出参数
MTN_API short  __stdcall NMC_DispenseSetParam(HAND devHandle,TDipenseParam *pPrm,short ch);

// 缓冲区设置点胶输出（运动一段距离后输出特定状态）
// outLength:距离，单位：脉冲
// outVal:输出电平,0:低电平，1：高电平
// ch:点胶输出组，取值范围：[0,MAX_DISPENSE_GROUP)
MTN_API short  __stdcall NMC_CrdBufDispenseOutAfterLen(HAND crdHandle,Int32  segNo,
    Int32  outLength,short outVal,short ch);

// 缓冲区设置点胶输出（缓冲区全部运动结束前提前一段距离输出特定状态）
// outLength:距离，单位：脉冲
// outVal:输出电平,0:低电平，1：高电平
// ch:点胶输出组，取值范围：[0,MAX_DISPENSE_GROUP)
MTN_API short  __stdcall NMC_CrdBufDispenseOutBeforeLen(HAND crdHandle,Int32  segNo,
    Int32  outLength,short outVal,short ch );

// 立即设置点胶输出
// outVal:输出电平,0:低电平，1：高电平
// ch:点胶输出组，取值范围：[0,MAX_DISPENSE_GROUP)
MTN_API short  __stdcall NMC_DispenseOut(HAND devHandle,short outVal,short ch);

//-------------------------------------------------------------------------------
//20.模拟量控制
//-------------------------------------------------------------------------------

// 设置DAC（模拟量输出）通道的模式
// ch:模拟量通道号,取值范围[0,n]
// mode:模拟量输出范围,0:0~5V, 1:0~10V, 2: 0~10.8V, 3:+/-5V, 4:+/-10V, 5:+/-10.8V,其他无效
MTN_API short __stdcall NMC_SetDacMode(HAND devHandle,short ch, short mode);

// 读取DAC（模拟量输出）通道的模式
// ch:模拟量通道号,取值范围[0,n]
// pMode:返回的模拟量输出范围设定值
MTN_API short __stdcall NMC_GetDacMode(HAND devHandle,short ch,short *pMode);

// 设置Adc参数
// ch:模拟量通道号,0~7表示轴通道上的AD，256：表示扩展AD
// mode:模拟量范围,0:0~5V, 1:0~10V, 2: 0~10.8V, 3:+/-5V, 4:+/-10V, 5:+/-10.8V
// filterCoe:滤波系数，取值范围[0,16],0表示取消Adc滤波，单位:ms
MTN_API short __stdcall NMC_SetAdcMode(HAND devHandle,short ch,short range,short filterCoe);

// 读取Adc参数
// ch:模拟量通道号,0~7表示轴通道上的AD，256：表示扩展AD
// pMode:模拟量范围
// pFilterCoe:滤波系数
MTN_API short __stdcall NMC_GetAdcMode(HAND devHandle,short ch,short *pRange,short *pFilterCoe);

// 设置DAC（模拟量输出）输出值
// ch:模拟量通道号,取值范围[0,n]
// dacValue:模拟量输出值,取值范围[-32768,32767],对应DAC输出范围
MTN_API short __stdcall NMC_SetDac(HAND devHandle,short ch,short dacValue);

// 读取DAC（模拟量输出）输出值
// ch:模拟量通道号,取值范围[0,n]
// pDacValue:返回模拟量输出值,取值范围[-32768,32767],对应DAC输出范围
MTN_API short __stdcall NMC_GetDac(HAND devHandle,short ch,short *pDacValue);

// 读取ADC（模拟量输入）值
// ch:模拟量通道号,取值范围[0,n]
// pAdcValue:返回模拟量输入值
MTN_API short __stdcall NMC_GetAdc(HAND devHandle,short ch,short *pAdcValue);

#ifdef __cplusplus
}
#endif

#endif	// _H_MTN_LIB20_EXT_H_
