/*******************************************************************************************************
**--------------文件信息--------------------------------------------------------------------------------
**文件名: dll.h
**创建人: 
**时间: 
**描述: 动态链接库头文件

**------------修订历史记录----------------------------------------------------------------------------
** 修改人: 
** 版  本: 
** 日　期: 
** 描　述: 
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#pragma once
#ifndef _HDMC_DLL_H
#define _HDMC_DLL_H

#pragma once
typedef unsigned long       DWORD;
typedef int                 BOOL;
typedef unsigned char       BYTE;
typedef unsigned short      WORD;
typedef float               FLOAT;

typedef unsigned char  uint8;                   /* defined for unsigned 8-bits integer variable 	无符号8位整型变量  */
typedef signed   char  int8;                    /* defined for signed 8-bits integer variable		有符号8位整型变量  */
typedef unsigned short uint16;                  /* defined for unsigned 16-bits integer variable 	无符号16位整型变量 */
typedef signed   short int16;                   /* defined for signed 16-bits integer variable 		有符号16位整型变量 */
typedef unsigned int   uint32;                  /* defined for unsigned 32-bits integer variable 	无符号32位整型变量 */
typedef signed   int   int32;                   /* defined for signed 32-bits integer variable 		有符号32位整型变量 */
typedef unsigned long long   uint64;    
typedef signed   long long   int64; 
typedef unsigned char       byte;

#define __MC_EXPORTS
//定义输入和输出
#ifdef __MC_EXPORTS
#define MC_API __declspec(dllexport)
#else
#define MC_API __declspec(dllimport)
#endif
//控制器通讯接口
typedef enum 
{
	CONNECTION_ETH = 1,//网络通讯
	CONNECTION_PCI = 2,//PCI通讯
	CONNECTION_MC_SIMULINK = 10	//运动控制算法仿真
}enum_Controller_Connect_Type;

//IO控制电平
typedef enum  
{
	Low_Pin = 0, //低电平
	High_Pin = 1 //高电平
}enum_IO_Controller_Pin_Type;

//坐标位置源配置
typedef enum
{
	Cmd_Pos_Src = 0,//指令位置源
	Encode_Pos_Src = 1,  //编码器位置源
}enum_Pos_Src;


//比较输出模式
typedef enum
{
	Less_Compare_Value = 0, //小于比较点模式
	//Equi_Compare_Value = 1, //等于比较点模式
	Beyond_Compare_Value = 1,//大于比较点模式
	Linear_Compare_Value = 2,//等增量比较模式
	FIFO_Compare_Value  = 3		 //FIFO点比较输出模式
}enum_Compare_Mode;

typedef enum
{
	SERVON_INDEX	= 0,//伺服使能
	ERC_INDEX		= 1//伺服报警清除

} enum_AXIS_OUT_TYPE_INDEX;

typedef enum
{
	NEL_INDEX		= 0,//负限位
	PEL_INDEX		= 1,//正限位
	ORG_INDEX		= 2,//原点
	INP_INDEX		= 3,//伺服到位
	EMG_INDEX		= 4,//急停信号
	ALM_INDEX		= 5,//伺服报警
	RDY_INDEX		= 6,//伺服准备
	SD_INDEX		= 7,//减速信号
	NORMAL_IO_TYPE	= 9,//通用IO信号
} enum_AXIS_IN_TYPE_INDEX;

 typedef enum
 {
	 PWM_Type_5V = 0, //5v PWM 
	 PWM_Type_24V = 1 //24 vPWM
 }enum_PWM_Type;


 typedef enum
{
	Line_Box_Running_No_Connect = 0,//接线盒没有连接
	Line_Box_Running_PowerOn = 1,//接线盒上电	
	Line_Box_Running_Init = 2,//接线盒连接初始化阶段
	Line_Box_Running_OK = 3,//接线盒连接正常运行阶段
	Line_Box_Running_Error = 4//接线盒连接运行错误阶段
}enum_Line_Box_Phase;

typedef enum
{
   Compare_1D = 1, //一维软件比较
   Compare_2D = 2 //二维软件比较
}enum_Compare_Dim;


/**************************运动类型宏定义****************************************/
//#define  Function_SignalAxisMotionCmd //单轴运动控制操作，包括：定长运动指令，定速运动，及回零运动 
#ifdef __cplusplus
extern "C" {
#endif

	/**************************连接控制器操作****************************************/

//#ifdef Function_ConnectInit 
		/*************************************************************
		说明：通过连接操作函数
		输入：
			WORD connect_no 连接的ID号：连接模式为CONNECTION_ETH情况下的设置ID号
										连接模式为CONNECTION_PCI情况下为空值

			type：连接类型  
				typedef enum 
				{
					CONNECTION_ETH = 1,//网络通讯
					CONNECTION_PCI = 2,//PCI通讯
					CONNECTION_MC_SIMULINK = 10	//运动控制算法仿真
				}enum_Connect_Type;

			*pconnectstring：连接类型为 	ethernet通讯的IP地址: "192.168.1.2"
			WORD* PcieNum ; 返回PCIe通讯控制器数
			WORD* PcieIndex;返回PCIe通讯控制器ID号
		输出：
		返回值：错误码
		*************************************************************/	
		MC_API DWORD __stdcall MC_Open(WORD connect_no,WORD type, char *pconnectstring,
											WORD* PcieNum ,WORD* PcieIndex);
		MC_API DWORD __stdcall MC_OpenCom(WORD connect_no, WORD com_id);
		MC_API DWORD __stdcall MC_OpenEthernet(WORD connect_no, char *ip_addr);
		MC_API DWORD __stdcall MC_FindEthernetIP(WORD connect_no, char *ip_addr, DWORD addr_len, DWORD timeout);
		/************************************************
		*
		*关闭控制器
		*
		*
		************************************************/
		MC_API DWORD __stdcall MC_Close(WORD connect_no);
		/*******************************************************************************
		* 函数名称: MC_ColdReset
		* 函数功能: 硬件复位，控制器所有信息复位

		* 输入参数: WORD connect_no		
		* 返 回 值: 
		* 创 建 人: Forest
		* 创建时间: 2022-11-30
		*******************************************************************************/
		MC_API DWORD __stdcall MC_ColdReset(WORD connect_no);	
		/*******************************************************************************
		* 函数名称: MC_WarmReset
		* 函数功能: 坐标系等信息复位

		* 输入参数: WORD connect_no		
		* 返 回 值: 
		* 创 建 人: Forest
		* 创建时间: 2022-11-30
		*******************************************************************************/
		MC_API DWORD __stdcall MC_WarmReset(WORD connect_no);		
		/************************************************
		*
		*controller的连接状态
		*typedef enum 
		*{
		*TASK_STATE_IDLE = 0,
		*TASK_STATE_RUNING = 1,
		*TASK_STATE_STOP = 2,
		*TASK_STATE_PAUSE = 3,
		*TASK_STATE_ERROR = 99,
		*SYS_STATE_CANNOT_CONNECT=100
		*}enum_Connector_Run_State;
		*
		************************************************/
		MC_API DWORD __stdcall MC_GetConnectState(WORD connect_no, WORD* connect_state);
		/************************************************
		*
		*设置控制器的socket超时时间，默认值为3000ms，最大值10000ms，最小值为1000ms
		*timeout：单位为ms
		*
		************************************************/
		MC_API DWORD __stdcall MC_SetConnectTimeout(WORD connect_no, DWORD timeout);
		/************************************************
		*
		*设置命令的最大延时时间，默认值为3000ms，最大值10000ms，最小值为0
		*timeout：单位为ms
		*
		************************************************/
		MC_API DWORD __stdcall MC_SetCmdTimeout(WORD connect_no, DWORD timeout);
		/************************************************
		*
		*获取命令的最大延时时间
		*
		*
		************************************************/
		MC_API DWORD __stdcall MC_GetCmdTimeout(WORD connect_no, DWORD* timeout);

		/*******************************************************************************
		* 函数名称: MC_GetConnectLineBoxState
		* 函数功能: 

		* 输入参数: WORD connect_no		

		 WORD id 接线盒id = 0；

		 DWORD* conState		//MaxConnectCpldNum = 8;最多连接8个
		  typedef enum
		  {
			  Line_Box_Running_No_Connect = 0,//接线盒没有连接
			  Line_Box_Running_PowerOn = 1,//接线盒上电 
			  Line_Box_Running_Init = 2,//接线盒连接初始化阶段
			  Line_Box_Running_OK = 3,//接线盒连接正常运行阶段
			  Line_Box_Running_Error = 4//接线盒连接运行错误阶段
		  }enum_Line_Box_Phase;


		* 返 回 值: 
		* 创 建 人: Forest
		* 创建时间: 2022-11-30
		*******************************************************************************/
		MC_API DWORD __stdcall MC_GetConnectLineBoxState(WORD connect_no, WORD* conState);

//#endif

/*********************************控制器信息******************************************/
	/*************************************************************
	说明：获取，轴及IO口信息
	输入：

	输出：
	返回值：错误码
	*************************************************************/	
	MC_API DWORD __stdcall MC_GetTotalAxesAndIONum(WORD connect_no,WORD* total_axes, WORD* liner_num ,WORD* total_in_num,WORD* total_out_num, WORD* total_pwm_num);

	/*************************************************************
	说明：获取，模拟量信息
	输入：

	输出：
	返回值：错误码
	*************************************************************/	
	MC_API DWORD __stdcall MC_GetTotalAdAndDaNum(WORD connect_no,WORD* total_ad_num,WORD* total_da_num);

	/*************************************************************
	说明：获取控制系统版本信息
	输入：
	byte* product_type(64bytes)  ： 产品类型 例如"PMC200C"
	byte* soft_version(64bytes)  ：例如pmc_200C_v1.0_soft	软件版本1.0，PCI运动控制，12轴 点位+高速IO版本 					
						pmc => pci motion control
						1 => 1:纯点位版本；2:点位+高速IO版本；（中间空4个）		 6:轨迹版本；
						0 => 0:表示脉冲；1表示ehthercat；2表示can；。。。。
						0c => 0c:表示轴数；
						//
						emc => ethernet motion control
	DWORD* firmware_version	:例如：0x01000100  硬件及fpga代码通用版本，第一版本
						31~24bit：硬件通用版本：31~28位为大版本（当前为0），27~24为子版本（第一个版本为1）
						23~16bit：定制版本：
						例如：0x0100  表示通用版本，第一版
						//fpga 版本
						15~8bit：fpga代码版本：15~12位为大版本（当前为0），11~8位为子版本（第一个版本为1）
						7~0bit：定制版本：
						例如：0x0100  表示通用版本，第一版

	DWORD* dll_version ：例如：0x10221110
						1表示1.0版本，0表示定制号，通用版本，日期20221110

	输出：
	返回值：错误码
	*************************************************************/	
	MC_API DWORD __stdcall MC_GetControllerVersion(WORD connect_no,char* product_type,char* soft_version,DWORD* firmware_version,DWORD* dll_version);
	/*************************************************************
	说明：获取控制产品型号
	输入：

	输出：
	返回值：错误码
	*************************************************************/	
	MC_API DWORD __stdcall MC_GetProductID(WORD connect_no,DWORD* product_id);
	/*******************************************************************************
	* 函数名称: MC_GetCapComNum
	* 函数功能: 获取捕获及比较数

	* 输入参数: WORD connect_no		

	 WORD* total_hs_cap_num		硬件通道
	 
	 WORD* total_hs_com_num		
	 
	 WORD* total_soft_cap_num		软件通道
	 
	 WORD* total_soft_com_num		
	* 返 回 值: 
	* 创 建 人: Forest
	* 创建时间: 2022-10-13
	*******************************************************************************/
	MC_API DWORD __stdcall MC_GetCapComNum(WORD connect_no,WORD* total_hs_cap_num,WORD* total_hs_com_num,
													WORD* total_soft_cap_num,WORD* total_soft_com_num,
													WORD* total_2d_hs_com_num,WORD* total_2d_soft_com_num);
	/*******************************************************************************
	* 函数名称: MC_GetHandWheelEncNum
	* 函数功能: 获取手轮及编码器数

	* 输入参数: WORD connect_no		

	 WORD* total_handlewheel_num		

	 WORD* total_enc_num		
	* 返 回 值: 
	* 创 建 人: Forest
	* 创建时间: 2022-10-13
	*******************************************************************************/
	MC_API DWORD __stdcall MC_GetHandWheelEncNum(WORD connect_no,WORD* total_handlewheel_num,WORD* total_enc_num);

//#ifdef Function_SignalAxisMotionCmd //单轴运动控制操作，包括：定长运动指令，定速运动，及回零运动 
	/*************************************************************
	说明：速度规划的最小匀速时间设定
	输入：
	minEvenTime :单位为s，最小值为0.001s
	输出：
	返回值：错误码
	*************************************************************/

	MC_API DWORD __stdcall MC_SetAxisMinEvenTime(WORD connect_no, WORD axis, double minEvenTime);
	MC_API DWORD __stdcall MC_GetAxisMinEvenTime(WORD connect_no, WORD axis, double* minEvenTime);
	/*************************************************************
	说明：速度规划模式参数设置;如果设置为T型，sRatio 参数无效
	输入：
	vel_mode：0表示T型，1表示S型或（sin）型
	sRatio :S型的匀加速时间比值。取值范围[0~1];0表示T型速度规划；1表示没有匀加速阶段
	maxAcc ：最大加速度限制；
	输出：
	返回值：错误码
	*************************************************************/
	MC_API DWORD __stdcall MC_SetAxisVelPlanMode(WORD connect_no, WORD axis, WORD vel_mode, double sRatio, double maxAcc);
	MC_API DWORD __stdcall MC_GetAxisVelPlanMode(WORD connect_no, WORD axis, WORD* vel_mode, double* sRatio, double* maxAcc);

	/*************************************************************
	说明：速度规划速度平滑
	输入：
	ifEnable：0表示禁止，1表示使能
	smTime :平滑时间，单位为s，最小值为0.001s
	输出：
	返回值：错误码
	*************************************************************/
	MC_API DWORD __stdcall MC_SetAxisVelSmooth(WORD connect_no, WORD axis, WORD ifEnable, double smTime);
	MC_API DWORD __stdcall MC_GetAxisVelSmooth(WORD connect_no, WORD axis, WORD* ifEnable, double* smTime);

	/*************************************************************
	说明：运动按时间参数设置
	输入：
		start_vel: 启动速度 
		max_vel：最大允许允许速度 最大值为10M；最小值大于0
		stop_vel：停止速度
		t_acc：加速时间  最大值为100s，最小值为0
		t_dec：减速时间  最大值为100s，最小值为0
		s_para：s型曲线参数配置 最大值1，最小值为0；如果设置该值为零时，为T形速度曲线，不为零时，表示S型曲线
		maxAcc: 最大加减速限制，设置值小于运动配置的加减速度值时，最大加减速度设置为其运动加减速度。
	输出：
	返回值：错误码
	*************************************************************/	 
	MC_API DWORD __stdcall MC_SetAxisMotionPrm(WORD connect_no,WORD axis,double start_vel,double max_vel,double stop_vel,double t_acc,double t_dec,double s_ratio,double maxAcc);
	MC_API DWORD __stdcall MC_GetAxisMotionPrm(WORD connect_no,WORD axis,double* start_vel,double* max_vel,double* stop_vel,double* t_acc,double* t_dec,double *s_ratio,double* maxAcc);
	/*************************************************************
	说明：运动按加速度参数设置
	输入：
	start_vel: 启动速度 
	max_vel：最大允许允许速度 最大值为10M；最小值大于0
	stop_vel：停止速度
	acc：加速度  最大值为2的32次方，最小值为0
	dec：减速度  最大值为2的32次方，最小值为0
	s_para：s型曲线参数配置 最大值1，最小值为0；如果设置该值为零时，为T形速度曲线，不为零时，表示S型曲线
	maxAcc: 最大加减速限制，设置值小于运动配置的加减速度值时，最大加减速度设置为其运动加减速度。
	输出：
	返回值：错误码
	*************************************************************/	
	MC_API DWORD __stdcall MC_SetAxisMotionPrmAcc(WORD connect_no,WORD axis,double start_vel,double max_vel,double stop_vel,double acc,double dec,double s_ratio,double maxAcc);
	MC_API DWORD __stdcall MC_GetAxisMotionPrmAcc(WORD connect_no,WORD axis,double* start_vel,double* max_vel,double* stop_vel,double* acc,double* dec,double *s_ratio,double* maxAcc);
	/*************************************************************
	说明：单轴定长运动指令
	输入：
		mode: 0 表示 相对运动模式； 1表示 绝对运动模式
	输出：
	返回值：错误码
	*************************************************************/	
	MC_API DWORD __stdcall MC_MovePos(WORD connect_no,WORD axis,WORD pos_mode,double pos);

	
	/*******************************************************************************
	* 函数名称: MC_MoveAbsolute
	* 函数功能: 
	
	* 输入参数: WORD connect_no 	
	
	 WORD axis		
	
	 double pos 	目标位置
	
	 double start_V 	启动速度
	
	 double stop_V		停止速度
	
	 double Vel 	最大速度
	
	 double Acc 	加速度
	
	 double Dec 	减速度
	
	 double S_Ratio 	s段比例
	
	 double maxAcc		最大加速度
	* 返 回 值: 
	* 创 建 人: 
	* 创建时间: 2022-6-8
	*******************************************************************************/
	MC_API DWORD __stdcall MC_MoveAbsolute(WORD connect_no,WORD axis,double pos,double start_V,double stop_V, double Vel,double Acc,double Dec, double S_Ratio, double maxAcc);
	
	MC_API DWORD __stdcall MC_MoveRelative(WORD connect_no,WORD axis,double pos,double start_V,double stop_V, double Vel,double Acc,double Dec, double S_Ratio, double maxAcc);
	/*******************************************************************************
	* 函数名称: MC_MoveMultiPos
	* 函数功能: 启动多段运动，目前支持两段；第一段运动完成以后，立马执行第二段，
				两段的衔接速度不会降到零。

	* 输入参数: WORD connect_no		

	 WORD axis		运动轴

	 WORD pos_mode		只支持绝对运动，参数暂时保留

	 double first_pos		第一段的目标位置

	 double next_max_v		第二段最大速度

	 double next_stop_v		第二段停止速度；（停止速度自动调整到不大于最大速度）

	 double next_acc_t		第二段加速时间；

	 double next_dec_t		第二段减速时间；

	 double next_pos		第二段目标位置；暂时不支持反向。
	* 返 回 值: 
	* 创 建 人: 
	* 创建时间: 2022-6-8
	*******************************************************************************/
	MC_API DWORD __stdcall MC_MoveMultiPos(WORD connect_no,WORD axis,WORD pos_mode,double first_pos,double next_max_v,double next_stop_v,double next_acc_t,double next_dec_t,double next_pos);

	/*************************************************************
	说明：多轴定长运动指令
	输入：
		mode: 0 表示 相对运动模式； 1表示 绝对运动模式；2表示 强制绝对运动模式；
	输出：
	返回值：错误码
	*************************************************************/
	MC_API DWORD __stdcall MC_MovePosMultiAxes(WORD connect_no, WORD axis_num,WORD* axis,WORD* pos_mode,double* pos);

	/*******************************************************************************
	* 函数名称: MC_MoveVelocity
	* 函数功能: 
	
	* 输入参数: WORD connect_no 	
	
	 WORD axis		
	
	 double start_V 	启动速度
	
	 double stop_V		停止速度
	
	 double Vel 	最大速度，如果Vel>0为正向，vel<0为负向，为0参数无效
	
	 double Acc 	加速度
	
	 double Dec 	减速度
	
	 double S_Ratio 	s段规划比例
	
	 double maxAcc		最大允许加速度
	* 返 回 值: 
	* 创 建 人: 
	* 创建时间: 2022-6-8
	*******************************************************************************/
	MC_API DWORD __stdcall MC_MoveVelocity(WORD connect_no,WORD axis,double start_V,double stop_V, double Vel,double Acc,double Dec, double S_Ratio, double maxAcc);

	/*************************************************************
	说明：定速运动指令
	输入：
	    vel: vel < 0 表示 负向运动； vel > 0表示 正向；
	输出：
	返回值：错误码
	*************************************************************/	
	MC_API DWORD __stdcall MC_MoveVel(WORD connect_no,WORD axis, double vel);

	/*************************************************************
	说明：多轴定长运动指令
	输入：
		mode: 0 表示 相对运动模式； 1表示 绝对运动模式
	输出：
	返回值：错误码
	*************************************************************/
	MC_API DWORD __stdcall MC_MoveVelMultiAxes(WORD connect_no, WORD axis_num,WORD* axis,short* dir);
	/*************************************************************
	说明：单轴运动改变速度
	输入：
	   当前为move velocity状态下 vel 中，vel > 0 为正向，< 0 为负向
	   当前为move position 状态下 vel没有方向;
	   轴未运动，该指令无效
	输出：
	返回值：错误码
	*************************************************************/	
	MC_API DWORD __stdcall MC_MoveUpdateVel(WORD connect_no, WORD axis, double vel);
	/*************************************************************
	说明：单轴变倍率
	输入：
		ratio 取值范围[0,];0表示暂停状态
		如果当前未运动，该指令无效
	输出：
	返回值：错误码
	*************************************************************/	
	MC_API DWORD __stdcall MC_MoveUpateVelRatio(WORD connect_no,WORD axis, double ratio);

	/*************************************************************
	说明：启动回零运动
	输入：回零的原点开关参数设置通过 MC_SetAxisIo配置
		回零的模式等参数配置如下：
	    pos_object: 0表示指令位置，1表示编码器,主要针对锁存回零模式
		home_mode：回零模式设置
		home_dir：回零方向，-1表示负方向，1表示正方向
		home_logic: 回零逻辑电平0表示底有效；1表示高有效；
		ez_count: 如果回零模式为ez回零，回零的ez计数count数；最小值为1；
		pos_offset: 移动位置大小 （默认值为0）
		offset_mode：模式使能
		//回零结束模式
		typedef enum 
		{
			HOME_CRD_NOT_CLEAR	= 0,		//回零后不做任何动作
			HOME_CRD_CLEAR_SHIFT	= 1,	//回零之后，清零，然后偏移
			HOME_CRD_SHIT_CLEAR = 2 		//回零之后，偏移，清零
		}enum_HOME_Crd_CLEAR_MODE;	
	输出：
	返回值：错误码
	*************************************************************/		
	MC_API DWORD __stdcall MC_Home(WORD connect_no,WORD axis,WORD pos_object,WORD home_mode, int home_dir,WORD home_logic,WORD ez_count,WORD offset_mode,double pos_offset);
	MC_API DWORD __stdcall MC_GetHomePrm(WORD connect_no,WORD axis,WORD* pos_object,WORD* home_mode, int* home_dir,WORD* home_logic,WORD* ez_count,WORD* offset_mode,double* pos_offset);
	/*************************************************************
	说明：回零结果函数
	输入：
	输出：
		complete_state：
		typedef enum
		{
			HOME_RESULT_Dont_Complete = 0,			//回零未完成
			HOME_RESULT_DONE = 1,					//回零完成，找到原点位置
			HOME_RESULT_ERROR_NO_ORG_SIGNAL = 2,	//回零过程报错，没有原点信号
			HOME_RESULT_ERROR_DOUBLE_ORG = 3,		//回零过程发现设备有两个原点信号
			HOME_RESULT_ERROR_NO_EZ_SIGNAL = 4, 	//回零过程没有发现EZ信号
			HOME_RESULT_ERROR_DIR = 5,				//回零配置的方向错误
			HOME_RESULT_ERROR_EL = 6,				//回零过程限位停止
			HOME_RESULT_ERROR_SOFT_LIMIT_EXCEED = 7,//超出软件限位范围
			HOME_RESULT_ERROR_STOPPED = 100			//没有正常回零完成
		}enum_Home_Result;

	返回值：错误码
	*************************************************************/	
	MC_API DWORD __stdcall MC_GetHomeResult(WORD connect_no,WORD axis,WORD* complete_state);
	/*************************************************************
	说明：回零位置偏移使能函数，运动回零完成以后，移动固定距离后清零
	输入：
		position: 移动位置大小 
		org_mode：模式使能
		//回零结束模式
		typedef enum 
		{
			HOME_CRD_NOT_CLEAR 	= 0,		//回零后不做任何动作
			HOME_CRD_CLEAR_SHIFT	= 1,	//回零之后，清零，然后偏移
			HOME_CRD_SHIT_CLEAR	= 2 		//回零之后，偏移，清零
		}enum_HOME_Crd_CLEAR_MODE;
	输出：
	返回值：错误码
	*************************************************************/	
/*	MC_API DWORD __stdcall MC_SetHomePosOffset(WORD connect_no,WORD axis,WORD clear_mode,double position);
	MC_API DWORD __stdcall MC_GetHomePosOffset(WORD connect_no,WORD axis,WORD *clear_mode,double *position);
*/
//#endif

/**************************坐标系运动控制操作****************************************/
/*************************************************************
说明：判断轴是否运动完成,0 表示运行，1表示使能并空闲状态
	AXIS_MS_MOVING,         //运动中
	AXIS_MS_STANDSTILL,	  	//运动停止,轴可启动运动状态
	AXIS_MS_LIMIT_402,      //402轴的限位控制,运动中
	AXIS_MS_PAUSE,		    //暂停
	AXIS_MS_STOPPING,		//停止运动中
	AXIS_MS_POWER_OFF,       //轴未使能	,但是注意，可能有最后一个周期的运动，比如掉使能的时，当前周期还时需要运动完成
	AXIS_MS_DONT_EXIST       //轴不存在
输入：
输出：无
返回值：
*************************************************************/
MC_API DWORD __stdcall  MC_GetCrdCheckDone(WORD connect_no, WORD crd, WORD* crd_state);
/*************************************************************
说明：读取当前插补器速度
输入：
输出：无
返回值：
*************************************************************/
MC_API DWORD __stdcall  MC_GetCrdCmdSpeed(WORD connect_no, WORD crd, double* speed);

//坐标系运动参数设置 
/*************************************************************
说明：速度规划的最小匀速时间设定
输入：

输出：
返回值：错误码
*************************************************************/

MC_API DWORD __stdcall MC_SetCrdMinEvenTime(WORD connect_no, WORD crd, double minEvenTime);
MC_API DWORD __stdcall MC_GetCrdMinEvenTime(WORD connect_no, WORD crd, double* minEvenTime);
/*************************************************************
说明：速度规划模式参数设置;如果设置为T型，sRatio 参数无效
输入：
vel_mode：0表示T型，1表示S型或（sin）型
sRatio :S型的匀加速时间比值。取值范围[0~1];0表示T型速度规划；1表示没有匀加速阶段
maxAcc ：最大加速度限制；
输出：
返回值：错误码
*************************************************************/
MC_API DWORD __stdcall MC_SetCrdVelPlanMode(WORD connect_no, WORD crd, WORD vel_mode, double sRatio, double maxAcc);
MC_API DWORD __stdcall MC_GetCrdVelPlanMode(WORD connect_no, WORD crd, WORD* vel_mode, double* sRatio, double* maxAcc);
/*************************************************************
说明：速度规划速度平滑
输入：
ifEnable：0表示禁止，1表示使能
smTime :平滑时间
输出：
返回值：错误码
*************************************************************/
MC_API DWORD __stdcall MC_SetCrdVelSmooth(WORD connect_no, WORD crd, WORD ifEnable, double smTime);
MC_API DWORD __stdcall MC_GetCrdVelSmooth(WORD connect_no, WORD crd, WORD* ifEnable, double* smTime);


/*************************************************************
说明：运动按时间参数设置
输入：
    start_vel: 启动速度 
	max_vel：最大允许允许速度 最大值为10M；最小值大于0
	stop_vel：停止速度
	t_acc：加速时间  最大值为100s，最小值为0
	t_dec：减速时间  最大值为100s，最小值为0
	s_para：s型曲线参数配置 最大值1，最小值为0；如果设置该值为零时，为T形速度曲线，不为零时，表示S型曲线
	maxAcc: 最大加减速限制，设置值小于运动配置的加减速度值时，最大加减速度设置为其运动加减速度。
输出：
返回值：错误码
*************************************************************/
MC_API DWORD __stdcall MC_SetCrdMotionPrm(WORD connect_no,WORD crd,double start_vel,double max_vel,double stop_vel,double t_acc,double t_dec,double s_ratio,double maxAcc);
MC_API DWORD __stdcall MC_GetCrdMotionPrm(WORD connect_no,WORD crd,double* start_vel,double* max_vel,double* stop_vel,double* t_acc,double* t_dec,double* s_ratio,double* maxAcc);
MC_API DWORD __stdcall MC_SetCrdMotionPrmAcc(WORD connect_no,WORD crd,double start_vel,double max_vel,double stop_vel,double acc,double dec,double s_ratio,double maxAcc);
MC_API DWORD __stdcall MC_GetCrdMotionPrmAcc(WORD connect_no,WORD crd,double* start_vel,double* max_vel,double* stop_vel,double* acc,double* dec,double* s_ratio,double* maxAcc);
/*************************************************************
说明：直线插补命令
输入：
    start_vel: 启动速度 
	Crd：坐标系号
	AxisNum：轴数
	AxisList：轴列表
	Dist：目标位置信息列表
	crd_mode：0表示相对运动，1表示绝对运动
输出：
返回值：错误码
*************************************************************/
MC_API DWORD __stdcall MC_MoveLinear(WORD ConnectNo,WORD Crd,WORD AxisNum,WORD* AxisList,double* Dist,WORD Crd_Mode);
/*************************************************************
说明：终点圆心的圆弧插补函数
输入：
AxisNum：轴数；
AxisList：插补轴列表，超过三轴的其它轴为跟随轴；
Target_Pos：目标位置；
Cen_Pos：圆心位置；
Arc_Dir：圆弧插补方向；分为顺时针，和逆时针；
Circle：插补圈数；
Pos_Mode：插补的位置模式；
输出：无
返回值：错误码
*************************************************************/
MC_API DWORD __stdcall  MC_MovePlaneArcC(WORD ConnectNo,WORD Crd,WORD AxisNum,WORD* AxisList,double* Target_Pos,double* Cen_Pos,WORD Arc_Dir,DWORD Circle,WORD Crd_Mode);
/*************************************************************
说明：终点半径圆弧插补函数
输入：
	Arc_Radius：圆弧半径
	Arc_Dir:0 表示劣弧，1表示优弧
输出：无
返回值：错误码
*************************************************************/
MC_API DWORD __stdcall  MC_MovePlaneArcR(WORD ConnectNo,WORD Crd,WORD AxisNum,WORD* AxisList,double* Target_Pos,double Arc_Radius,WORD Arc_Dir,DWORD Circle,WORD Crd_Mode);
/*************************************************************
说明：三点圆弧插补函数
输入：
输出：无
返回值：错误码
*************************************************************/
MC_API DWORD __stdcall  MC_MovePlaneArc3P(WORD ConnectNo,WORD Crd,WORD AxisNum,WORD* AxisList,double* Target_Pos,double* Mid_Pos,DWORD Circle,WORD Crd_Mode);
/*************************************************************
说明：终点圆心的空间圆弧插补函数
输入：
AxisNum：轴数；
AxisList：插补轴列表，超过三轴的其它轴为跟随轴；
Target_Pos：目标位置；
Cen_Pos：圆心位置；
Arc_Dir：圆弧插补方向；0分为顺时针，1逆时针；
Circle：插补圈数；
Pos_Mode：插补的位置模式；
输出：无
返回值：错误码
*************************************************************/
MC_API DWORD __stdcall  MC_MoveSpaceArcC(WORD ConnectNo,WORD Crd,WORD AxisNum,WORD* AxisList,double* Target_Pos,double* Cen_Pos,WORD Arc_Dir,DWORD Circle,WORD Crd_Mode);
/*************************************************************
说明：三点圆弧空间插补函数
输入：
输出：无
返回值：错误码
*************************************************************/
MC_API DWORD __stdcall  MC_MoveSpaceArc3P(WORD ConnectNo,WORD Crd,WORD AxisNum,WORD* AxisList,double* Target_Pos,double* Mid_Pos,DWORD Circle,WORD Crd_Mode);
/*************************************************************
说明：椭圆插补函数
输入：
AxisNum：轴数；
AxisList：插补轴列表，超过三轴的其它轴为跟随轴；
Target_Pos：目标位置；
Cen_Pos：圆心位置；
double short_len 椭圆短轴;
double long_len 椭圆长轴;
Arc_Dir：圆弧插补方向；0分为顺时针，1逆时针；
Circle：插补圈数；
Pos_Mode：插补的位置模式；
输出：无
返回值：错误码
*************************************************************/
MC_API DWORD __stdcall  MC_MovePlaneEllipse(WORD ConnectNo,WORD Crd,WORD AxisNum,WORD* AxisList,double* Target_Pos,double* Cen_Pos, double short_len, double long_len,WORD Arc_Dir,DWORD Circle,WORD Crd_Mode);

/*******************************************************************************
* 函数名称: MC_GetCrdStatus
* 函数功能: 获取插补器的工作状态

* 输入参数: WORD ConnectNo		

 WORD Crd		

 WORD* runningState		当前插补器的工作状态，0表示运行，1表示停止

 DWORD* mark		当前插补段的段号，如果是单段插补，返回1

 WORD* runningMode		当前插补器工作的模式
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-7-12
*******************************************************************************/
MC_API DWORD __stdcall  MC_GetCrdStatus(WORD ConnectNo,WORD Crd,WORD* runningState, DWORD* mark, WORD* runningMode);


MC_API DWORD __stdcall MC_StopCrd(WORD connect_no, WORD crd, WORD stop_mode, double stop_time);

/*******************************************************************************
* 函数名称: MC_GetCrdBufStatus
* 函数功能: 连续插补模式下，获取buffer的空间大小

* 输入参数: WORD ConnectNo		

 WORD Crd		
 UInt16 curRunningMark	 当前执行的插补段mark

 WORD* freeSpace		剩余空间

 WORD* usedSpace		已用空间
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-7-12
*******************************************************************************/
MC_API DWORD __stdcall  MC_GetCrdBufStatus(WORD ConnectNo,WORD Crd,WORD* curRunningMark,WORD* freeSpace, WORD* usedSpace);

/*******************************************************************************
* 函数名称: MC_MoveContiLinear
* 函数功能: 

* 输入参数: WORD ConnectNo		

 WORD Crd		插补器号

 WORD AxisNum		插补轴数

 WORD* AxisList		插补轴列表

 double* Dist		目标位置

 WORD Crd_Mode		位置模式，0表示相对，1表示绝对

 DWORD mark		   设置的插补段号

 WORD linkToLast		是否连接上一段，0表示不连接，1表示连接。在前瞻模式下，该配置有效，连续插补模式下，无效

 double feedVel		该段的插补最大速度

 double endVel		该段的最大停止速度
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-7-12
*******************************************************************************/
MC_API DWORD __stdcall  MC_MoveContiLinear(WORD ConnectNo,WORD Crd,WORD AxisNum,WORD* AxisList,double* Dist,WORD Crd_Mode, DWORD mark, WORD linkToLast, double feedVel, double endVel);
/*******************************************************************************
* 函数名称: MC_SetCrdLookAhead
* 函数功能: 配置连续前瞻插补的模式，0表示连续插补，1表示前瞻处理插补

* 输入参数: WORD ConnectNo		

 WORD Crd		

 WORD lookaheadMode		
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-7-12
*******************************************************************************/
MC_API DWORD __stdcall  MC_SetCrdLookAhead(WORD ConnectNo,WORD Crd,WORD lookaheadMode);
MC_API DWORD __stdcall  MC_GetCrdLookAhead(WORD ConnectNo,WORD Crd,WORD* lookaheadMode);
/*******************************************************************************
* 函数名称: MC_SetCrdCmdWait
* 函数功能: 设置连续插补时，等待上位机指令启动运动。

* 输入参数: WORD ConnectNo		

 WORD Crd		
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-7-21
*******************************************************************************/
MC_API DWORD __stdcall  MC_SetCrdCmdWait(WORD ConnectNo,WORD Crd);

/*******************************************************************************
* 函数名称: MC_SetCrdCmdWait
* 函数功能: 设置连续插补时，等待上位机指令启动运动。
与MC_SetCrdCmdWait指令配合使用，表示立马执行运动

* 输入参数: WORD ConnectNo		

 WORD Crd		
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-7-21
*******************************************************************************/

MC_API DWORD __stdcall  MC_SetCrdCmdStart(WORD ConnectNo,WORD Crd);

/*******************************************************************************
* 函数名称: MC_SetCrdCornerPrm
* 函数功能: 设置前瞻处理的拐角参数

* 输入参数: WORD ConnectNo		

 WORD group		

 WORD cornerFlag		拐角处理，0表示处理，1表示不处理

 double maxPathError		最大轨迹误差

 double maxVelLimit		最大速度限制

 double maxAccLimit		最大加速度限制
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-7-12
*******************************************************************************/
MC_API DWORD __stdcall   MC_SetCrdCornerPrm(WORD ConnectNo, WORD Crd, WORD cornerFlag, double maxPathError,
									double maxVelLimit, double maxAccLimit );

MC_API DWORD __stdcall   MC_GetCrdCornerPrm(WORD ConnectNo, WORD Crd, WORD* cornerFlag, double* maxPathError,
									double* maxVelLimit, double* maxAccLimit );

/**************************轴状态和参数信息****************************************/

/*************************************************************
说明：轴使能,在使用轴之前需要先使能轴控制
输入：ifEnable: 0表示使能，1表示使能
输出：无
返回值：
*************************************************************/
MC_API DWORD __stdcall  MC_Power(WORD connect_no, WORD axis, WORD ifEnable);
/*******************************************************************************
* 函数名称: MC_SetPulseMode
* 函数功能: 脉冲输出模式配置

* 输入参数: WORD connect_no		

 WORD axis		

 WORD pulse_mode	
 	 0~3 脉冲 + dir
	 4~5 双脉冲
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-24
*******************************************************************************/
MC_API DWORD __stdcall  MC_SetPulseMode(WORD connect_no, WORD axis, WORD pulse_mode);
MC_API DWORD __stdcall  MC_GetPulseMode(WORD connect_no, WORD axis, WORD* pulse_mode);
/*******************************************************************************
* 函数名称: MC_SetEncodeMode
* 函数功能: 设置轴对应编码器的工作模式及方向

* 输入参数: WORD connect_no		

 WORD axis		

 WORD enc_mode	：	
 Pulse_Dir_Mode_Count = 0, //脉冲方向计数
 Pulse_A_B_Mode_Count_1  = 1, //AB相计数，1倍频计数
 Pulse_A_B_Mode_Count_2  = 2, //AB相计数，2倍频计数  
 Pulse_A_B_Mode_Count_4  = 3 //AB相计数，4倍频计数


 WORD enc_dir		0： 计数方向不取反 1： 计数方向取反
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-24
*******************************************************************************/
MC_API DWORD __stdcall  MC_SetEncodeMode(WORD connect_no, WORD axis, WORD enc_mode, WORD enc_dir);
MC_API DWORD __stdcall  MC_GetEncodeMode(WORD connect_no, WORD axis, WORD* enc_mode, WORD* enc_dir);

/*************************************************************
说明：判断轴是否运动完成,0 表示运行，1表示空闲状态
输入：
输出：无
返回值：
*************************************************************/
MC_API DWORD __stdcall  MC_GetAxisMachineState(WORD connect_no, WORD axis, WORD* Axis_state);
/*************************************************************
说明：判断轴是否运动完成,0 表示运行，1表示使能并空闲状态
输入：
输出：无
返回值：
*************************************************************/
MC_API DWORD __stdcall  MC_GetAxisCheckDone(WORD connect_no, WORD axis, WORD* CheckDone);

/*************************************************************
说明：轴当前的运动模式
输入：
typedef enum
{
	Axis_Move_Idle 		 = 0,//没运动。该状态只能在中断handle_machine_state 和急停的地方使用。切忌！！！
	Axis_Pmove 			,	// 点到点运动
	Axis_Vmove 			, 	//  速度控制运动
	Axis_Hmove 		,	//回零运动
	Axis_Handwheel_Move 	, 	//手脉跟随运动
	Axis_Sine_Ascillate,//20 正弦振荡曲线模式	
	Axis_PT_Move 		,
	Axis_PVT_Move, 		//PVT	
	
	Axis_Line_Move  		,	//直线插补
	Axis_Arc_Move 		, //圆弧插补
	Axis_EcllipseMove, //椭圆插补
	Axis_SpindleMove, //螺旋线插补
	Axis_Contiue_Move 	, //连续插补
	Axis_Lookahead_Move 	, //前瞻插补
	Axis_RTCP ,//28五轴+法向跟随

	//同步，跟随
	Axis_Gear_Move 		,//齿轮
	Axis_Cam_Move 		,// 凸轮
	Axis_Cam_Simplify ,//10 简化电子凸轮模式
	Axis_Gantry,   //16龙门模式
	Axis_Follow, //19 跟随模式
	Axis_Follow_Tangent,//27刀向跟随模式

	Axis_Cmd_Buffer ,//29 指令缓存
	Axis_U_MOVE,   //18 门型运动

}Enum_Axis_Move_Mode;

输出：无
返回值：
*************************************************************/

MC_API DWORD __stdcall  MC_GetAxisMotionMode(WORD connect_no, WORD axis, WORD* Motion_Mode);

/*************************************************************
说明：设置轴当量
输入：最小值为0.001，最大值为100，000
输出：无
返回值：
*************************************************************/
MC_API DWORD __stdcall  MC_SetAxisEquvi(WORD connect_no, WORD axis, double equvi);

/*************************************************************
说明：获取轴当量
输入：
输出：无
返回值：
*************************************************************/
MC_API DWORD __stdcall  MC_GetAxisEquvi(WORD connect_no, WORD axis, double* equvi);
/*************************************************************
说明：停止类指令一共包括2种方式
1.根据停止模式及停止时间参数，停止运动；支持急停与减速停止
2.急停
输入：
输出：无
返回值：
*************************************************************/


/*************************************************************
说明：根据配置的停止方式，停止时间启动运动停止
输入：stop_mode :0表示减速停止，1表示急停；stop_time单位为s
	轴在运动中时，执行一次运动停止，并且配置停止参数；
	轴在停止状态时，配置停止参数
输出：无
返回值：
*************************************************************/
MC_API DWORD __stdcall  MC_StopAxis(WORD connect_no, WORD axis, WORD mode, double stop_time);
/*******************************************************************************
* 函数名称: MC_SetAxisStopTime
* 函数功能: 轴减速停止时间，单位为s

* 输入参数: WORD connect_no		

 WORD axis		

 double stop_time		
* 返 回 值: 
* 创 建 人: Forest
* 创建时间: 2022-9-4
*******************************************************************************/
MC_API DWORD __stdcall  MC_SetAxisStopTime(WORD connect_no, WORD axis, double stop_time);

/*************************************************************
说明：获取减速停止方式，停止时间设置
输入：单位为s
输出：无
返回值：
*************************************************************/
MC_API DWORD __stdcall  MC_GetAxisStopModeTime(WORD connect_no, WORD axis, WORD* mode, double* stop_time);
/*************************************************************
说明：减速停止方式， 如果轴处于插补系中，停止改插补系
输入：
	Stop_Mode： 0表示减速停，1表示立即停止
输出：无
返回值：
*************************************************************/
//MC_API DWORD __stdcall  mc_axis_dec_stop(WORD connect_no, WORD axis);
/*************************************************************
说明：紧急停止所有轴运动
输入：
输出：无
返回值：
*************************************************************/
MC_API DWORD __stdcall MC_StopEmgImd(WORD connect_no);
/*************************************************************
说明：暂停
输入：
输出：无
返回值：停止原因,0正常结束
*************************************************************/
MC_API DWORD __stdcall  MC_HaltAxis(WORD connect_no, WORD axis);

/*************************************************************
说明：读取停止原因
输入：
typedef stopReason
{
	//0：运动正常停止
	//1：客户调用指令减速停止
	//2：alarm信号减速停止
	//3：硬件正限位减速停止
	//4：硬件负限位减速停止
	//5：软件正限位减速停止
	//6：软件负限位减速停止	
	//7: 区域限位引起停止运动
	//8：IO触发减速停止
	//9: 减速暂停

	//100：emg信号立即停止
	//101：客户调用指令立即停止
	//102：alarm信号立即停止
	//103：硬件正限位立即停止
	//104：硬件负限位立即停止
	//105：软件正限位立即停止
	//106：软件负限位立即停止
	//107: 区域限位引起停止运动
	//108：IO触发立即停止
	//109：运动中，掉使能
	//110: 运动过大，异常停止
}

输出：无
返回值：停止原因,0正常结束
*************************************************************/
MC_API DWORD __stdcall  MC_GetAxisStopReason(WORD connect_no, WORD axis, DWORD* stop_reason);
/*************************************************************
说明：清除停止原因
输入：
输出：无
返回值：停止原因,0正常结束
*************************************************************/
MC_API DWORD __stdcall  MC_ClearAxisStopReason(WORD connect_no, WORD axis);

/*************************************************************
说明：读取当前指令位置
输入：
输出：无
返回值：
*************************************************************/
MC_API DWORD __stdcall  MC_GetAxisCmdPos(WORD connect_no, WORD axis, double* cmd_pos);

/*************************************************************
说明：读取当前速度
输入：
输出：无
返回值：
*************************************************************/
MC_API DWORD __stdcall  MC_GetAxisCmdSpeed(WORD connect_no, WORD axis, double* speed);

/*************************************************************
说明：读取编码器反馈位置
输入：
输出：无
返回值：
*************************************************************/
MC_API DWORD __stdcall  MC_GetEncoderPos(WORD connect_no, WORD axis, double* encoder_pos);
/*************************************************************
说明：读取反馈位置
输入：
输出：无
返回值：
*************************************************************/
MC_API DWORD __stdcall  MC_GetAxisFeedbackPos(WORD connect_no, WORD axis, double* feedback_pos);

/*************************************************************
说明：设置当前指令位置
输入：
输出：无
返回值：
*************************************************************/
MC_API DWORD __stdcall  MC_SetAxisCmdPos(WORD connect_no, WORD axis, double cmd_pos);

/*************************************************************
说明：设置当前指令位置
输入：
输出：无
返回值：
*************************************************************/
MC_API DWORD __stdcall  MC_SetEncoderPos(WORD connect_no, WORD axis, double encoder_pos);
/*******************************************************************************
* 函数名称: MC_SetAxisSoftELPrm
* 函数功能: 配置轴的软件限位参数

* 输入参数: WORD connect_no		

 WORD axis		

 WORD enable		
 
 WORD pos_src  位置源，0表示指令位置，1表示编码器位置

 double max_pos		最大位移

 double min_pos		最小位移

 WORD stop_mode		限位发生时的轴停止模式
* 返 回 值: 
* 创 建 人: Forest
* 创建时间: 2022-9-5
*******************************************************************************/
MC_API DWORD __stdcall  MC_SetAxisSoftELPrm(WORD connect_no, WORD axis, WORD enable, WORD pos_src, double max_pos, double min_pos, WORD stop_mode);

MC_API DWORD __stdcall  MC_GetAxisSoftELPrm(WORD connect_no, WORD axis, WORD* enable,WORD* pos_src,  double* max_pos, double* min_pos, WORD* stop_mode);
/*******************************************************************************
* 函数名称: MC_SetLimitArcPrm
* 函数功能: 圆弧位置限制功能，围绕圆弧的圆心，在指定半径内运动

* 输入参数: WORD connect_no		

 WORD enable		true表示使能，false表示禁止

 WORD crd_dim		圆弧坐标系的维数，平面圆弧为2维;目前只支持平面圆弧

 WORD* axis_list	坐标系轴系数列表

 double* arc_cen		圆心位置

 double limit_radius		圆弧半径

 WORD pos_src		位置源，0表示指令位置，1表示编码器位置

 WORD stop_mode		停止模式，0表示减速停，1表示急停
* 返 回 值: 
* 创 建 人: Forest
* 创建时间: 2022-9-18
*******************************************************************************/
MC_API DWORD __stdcall  MC_SetLimitArcPrm(WORD connect_no, WORD enable, WORD* axis_list, double* arc_cen, double limit_radius, WORD pos_src , WORD stop_mode);
MC_API DWORD __stdcall  MC_GetLimitArcPrm(WORD connect_no, WORD* enable, WORD* axis_list, double* arc_cen, double* limit_radius, WORD* pos_src , WORD* stop_mode);


/***********************  通用IO 操作部分  ************************/

/*************************************************************
说明：读输入口
输入： io编号，从0开始
输出：0-低电平， 1- 高电平
返回值：错误码
*************************************************************/
MC_API DWORD __stdcall  MC_GetInIoBit(WORD connect_no, DWORD io_index, byte* IoState);

/*************************************************************
说明：读输入口,一次32点
输入：io编号，从0开始 
	  0-低电平， 1- 高电平
输出：
返回值：错误码
*************************************************************/
MC_API DWORD __stdcall  MC_GetInIoPort(WORD connect_no, DWORD port_index, DWORD* IoState);
/*******************************************************************************
* 函数名称: MC_GetInIoPtr
* 函数功能: 按起始地址读取IO状态，最多一次读取64点

* 输入参数: WORD connect_no		

 DWORD start_index		

 DWORD io_num		

 unsigned long long*  IoState		
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-1
*******************************************************************************/
MC_API DWORD __stdcall  MC_GetInIoPtr(WORD connect_no, DWORD start_index, DWORD io_num, unsigned long long*  IoState);


//0表示导通，1表示断开
/*************************************************************
说明：写输出口
输入：io编号，从0开始 
	  0-低电平， 1- 高电平
输出：
返回值：错误码
*************************************************************/
MC_API DWORD __stdcall  MC_SetOutIoBit(WORD connect_no, DWORD io_index, byte IoState);

/*************************************************************
说明：写输出口,一次32点
输入：io编号，从0开始 
	  0-低电平， 1- 高电平
输出：
返回值：错误码
*************************************************************/
MC_API DWORD __stdcall  MC_SetOutIoPort(WORD connect_no, DWORD port_index, DWORD IoState);
/*******************************************************************************
* 函数名称: MC_SetOutIoPtr
* 函数功能: 根据起始IO序号，连续写多个IO点的状态，
多个IO点写入相同的状态，最多连续写64点；

* 输入参数: WORD connect_no		

 DWORD start_index		

 byte IoState		

 unsigned long long  IoMask		：bit位为零表示保持原来状态，为1表示写入IoState状态
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-1
*******************************************************************************/
MC_API DWORD __stdcall  MC_SetOutIoPtr(WORD connect_no, DWORD start_index, byte IoState ,unsigned long long  IoMask);

/*************************************************************
说明：读输出口
输入： io编号，从0开始
输出：0-低电平， 1- 高电平
返回值：错误码
*************************************************************/
MC_API DWORD __stdcall  MC_GetOutIoBit(WORD connect_no, DWORD io_index, byte* IoState);

/*************************************************************
说明：读输出口,一次32点
输入：io编号，从0开始 
	  0-低电平， 1- 高电平
输出：
返回值：错误码
*************************************************************/
MC_API DWORD __stdcall  MC_GetOutIoPort(WORD connect_no, DWORD port_index, DWORD* IoState);
/*******************************************************************************
* 函数名称: MC_GetOutIoPtr
* 函数功能: 按起始地址读取IO状态，最多一次读取64点

* 输入参数: WORD connect_no		

 DWORD start_index		

 DWORD io_num		

 unsigned long long*  IoMask		
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-1
*******************************************************************************/
MC_API DWORD __stdcall  MC_GetOutIoPtr(WORD connect_no, DWORD start_index, DWORD io_num, unsigned long long*  IoState);

/*******************************************************************************
* 函数名称: MC_SetIOCountStopAxisConfig
* 函数功能: 计数到指定值后，停止轴运动
	0~7号通道为硬件计数，后续为普通计数，总共12路通道
	启动IO配置函数MC_StartIOCount前调用该函数配置计数功能
* 输入参数: WORD connect_no		

 WORD chan		比较通道，最多12路

 DWORD io_index		计数IO的序号

 uint32 count_value		计数比较值配置，大于设置值，触发轴停止

 uint8 counter_mode	:	计数边沿配置
					 typedef enum{
					    up_edge_count = 1,//上升沿计数
					    down_edge_count = 2,
					    any_edge_count = 3,
					   
					}enum_io_count_source;

 uint16* axis_list		停止轴列表

 uint16 axis_num		轴数为零表示只计数

 uint8 stop_mode		停止模式，0表示减速停止，1表示急停
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-1
*******************************************************************************/
MC_API DWORD __stdcall  MC_SetIOCountPrm(WORD connect_no, WORD chan, DWORD io_index, DWORD compare_value, WORD counter_mode,double filter,
									WORD* axis_list, WORD axis_num, WORD stop_mode);

MC_API DWORD __stdcall  MC_GetIOCountPrm(WORD connect_no, WORD chan, DWORD* io_index, DWORD* compare_value, WORD* counter_mode,double* filter,
									WORD* axis_list, WORD* axis_num, WORD* stop_mode);

/*******************************************************************************
* 函数名称: MC_ClearIOCount
* 函数功能: 清除IO 计数, 可以重新一次处理

* 输入参数: WORD connect_no		

 WORD chan		
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-1
*******************************************************************************/
MC_API DWORD __stdcall  MC_ClearIOCount(WORD connect_no, WORD chan);
/*******************************************************************************
* 函数名称: MC_StartIOCount
* 函数功能: 启动IO计数，需要先配置IO计数功能，然后启动计数

* 输入参数: WORD connect_no		

 WORD chan		
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-2
*******************************************************************************/
MC_API DWORD __stdcall  MC_StartIOCount(WORD connect_no, WORD chan);
/*******************************************************************************
* 函数名称: MC_StopIOCount
* 函数功能: 停止IO计数

* 输入参数: WORD connect_no		

 WORD chan		
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-2
*******************************************************************************/
MC_API DWORD __stdcall  MC_StopIOCount(WORD connect_no, WORD chan);
/*******************************************************************************
* 函数名称: MC_GetIOCountValue
* 函数功能: 获取当前IO的计数值

* 输入参数: WORD connect_no		

 WORD chan		

 DWORD* io_index		

 DWORD* io_count		
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-2
*******************************************************************************/
MC_API DWORD __stdcall  MC_GetIOCountValue(WORD connect_no, WORD chan, DWORD* io_index, DWORD* io_count);

/*******************************************************************************
* 函数名称: MC_SetReuseIoMap，通过IO点数32点
* 函数功能: 复用输入io映射，专用IO可通过虚拟IO映射，复用

* 输入参数: WORD connect_no		

 uint16 io_index		

 uint8 map_io_type		：轴IO的专用信号，或者通用IO
 typedef enum
 {
	 NEL_INDEX		 = 0,//负限位
	 PEL_INDEX		 = 1,//正限位
	 ORG_INDEX		 = 2,//原点
	 INP_INDEX		 = 3,//伺服到位
	 EMG_INDEX		 = 4,//急停信号
	 ALM_INDEX		 = 5,//伺服报警
	 RDY_INDEX		 = 6,//伺服准备
	 SD_INDEX		 = 7,//减速信号
	 NORMAL_IO_TYPE  = 9,//通用IO信号
 } IN_TYPE_INDEX;

 uint32 map_index		: 轴号，或者通用IO点

 double filter_time		
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-2
*******************************************************************************/
MC_API DWORD __stdcall  MC_SetReuseIoMap(WORD connect_no, WORD io_index,WORD map_io_type,DWORD map_index);
/*******************************************************************************
* 函数名称: MC_GetReuseIoMap
* 函数功能: 获取虚拟IO的配置参数

* 输入参数: WORD connect_no		

 uint16 io_index		

 uint8* map_io_type		
 typedef enum
 {
	 NEL_INDEX		 = 0,//负限位
	 PEL_INDEX		 = 1,//正限位
	 ORG_INDEX		 = 2,//原点
	 INP_INDEX		 = 3,//伺服到位
	 EMG_INDEX		 = 4,//急停信号
	 ALM_INDEX		 = 5,//伺服报警
	 RDY_INDEX		 = 6,//伺服准备
	 SD_INDEX		 = 7,//减速信号
	 NORMAL_IO_TYPE  = 9,//通用IO信号
 } IN_TYPE_INDEX;

 uint32* map_index		

 double* filter_time		
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-2
*******************************************************************************/
MC_API DWORD __stdcall  MC_GetReuseIoMap(WORD connect_no, WORD io_index,WORD* map_io_type,DWORD* map_index);

/*******************************************************************************
* 函数名称: MC_GetReuseInIoBit
* 函数功能: 按位获取虚拟IO状态

* 输入参数: WORD connect_no		

 DWORD io_index		

 byte* IoState		
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-2
*******************************************************************************/
MC_API DWORD __stdcall  MC_GetReuseInIoBit(WORD connect_no, DWORD io_index, byte* IoState);



/*********************** 轴控制IO信号 操作部分  ************************/
/*******************************************************************************
* 函数名称: MC_SetAxisOutIo
* 函数功能: 设置轴的专用输出口电平

* 输入参数: WORD connect_no		

 WORD axis		轴号

 WORD axis_io_type		轴IO类型
  typedef enum
  {
	  SERVON_INDEX	  = 0,//伺服使能
	  ERC_INDEX 	  = 1//伺服报警清除
  
  } enum_AXIS_OUT_TYPE_INDEX;

 WORD io_level	输出电频，0表示低电平；1表示高电平	

* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-2
*******************************************************************************/
MC_API DWORD __stdcall  MC_SetAxisOutIo(WORD connect_no,WORD axis,WORD axis_io_type, WORD io_level);
MC_API DWORD __stdcall  MC_GetAxisOutIo(WORD connect_no,WORD axis,WORD axis_io_type, WORD* io_level);

/*******************************************************************************
* 函数名称: MC_SetAxisInIoPrm
* 函数功能: 配置IO口逻辑

* 输入参数: WORD connect_no		

 WORD axis		轴号

 WORD axis_io_type		轴IO类型
  typedef enum
  {
	  NEL_INDEX 	  = 0,//负限位
	  PEL_INDEX 	  = 1,//正限位
	  ORG_INDEX 	  = 2,//原点
	  INP_INDEX 	  = 3,//伺服到位
	  EMG_INDEX 	  = 4,//急停信号
	  ALM_INDEX 	  = 5,//伺服报警
	  RDY_INDEX 	  = 6,//伺服准备
	  SD_INDEX		  = 7,//减速信号
  } AXIS_IO_IN_TYPE_INDEX;



 WORD enable		轴IO是否有效

 WORD io_logical	配置有效电频，0和1	

 WORD stop_mode	 停止模式，触发后的停止处理，0为减速停止，1为立即停止

 filter_time 保留参数，不需要设置
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-2
*******************************************************************************/
MC_API DWORD __stdcall  MC_SetAxisInIoPrm(WORD connect_no,WORD axis,WORD axis_io_type,WORD enable, WORD io_logical, WORD stop_mode);

/*******************************************************************************
* 函数名称: MC_GetAxisInIoPrm
* 函数功能: 获取轴IO配置

* 输入参数: WORD connect_no		

 WORD axis		轴号

 WORD axis_io_type		轴IO类型
  typedef enum
  {
	  NEL_INDEX 	  = 0,//负限位
	  PEL_INDEX 	  = 1,//正限位
	  ORG_INDEX 	  = 2,//原点
	  INP_INDEX 	  = 3,//伺服到位
	  EMG_INDEX 	  = 4,//急停信号
	  ALM_INDEX 	  = 5,//伺服报警
	  RDY_INDEX 	  = 6,//伺服准备
	  SD_INDEX		  = 7,//减速信号
  } AXIS_IO_IN_TYPE_INDEX;



 WORD enable		轴IO是否有效

 WORD io_logical	配置有效电频，0和1	

 WORD stop_mode	 停止模式，触发后的停止处理，0为减速停止，1为立即停止

 filter_time 保留参数，不需要设置		
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-2
*******************************************************************************/
MC_API DWORD __stdcall  MC_GetAxisInIoPrm(WORD connect_no,WORD axis,WORD axis_io_type,WORD* enable, WORD* io_logical, WORD* stop_mode);

/*******************************************************************************
* 函数名称: MC_SetAxisInIoMap
* 函数功能: 轴专用信号映射

* 输入参数: WORD connect_no		

 WORD axis		轴号

 WORD axis_io_type	轴IO类型 比如：限位，原点，减速停止，急停等	
   typedef enum
  {
	  NEL_INDEX 	  = 0,//负限位
	  PEL_INDEX 	  = 1,//正限位
	  ORG_INDEX 	  = 2,//原点
	  INP_INDEX 	  = 3,//伺服到位
	  EMG_INDEX 	  = 4,//急停信号
	  ALM_INDEX 	  = 5,//伺服报警
	  RDY_INDEX 	  = 6,//伺服准备
	  SD_INDEX		  = 7,//减速信号
  } AXIS_IO_IN_TYPE_INDEX;



 WORD map_io_type	映射IO的类型，包括，其它轴的专用信号，通用IO等
 typedef enum
 {
	 NEL_INDEX		 = 0,//负限位
	 PEL_INDEX		 = 1,//正限位
	 ORG_INDEX		 = 2,//原点
	 INP_INDEX		 = 3,//伺服到位
	 EMG_INDEX		 = 4,//急停信号
	 ALM_INDEX		 = 5,//伺服报警
	 RDY_INDEX		 = 6,//伺服准备
	 SD_INDEX		 = 7,//减速信号
	 NORMAL_IO_TYPE  = 9,//通用IO信号
 } IN_TYPE_INDEX;

 WORD map_index		映射的轴号或者通用IO口号，

 double filter_time		滤波时间
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-2
*******************************************************************************/
MC_API DWORD __stdcall  MC_SetAxisInIoMap(WORD connect_no,WORD axis,WORD axis_io_type,WORD map_io_type,DWORD map_index);
/*******************************************************************************
* 函数名称: MC_GetAxisInIoMap
* 函数功能: 获取轴IO映射

* 输入参数: WORD connect_no		

 WORD axis		

 WORD axis_io_type		
  typedef enum
 {
	 NEL_INDEX		 = 0,//负限位
	 PEL_INDEX		 = 1,//正限位
	 ORG_INDEX		 = 2,//原点
	 INP_INDEX		 = 3,//伺服到位
	 EMG_INDEX		 = 4,//急停信号
	 ALM_INDEX		 = 5,//伺服报警
	 RDY_INDEX		 = 6,//伺服准备
	 SD_INDEX		 = 7,//减速信号
 } AXIS_IO_IN_TYPE_INDEX;

 WORD* map_io_type		
 typedef enum
 {
	 NEL_INDEX		 = 0,//负限位
	 PEL_INDEX		 = 1,//正限位
	 ORG_INDEX		 = 2,//原点
	 INP_INDEX		 = 3,//伺服到位
	 EMG_INDEX		 = 4,//急停信号
	 ALM_INDEX		 = 5,//伺服报警
	 RDY_INDEX		 = 6,//伺服准备
	 SD_INDEX		 = 7,//原减速信号
	 NORMAL_IO_TYPE  = 9,//通用IO信号
 } IN_TYPE_INDEX;

 DWORD* map_index		

 double* filter_time		
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-2
*******************************************************************************/
MC_API DWORD __stdcall  MC_GetAxisInIoMap(WORD connect_no, WORD axis,WORD axis_io_type,WORD* map_io_type,DWORD* map_index);

/*************************************************************
说明：读轴所有输入状态
输入：卡链接handle 轴号，当0xFF的时候，表示读取所有的轴，
输出：0-无效， 1- 有效
返回值：错误码
*************************************************************/
MC_API DWORD __stdcall  MC_GetAxisInIoState(WORD connect_no, WORD axis, DWORD* in_io_state);
/*************************************************************
说明：读伺服告警输入状态 
输入：io编号，从1开始
输出：0-无效， 1- 有效
返回值：错误码
*************************************************************/
MC_API DWORD __stdcall  MC_GetAxisAlarmState(WORD connect_no, WORD axis, byte* alarm_state);
/*************************************************************
说明：读原点输入状态
输入： io编号，从0开始
输出：0-无效， 1- 有效
返回值：错误码
*************************************************************/
MC_API DWORD __stdcall  MC_GetAxisHomeState(WORD connect_no, WORD axis, byte* home_state);
/*************************************************************
说明：读限位状态
输入：
输出：0-无效， 1- 有效
返回值：错误码
*************************************************************/
MC_API DWORD __stdcall  MC_GetAxisELState(WORD connect_no, WORD axis, byte* el_minus_state, byte* el_plus_state);
/*************************************************************
说明：读减速信号输入状态
输入： io编号，从0开始
输出：0-无效， 1- 有效
返回值：错误码
*************************************************************/
MC_API DWORD __stdcall  MC_GetAxisSDState(WORD connect_no, WORD axis, byte* sd_state);
/*************************************************************
说明：读到位信号输入状态
输入： io编号，从0开始
输出：0-无效， 1- 有效
返回值：错误码
*************************************************************/
MC_API DWORD __stdcall  MC_GetAxisInpState(WORD connect_no, WORD axis, byte* inp_state);
/*************************************************************
说明：读emg信号输入状态
输入： io编号，从0开始
输出：0-无效， 1- 有效
返回值：错误码
*************************************************************/
MC_API DWORD __stdcall  MC_GetControllerEmgState(WORD connect_no, byte* emg_state);
/*******************************************************************************
* 函数名称: MC_SetAuxEncoderPrm
* 函数功能: 设置辅助编码器计数参数
	
* 输入参数: WORD connect_no		

 WORD channel		辅助编码器通道，从0开始

 WORD mode		
  Pulse_Dir_Mode_Count = 0, //脉冲方向计数
  Pulse_A_B_Mode_Count_1  = 1, //AB相计数，1倍频计数
  Pulse_A_B_Mode_Count_2  = 2, //AB相计数，2倍频计数  
  Pulse_A_B_Mode_Count_4  = 3 //AB相计数，4倍频计数
 
 WORD dir		0： 计数方向不取反 1： 计数方向取反

* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-22
*******************************************************************************/
MC_API DWORD __stdcall  MC_SetAuxEncoderPrm(WORD connect_no, WORD channel, WORD mode, WORD dir);
MC_API DWORD __stdcall  MC_GetAuxEncoderPrm(WORD connect_no, WORD channel, WORD* mode, WORD* dir);

/*******************************************************************************
* 函数名称: MC_AuxEncoder_Set_Positon
* 函数功能: 设置辅助编码器位置

* 输入参数: WORD connect_no		

 WORD channel	：	辅助编码器通道号

 double CmdPos		
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-22
*******************************************************************************/
MC_API DWORD __stdcall  MC_SetAuxEncoderPositon(WORD connect_no, WORD channel, double CmdPos);
/*******************************************************************************
* 函数名称: MC_GetAuxEncoderPositon
* 函数功能: 获取辅助编码器位置

* 输入参数: WORD connect_no		

 WORD channel		

 double* CmdPos		
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-22
*******************************************************************************/
MC_API DWORD __stdcall  MC_GetAuxEncoderPositon(WORD connect_no, WORD channel, double* CmdPos);
/*******************************************************************************
* 函数名称: MC_SetHandleWheelPrm
* 函数功能: 手轮参数配置

* 输入参数: WORD connect_no		

 WORD axis		启动轴的手轮运动，配置轴号

 WORD channel		使用的手轮通道，

 double multi		手轮的计数倍频，大于零为正向计数，小于零为负向计数
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-22
*******************************************************************************/
MC_API DWORD __stdcall  MC_SetHandleWheelPrm(WORD connect_no,WORD axis, WORD channel, double multi);
MC_API DWORD __stdcall  MC_GetHandleWheelPrm(WORD connect_no,WORD axis, WORD* channel, double* multi);
/*******************************************************************************
* 函数名称: MC_StartHandleWheel
* 函数功能: 启动手轮运动, 退出手轮运动为调用停止指令

* 输入参数: WORD connect_no		

 WORD axis		
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-22
*******************************************************************************/
MC_API DWORD __stdcall  MC_StartHandleWheel(WORD connect_no,WORD axis);

#ifdef capture_function
#endif
/*******************************************************************************
* 函数名称: MC_StartCapture
* 函数功能: 

* 输入参数: WORD connect_no		

 WORD cap_object
 typedef enum
 {
	 CAPTURE_HOME    = 0, //原点信号
	 CAPTURE_EZ = 1,//EZ信号
	 CAPTURE_HS_IN = 2,//高速IN0 IN1信号	  	 
	 CAPTURE_GEN_IN = 3//通用IN信号	

 }enum_Capture_Object;


 WORD cap_chan	捕获通道（0, 1），或者通用IO口号  注意：cap_object对象为Home和EZ时，该变量无效

 WORD cap_axis 捕获轴
 WORD cap_io 捕获IO口号，针对CAPTURE_GEN_IN = 3//通用IN信号	

 WORD cap_mode		捕获模式 
 typedef enum
 {
	 CAPTURE_SINGLE    = 0, //单次锁存
	 CAPTURE_CONTINOUS = 1//连续锁存 注意：不支持cap_object对象为Home和EZ时情况
 }enum_Capture_Mode;

 WORD cap_logic		捕获逻辑
 typedef enum
 {
	 CAPTURE_FALLING_EDGE			 = 0, //下降沿捕获
	 CAPTURE_RISING_EDGE			 = 1, //上升沿捕获
	 CAPTURE_DUAL_EDGE				 = 2 //双边沿捕获， 注意：不支持cap_object对象为Home和EZ时情况
 }enum_Capture_Logic_Mode;

 WORD* cap_pos_src	捕获位置源
 typedef enum
 {
 	Cmd_Pos_Src = 0,//指令源
 	Encode_Pos_Src = 1,  //编码器源
 	
 }enum_Pos_Src;
  
 
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-22
*******************************************************************************/
MC_API DWORD __stdcall  MC_StartCapture(WORD connect_no, WORD cap_object,  WORD cap_axis, WORD cap_chan, WORD cap_io, WORD cap_mode, WORD cap_logic, WORD cap_pos_src);
/*******************************************************************************
* 函数名称: MC_GetCapturePrm
* 函数功能: 获取捕获通道的轴配置参数

* 输入参数: WORD connect_no		

 WORD cap_object		

 WORD cap_chan		

 WORD cap_axis		
 WORD* cap_io

 WORD* cap_mode		

 WORD* cap_logic		

 WORD* cap_pos_src		
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-23
*******************************************************************************/
MC_API DWORD __stdcall  MC_GetCapturePrm(WORD connect_no, WORD cap_object, WORD cap_axis, WORD cap_chan ,  WORD* cap_io, WORD* cap_mode, WORD* cap_logic,  WORD* cap_pos_src);
/*******************************************************************************
* 函数名称: MC_GetCaptureCount
* 函数功能: 获取捕获状态，

* 输入参数: WORD connect_no		

 WORD cap_chan		

 DWORD* cap_counts		获取到的捕获点数。
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-23
*******************************************************************************/
MC_API DWORD __stdcall  MC_GetCaptureCount(WORD connect_no, WORD cap_object,WORD cap_axis,WORD cap_chan , DWORD* cap_counts);
/*******************************************************************************
* 函数名称: MC_GetCapturePos
* 函数功能: 获取捕获的位置点

* 输入参数: WORD connect_no		

 WORD cap_chan		

 WORD read_cap_counts		读取的捕获点数

 WORD cap_axis		捕获对应轴
 
 WORD* real_counts   实际读取点数

 double* cap_pos		读取位置数组
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-23
*******************************************************************************/
MC_API DWORD __stdcall  MC_GetCapturePos(WORD connect_no, WORD cap_object,WORD cap_axis, WORD cap_chan ,WORD read_cap_counts,  WORD* real_counts, double* cap_pos);
/*******************************************************************************
* 函数名称: MC_ReStartCapture
* 函数功能: 每调用一次，重启一次捕获

* 输入参数: WORD connect_no		

 WORD cap_chan		
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-23
*******************************************************************************/
MC_API DWORD __stdcall  MC_ReStartCapture(WORD connect_no, WORD cap_object, WORD cap_axis, WORD cap_chan);
/*******************************************************************************
* 函数名称: MC_StopCapture
* 函数功能: 停止捕获功能

* 输入参数: WORD connect_no		

 WORD cap_chan		
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-23
*******************************************************************************/
MC_API DWORD __stdcall  MC_StopCapture(WORD connect_no,WORD cap_object, WORD cap_axis, WORD cap_chan);

#ifdef compare_function
#endif
/*******************************************************************************
* 函数名称: MC_StartHSCmp
* 函数功能: 停止高速比较口功能
*  
*  

* 输入参数: WORD connect_no		
 WORD cmp_dim  比较维数  
 typedef enum
 {
	Compare_1D = 1, //一维比较
	Compare_2D = 2 //二维比较
 }enum_Compare_Dim;
 WORD cmp_chan				高速比较口0~3；对应IO序号index：12~15


* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-25
*******************************************************************************/
MC_API DWORD __stdcall  MC_StopHSCmp(WORD connect_no, WORD cmp_dim, WORD cmp_chan);

/*******************************************************************************
* 函数名称: MC_GetHSCmpPrm
* 函数功能: 

* 输入参数: WORD connect_no		

 WORD cmp_dim  比较维数   ；2维比较时，返回指针长度为2维  
 typedef enum
 {
	Compare_1D = 1, //一维比较
	Compare_2D = 2 //二维比较
 }enum_Compare_Dim;

 WORD cmp_hs_io		高速比较口0~3；对应IO序号index：12~15

 WORD* enable	0表示静止，1表示使能	

 WORD* cmp_mode		比较维数   ；2维比较时，返回指针长度为2维
 //比较输出模式
 typedef enum
 {
	 Less_Compare_Value = 0, //小于比较点模式
	 Equi_Compare_Value = 1, //等于比较点模式
	 Beyond_Compare_Value = 2,//大于比较点模式
	 Linear_Compare_Value = 3,//等增量比较模式
	 FIFO_Compare_Value = 4	  //FIFO点比较输出
 }enum_Compare_Mode;


 WORD* axis		比较轴 比较维数   ；2维比较时，返回指针长度为2维

 WORD* cmp_source		比较维数   ；2维比较时，返回指针长度为2维
 //坐标位置源配置
 typedef enum
 {
	Cmd_Pos_Src = 0,		//指令位置源
	Encode_Pos_Src = 1,  	//编码器位置源
 }enum_Pos_Src; 

 WORD* trigger_mode		
 typedef enum
 {
	 Trigger_IO_Low = 0,//表示低电平
	 Trigger_IO_High = 1,//表示高电平
	 Trigger_IO_Pulse = 3, // 需要输入IO时间
	 Trigger_Axis_Imd_Stop =4,
 
	 Trigger_None = 100//没有触发
 }enum_Compare_Trigger; 
* 返 回 值: 
* 创 建 人: Forest
* 创建时间: 2022-12-25
*******************************************************************************/
MC_API DWORD __stdcall  MC_GetHSCmpPrm(WORD connect_no,WORD cmp_dim, WORD cmp_hs_io, WORD* cmp_mode, WORD* axis, 
											 WORD* cmp_source, WORD* trigger_mode, DWORD* trigger_Data);

/*******************************************************************************
* 函数名称: MC_StartHS1DCmp
* 函数功能: 

* 输入参数: WORD connect_no		

 WORD cmp_hs_io	高速比较口0~3；对应IO序号index：12~15
 WORD cmp_axis  比较轴号
 
 WORD cmp_source			比较位置源
 //坐标位置源配置
 typedef enum
 {
	Cmd_Pos_Src = 0,		//指令位置源
	Encode_Pos_Src = 1,  	//编码器位置源
 }enum_Pos_Src; 

 DWORD cmp_counts		比较位置点数（模式0~2下，该值为固定值1）

 double* cmp_pos		比较位置点数组，（等增量比较模式下，该数组长度为2，第一点位起点位置点；第二点为增量值）
 WORD cmp_mode		
 //比较输出模式
 typedef enum
 {
	 Less_Compare_Value = 0, //小于比较点模式
	 Beyond_Compare_Value = 1,//大于比较点模式
	 Linear_Compare_Value = 2,//等增量比较模式
	 FIFO_Compare_Value = 3   //FIFO点比较输出
 }enum_Compare_Mode;

 WORD trigger_mode		
 typedef enum
 {
	 Trigger_IO_Low = 0,//表示低电平
	 Trigger_IO_High = 1,//表示高电平
	 Trigger_IO_Pulse = 3, // 需要输入IO时间
	 Trigger_Axis_Imd_Stop =4,
 
	 Trigger_None = 100//没有触发
 }enum_Compare_Trigger;

 WORD trigger_prm
 	trigger_mode 为0~3时，对应IO序号index：12~15，
 	trigger_mode 为4时，该参数为轴号；

 double hs_out_time		
* 返 回 值: 
* 创 建 人: Forest
* 创建时间: 2022-10-19
*******************************************************************************/
MC_API DWORD __stdcall  MC_StartHS1DCmp(WORD connect_no, WORD cmp_hs_io, WORD cmp_axis, WORD pos_src,  DWORD cmp_counts, double* cmp_pos,
												WORD cmp_mode, WORD trigger_mode, DWORD trigger_prm, double hs_out_time);

/*******************************************************************************
* 函数名称: MC_GetHSCmpStatus
* 函数功能: 高速一维比较状态

* 输入参数: WORD connect_no		
 WORD cmp_dim  比较维数  
 typedef enum
 {
	Compare_1D = 1, //一维比较
	Compare_2D = 2 //二维比较
 }enum_Compare_Dim;

 WORD cmp_hs_io		高速比较口0~3；对应IO序号index：12~15
 WORD* enable		比较器使能状态 0表示未启用，1表示使能

 double* running_pos		当前比较点的位置信息

 DWORD* completed_points	完成的比较点个数

 DWORD* remained_points		剩余比较点个数
* 返 回 值: 
* 创 建 人: Forest
* 创建时间: 2022-10-19
*******************************************************************************/
MC_API DWORD __stdcall  MC_GetHSCmpStatus(WORD connect_no, WORD cmp_dim, WORD cmp_hs_io, WORD* enable, double* running_pos, DWORD* completed_points, DWORD* remained_points);
/*******************************************************************************
* 函数名称: MC_ClearHSCmp
* 函数功能: 清除比较结果，重新比较一次

* 输入参数: WORD connect_no		
 WORD cmp_dim		
 typedef enum
 {
	Compare_1D = 1, //一维比较
	Compare_2D = 2 //二维比较
 }enum_Compare_Dim;

 WORD cmp_hs_io		高速比较口0~3；对应IO序号index：12~15
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-25
*******************************************************************************/
MC_API DWORD __stdcall  MC_ClearHSCmp(WORD connect_no, WORD cmp_dim,  WORD cmp_hs_io);

/*******************************************************************************
* 函数名称: MC_StopSoftCmp
* 函数功能: 停止比较

* 输入参数: WORD connect_no		

 WORD cmp_dim		
 typedef enum
 {
	Compare_1D = 1, //一维比较
	Compare_2D = 2 //二维比较
 }enum_Compare_Dim;

 WORD cmp_chan 比较通道,	一维软件比较：取值范围(0,3)；二维软件比较：取值范围(0,1)；
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-24
*******************************************************************************/
MC_API DWORD __stdcall  MC_StopSoftCmp(WORD connect_no,WORD cmp_dim, WORD cmp_chan);

/*******************************************************************************
* 函数名称: MC_GetSoftCmpPrm
* 函数功能: 

* 输入参数: WORD connect_no		
 
 WORD cmp_dim  比较维数   ；2维比较时，返回指针长度为2维
 typedef enum
 {
	Compare_1D = 1, //一维比较
	Compare_2D = 2 //二维比较
 }enum_Compare_Dim;

 WORD cmp_hs_io		 

 WORD* enable	0表示静止，1表示使能	

 WORD* cmp_mode		比较维数   ；2维比较时，返回指针长度为2维
 //比较输出模式
 typedef enum
 {
	 Less_Compare_Value = 0, //小于比较点模式
	 Equi_Compare_Value = 1, //等于比较点模式
	 Beyond_Compare_Value = 2,//大于比较点模式
	 Linear_Compare_Value = 3,//等增量比较模式
	 FIFO_Compare_Value = 4	  //FIFO点比较输出
 }enum_Compare_Mode;


 WORD* axis		比较轴 比较维数   ；2维比较时，返回指针长度为2维

 WORD* cmp_source		比较维数   ；2维比较时，返回指针长度为2维
 //坐标位置源配置
 typedef enum
 {
	Cmd_Pos_Src = 0,		//指令位置源
	Encode_Pos_Src = 1,  	//编码器位置源
 }enum_Pos_Src; 

 WORD* trigger_mode		触发模式
 typedef enum
 {
	 Trigger_IO_Low = 0,//表示低电平
	 Trigger_IO_High = 1,//表示高电平
	 Trigger_IO_Pulse = 3, // 需要输入IO时间
	 Trigger_Axis_Imd_Stop =4,
 
	 Trigger_None = 100//没有触发
 }enum_Compare_Trigger; 

  DWORD* trigger_Data  触发参数
* 返 回 值: 
* 创 建 人: Forest
* 创建时间: 2022-12-25
*******************************************************************************/
MC_API DWORD __stdcall  MC_GetSoftCmpPrm(WORD connect_no,WORD cmp_dim, WORD cmp_hs_io, WORD* cmp_mode, WORD* axis, 
											 WORD* cmp_source, WORD* trigger_mode, DWORD* trigger_Data);

/*******************************************************************************
* 函数名称: MC_GetSoftCmpStatus
* 函数功能: 获取软件比较状态信息

* 输入参数: WORD connect_no		

 WORD cmp_dim		
 typedef enum
 {
	Compare_1D = 1, //一维比较
	Compare_2D = 2 //二维比较
 }enum_Compare_Dim;

 WORD cmp_chan		比较通道,	取值范围(0,3)

 WORD* enable		比较器使能状态 0表示未启用，1表示使能

 double* running_pos		当前比较位置点，如果为二位位置比较为两个轴位置

 DWORD* completed_points	已完成比较点数

 DWORD* remained_points		剩余比较点
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-24
*******************************************************************************/
MC_API DWORD __stdcall  MC_GetSoftCmpStatus(WORD connect_no,WORD cmp_dim, WORD cmp_chan, WORD* enable, double* running_pos, DWORD* completed_points, DWORD* remained_points );


/*******************************************************************************
* 函数名称: MC_ClearSoftCmp
* 函数功能: 清除所有配置的比较点

* 输入参数: WORD connect_no		

 WORD cmp_dim		
 typedef enum
 {
	Compare_1D = 1, //一维比较
	Compare_2D = 2 //二维比较
 }enum_Compare_Dim;

 WORD cmp_chan 比较通道,	取值范围(0,3)；
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-24
*******************************************************************************/
MC_API DWORD __stdcall  MC_ClearSoftCmp(WORD connect_no,WORD cmp_dim, WORD cmp_chan);

/*******************************************************************************
* 函数名称: MC_StartSoft1DCmp
* 函数功能: 添加一位比较点

* 输入参数: WORD connect_no		
 WORD cmp_chan 比较通道,	取值范围(0,3)；

 WORD cmp_axis 比较轴号		

 WORD pos_src	设置比较源：0表示指令位置，1表示编码器位置	

 double pos		比较点位置，绝对位置

 WORD cmp_mode		比较模式，0表示小于比较位置，1表示大于等于比较位置
 //比较输出模式
 typedef enum
 {
	 Less_Compare_Value = 0, //小于比较点模式
	 Beyond_Compare_Value = 1,//大于比较点模式
	 Linear_Compare_Value = 2,//等增量比较模式
	 FIFO_Compare_Value = 3   //FIFO点比较输出
 }enum_Compare_Mode;

 WORD trigger_mode		
 typedef enum
 {
	 Trigger_IO_Low = 0,
	 Trigger_IO_High = 1,
	 Trigger_IO_Reverse = 2,
	 Trigger_IO_Pulse = 3, // 需要输入IO时间
	 Trigger_Axis_Imd_Stop =4,
 
	 Trigger_None = 100//没有触发
 }enum_Compare_Trigger;

 WORD trigger_prm
 	trigger_mode 为0~3时，该参数为IO序号；
 	trigger_mode 为4时，该参数为轴序号；


 double out_time	IO输出的时间	
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-24
*******************************************************************************/
MC_API DWORD __stdcall  MC_StartSoft1DCmp(WORD connect_no,WORD cmp_chan, WORD cmp_axis, WORD pos_src,  DWORD cmp_counts, double* cmp_pos,
														WORD cmp_mode, WORD trigger_mode, DWORD trigger_prm, double out_time);
/*******************************************************************************
* 函数名称: MC_StartSoft2DCmp
* 函数功能: 添加2维比较点

* 输入参数: WORD connect_no		

 WORD* axis		

 WORD* pos_src		

 double* pos		

 WORD* cmp_mode		

 WORD trigger_mode		

 WORD trigger_prm		

 double out_time		
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-8-24
*******************************************************************************/
MC_API DWORD __stdcall  MC_StartSoft2DCmp(WORD connect_no, WORD chan, WORD* axis, WORD* pos_src, DWORD cmp_count, double* pos, WORD* cmp_mode, WORD trigger_mode, DWORD trigger_prm, double out_time);

#ifdef handle_pwm_region
#endif

/*******************************************************************************
* 函数名称: MC_StartPwm
* 函数功能: 发送PMW

* 输入参数: WORD connect_no		

 WORD pwm_chan_type		
 typedef enum
 {
	 PWM_Type_5V = 0, //5v PWM 
	 PWM_Type_24V = 1 //24 vPWM
 }enum_PWM_Type;

 WORD pwm_chan		:
 					5v的通道为最后一个脉冲轴
 					24v通道为高速IO口，对应取值范围为[0,3]
 WORD enable		:0表示静止PWM输出，对应24V的IO口切换到通用IO模式下，对应5v的通道切换到轴控制脉冲输出模式
					
 double frequency	：	

 double duty	：取值范围[0 , 1] duty = (高电平时刻 / 脉冲总时刻)	
* 返 回 值: 
* 创 建 人: Forest
* 创建时间: 2022-12-18
*******************************************************************************/
MC_API DWORD __stdcall  MC_StartPwm(WORD connect_no, WORD pwm_chan_type, WORD pwm_chan, WORD enable, double frequency, double duty);

MC_API DWORD __stdcall  MC_GetPwmPrm(WORD connect_no,WORD pwm_chan_type, WORD pwm_chan, WORD* enable, double* frequency, double* duty);


#ifdef simulink_function
#endif

/*******************************************************************************
* 函数名称: MC_SimulinkMotionStartThread
* 函数功能: 通过编程软件执行运动控制，注意用户软件使用线程

* 输入参数: 无
* 返 回 值: 无
* 创 建 人: 
* 创建时间: 2022-6-15
*******************************************************************************/
MC_API DWORD __stdcall MC_SimulinkMotionStartThread(WORD connect_no);
/*******************************************************************************
* 函数名称: MC_SimulinkMotionStartThread
* 函数功能: 通过编程软件执行指令交互，注意用户软件使用线程

* 输入参数: 无
* 返 回 值: 无
* 创 建 人: 
* 创建时间: 2022-6-15
*******************************************************************************/
MC_API DWORD __stdcall MC_SimulinkCommandStartThread(WORD connect_no);

/*******************************************************************************
* 函数名称: MC_SimulinkMotionInit
* 函数功能: 仿真初始化

* 输入参数: 无
* 返 回 值: 无
* 创 建 人: 
* 创建时间: 2022-6-15
*******************************************************************************/
MC_API DWORD __stdcall MC_SimulinkMotionInit(WORD connect_no);

/*******************************************************************************
* 函数名称: MC_SimulinkMotionClose
* 函数功能: 仿真关闭

* 输入参数: 无
* 返 回 值: 无
* 创 建 人: 
* 创建时间: 2022-6-15
*******************************************************************************/
MC_API DWORD __stdcall MC_SimulinkMotionClose(WORD connect_no);

/*******************************************************************************
* 函数名称: MC_TraceAddObjects
* 函数功能: trace 添加采集数据

* 输入参数: WORD connect_no 	

 uint16 data_type		：定义的数据标号

 uint16 axis_or_io_or_pdo_index 	：如果轴相关，则是轴序号，如果是IO，则是IO序号，ethercat的主索引等

 uint16 data_sub_index		：如果是ethercat的对象字典，其为子索引。

 uint16 mac_id		：从站的MAC ID

 uint16 size		：数据的长度，按照byte来计算
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-7-4
*******************************************************************************/
MC_API DWORD __stdcall	MC_TraceAddObjects(WORD connect_no,WORD data_type, WORD axis_or_io_or_pdo_index, WORD data_sub_index, WORD mac_id, WORD size);

/*******************************************************************************
* 函数名称: MC_TraceGetObjects
* 函数功能: 根据添加的采集对象的顺序，可以获取添加对象的内容

* 输入参数: WORD connect_no 	

 uint16 objectIndex 	

 uint16* data_type		

 uint16* axis_or_io_or_pdo_index		

 uint16* data_sub_index 	

 uint16* mac_id 	

 uint16* size		
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-7-4
*******************************************************************************/
MC_API DWORD __stdcall	MC_TraceGetObjects(WORD connect_no, WORD objectIndex ,WORD* data_type, WORD* axis_or_io_or_pdo_index, WORD* data_sub_index, WORD* mac_id, uint16* size);

/*******************************************************************************
* 函数名称: MC_TraceResetObjects
* 函数功能: 清除上次配置的采集对象

* 输入参数: WORD connect_no 	
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-7-4
*******************************************************************************/
MC_API DWORD __stdcall	MC_TraceResetObjects(WORD connect_no);
/*******************************************************************************
* 函数名称: MC_TraceSetTraceConfig
* 函数功能: 数据采集的条件配置

* 输入参数: WORD connect_no 	

 uint16 traceType	: 0 连续追踪， 1：条件触发追踪	

 uint16 sampleCycleFreqs	: 0:无效，N:每隔N-1个周期进行追踪	

 uint16 triggerType 	：触发方式：0 掩码等于，1 大于, 2 小于 

 uint32 conditionMask		: 按位触发时的掩码

 double triggerCondition	： 比较的值

 uint16 overflowHandle		：溢出后的处理：0 :停止采集;  1: 覆盖最后的;

 uint16 triggerIndex	: 比较的对象的下标号

* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-7-4
*******************************************************************************/
MC_API DWORD __stdcall	MC_TraceSetTraceConfig(WORD connect_no,WORD traceType, WORD sampleCycleFreqs, WORD triggerType, WORD conditionMask,
					 double triggerCondition, WORD overflowHandle, WORD triggerIndex);
/*******************************************************************************
* 函数名称: MC_TraceGetTraceConfig
* 函数功能: 获取数据采集的配置条件

* 输入参数: WORD connect_no 	

 uint16* traceType		

 uint16* sampleCycleFreqs		

 uint16* triggerType		

 uint32* conditionMask		

 double* triggerCondition		

 uint16* overflowHandle 	

 uint16* triggerIndex		
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-7-4
*******************************************************************************/
MC_API DWORD __stdcall	MC_TraceGetTraceConfig(WORD connect_no,WORD* traceType, WORD* sampleCycleFreqs, WORD* triggerType, WORD* conditionMask,
					 double* triggerCondition, WORD* overflowHandle, WORD* triggerIndex);
/*******************************************************************************
* 函数名称: MC_TraceGetRunningFlag
* 函数功能: 获取trace运行的标志

* 输入参数: WORD connect_no 	

 uint16* startFlag		

 uint16* overflowFlag		

 uint16* trigerFlag 	
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-7-4
*******************************************************************************/
MC_API DWORD __stdcall	MC_TraceGetRunningFlag(WORD connect_no,WORD* startFlag, WORD* overflowFlag, WORD* trigerFlag);

/*******************************************************************************
* 函数名称: MC_TraceGetRunningInfo
* 函数功能: 当前已采集的数据，及剩余空间

* 输入参数: WORD connect_no 	

 uint32* validInputNum		已存储的数据包个数

 uint32* retainNum		剩余存储空间

 uint32* bytesNumOnePackage 	一包数据的长度

 uint16* totalObjects		总的采集对象数
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-7-4
*******************************************************************************/
MC_API DWORD __stdcall	MC_TraceGetRunningInfo(WORD connect_no,DWORD* validInputNum, DWORD* retainNum, DWORD* bytesNumOnePackage, DWORD* totalObjects);

/*******************************************************************************
* 函数名称: MC_TraceGetPackages
* 函数功能: 读取采集的数据

* 输入参数: WORD connect_no 	

 uint32 readBytes		读取的数据个数，一次最多1024个bytes

 unsigned char * data		数据

 uint32 *realByteSize		实际读取的数据，（整数倍的每包长度）
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-7-4
*******************************************************************************/
MC_API DWORD __stdcall	MC_TraceGetPackages(WORD connect_no,DWORD readBytes, unsigned char * data, DWORD *realByteSize);
/*******************************************************************************
* 函数名称: MC_TraceGetPackages
* 函数功能: 
重新采集数据	
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-7-4
*******************************************************************************/
MC_API DWORD __stdcall	MC_TraceResetRunning(WORD connect_no);
/*******************************************************************************
* 函数名称: MC_TraceStart
* 函数功能: 开始数据采集

* 输入参数: WORD connect_no 	
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-7-4
*******************************************************************************/
MC_API DWORD __stdcall	MC_TraceStart(WORD connect_no);

/*******************************************************************************
* 函数名称: MC_TraceStop
* 函数功能: 停止采集

* 输入参数: WORD connect_no		
* 返 回 值: 
* 创 建 人: 
* 创建时间: 2022-7-4
*******************************************************************************/
MC_API DWORD __stdcall  MC_TraceStop(WORD connect_no);	

#ifdef file_handle 
#endif

/*******************************************************************************
* 函数名称: MC_DownloadFile
* 函数功能: 文件下载函数，包括所有类型的文件；

* 输入参数: WORD connect_no 	

 WORD fileType		文件类型

 char* ptrFileNameDirectory 文件路径+文件名称

* 返 回 值: 
* 创 建 人: Forest
* 创建时间: 2022-12-1
*******************************************************************************/
MC_API DWORD __stdcall MC_DownloadFile(WORD connect_no,  WORD fileType, char* ptrFileNameDirectory);
/*******************************************************************************
* 函数名称: MC_GetUpDownProgressRatio
* 函数功能: 文件或字符串上传下载进度

* 输入参数: WORD connect_no 	

 double* progressRatio		0表示上传下载未开始，1表示上传下载完成
* 返 回 值: 
* 创 建 人: Forest
* 创建时间: 2022-12-2
*******************************************************************************/
MC_API DWORD __stdcall MC_GetUpDownProgressRatio(WORD connect_no,  double* progressRatio);


#ifdef __cplusplus
}
#endif

#endif

