#ifndef ROBOT_API_Cplusplus_H_
#define ROBOT_API_Cplusplus_H_

#ifdef _WIN32
#ifdef ROBOTAPI_EXPORTS
#define ROBOTAPI_API __declspec(dllexport)
#else
#define ROBOTAPI_API __declspec(dllimport)
#endif
#else
#define ROBOTAPI_API
#endif
#ifndef _WIN32
#include <pthread.h>
#endif

namespace RobotAPI {
	/*
	*@brief 机器人系统变量类型数
	*/
	const unsigned int VAR_TYPES = 6;
	const double DEFAULT_MAX = 9E9+1;
	const unsigned int MAX_INTERP_DATA_NUM = 5000;	//外部插补控制时每次发送的最大插补点个数
	/*
	*@brief 机器人位置和姿态数据
	*/
	struct RobotPos {
		RobotPos(double _x = DEFAULT_MAX, double _y = DEFAULT_MAX, double _z = DEFAULT_MAX, double _a = DEFAULT_MAX, double _b = DEFAULT_MAX,
			double _c = DEFAULT_MAX, int _cfg = 0, int _turn = 0, int _tf4 = 0, int _tf6 = 0, double _ej1 = DEFAULT_MAX, double _ej2 = DEFAULT_MAX, double _ej3 = DEFAULT_MAX,
			double _ej4 = DEFAULT_MAX, double _ej5 = DEFAULT_MAX, double _ej6 = DEFAULT_MAX):x(_x), y(_y), z(_z), a(_a), b(_b), c(_c), cfg(_cfg),
			turn(_turn), tf4(_tf4), tf6(_tf6), ej1(_ej1), ej2(_ej2), ej3(_ej3), ej4(_ej4), ej5(_ej5), ej6(_ej6) {}
		double x;
		double y;
		double z;
		double a;
		double b;
		double c;
		int cfg;
		int turn;
		double ej1;
		double ej2;
		double ej3;
		double ej4;
		double ej5;
		double ej6;
		int tf4;
		int tf6;
	};

	/*
	*@brief 机器人各轴角度数据
	*/
	struct RobotJoint {
		RobotJoint(){
			for(unsigned int i = 0; i < 12; i++) {
				j[i] = DEFAULT_MAX;
			}
		}
		double j[12];	//6个关节轴和6个外轴
	};

	/*
	*@brief 工具坐标系
	*/
	struct RobotTool {
		RobotTool(double _x = 0, double _y = 0, double _z = 0, double _a = 0, double _b = 0, double _c = 0, bool _stationary = false, char* _mu_name = "WORLD"):
			x(_x),y(_y),z(_z),a(_a),b(_b),c(_c),stationary(_stationary),mu_name(_mu_name) {}
		double x;	//单位mm
		double y;	//单位mm
		double z;	//单位mm
		double a;   //单位度
		double b;	//单位度
		double c;	//单位度
		bool stationary;//是否为固定工具，非固定工具安装于机器人法兰，固定工具相对世界坐标系不动，默认为非固定工具
		char* mu_name;//参考机械单元名称，默认参考世界坐标系
	};

	/*
	*@brief 工件坐标系
	*/
	struct RobotWorkpiece {
		RobotWorkpiece(double _x = 0, double _y = 0, double _z = 0, double _a = 0, double _b = 0, double _c = 0, bool _robhold = false, char* _mu_name = "WORLD"):
			x(_x),y(_y),z(_z),a(_a),b(_b),c(_c),robhold(_robhold),mu_name(_mu_name) {}
		double x;	//单位mm
		double y;	//单位mm
		double z;	//单位mm
		double a;   //单位度
		double b;	//单位度
		double c;	//单位度
		bool robhold;//是否为机器人抓取工件，机器人抓取工件安装于机器人法兰，非机器人抓取工件相对世界坐标系不动，默认为机器人抓取工件
		char* mu_name;//参考机械单元名称，默认为参考世界坐标系
	};

	/*
	*@brief 安全区域数据
	*/
	struct SafetyZoneData{
		SafetyZoneData()
			: index(-1),
			zone_name(NULL),
			comment(NULL),
			wobj_index(0),
			shape_type(0),
			geometry_data(NULL),
			geometry_data_num(0),
			zone_type(0),
			enable(false),
			monitor_joint(false),
			m_di(0),
			m_do(0)
		{}
		int index; // 索引（0-39）
		char* zone_name; // 名称唯一不能重复
		char* comment; // 备注
		int wobj_index; // 工件坐标系序号，个数同pose变量个数，0：世界坐标系，1-3：通道基坐标系，4-3+WOBJ_NUM(工件坐标系个数)：自定义工件坐标系(仅SetPoseVariables使用)
		int shape_type; // 形状类型：立方体0 圆柱体1 球体2
		/*
		设置的时候输入的是示教后的位置数据
		位置数据（坐标单位：mm）
		立方体：
		p1(x1, y1, z1):对顶点1
		p2(x2, y2, z2):对顶点2
		例子: geometry_data{x1, y1, z1, x2, y2, z2}
		圆柱体：
		p1(x1, y1, z1):底面某条直径的端点1
		p2(x2, y2, z2):底面某条直径的另一个端点2
		p3(x3, y3, z3):端点2对应的顶面的点3
		例子: geometry_data{x1, y1, z1, x2, y2, z2, x3, y3, z3}
		球体：
		p1(x1, y1, z1):某条过球心直线与表面相交的点1
		p2(x2, y2, z2):某条过球心直线与表面相交的另外一点2
		例子: geometry_data{x1, y1, z1, x2, y2, z2}

		获取的时候得到的是几何数据
		几何数据（坐标单位：mm）
		立方体：
		p1(x1, y1, z1):对顶点1
		p2(x2, y2, z2):对顶点2
		例子: geometry_data{x1, y1, z1, x2, y2, z2}
		圆柱体：
		c(x1, y1, z1):底面圆心点
		r:底面圆半径
		h:高
		例子: geometry_data{x1, y1, z1, r, h}
		球体：
		c(x1, y1, z1):球心
		r:半径
		例子: geometry_data{x1, y1, z1, r}
		*/
		double* geometry_data;
		int geometry_data_num; // geometry_data个数
		int zone_type; // 区域类型：工作区域0 禁止区域1 信号共享区域2
		bool enable; // 是否使能该区域
		bool monitor_joint; // 是否监控关节包络
		//工作区域和禁止区域 不需要设置m_di 和 m_do
		//多个共享区域不能设置相同的DI DO编号
		int m_di; // 信号共享区域的DI编号，范围 0到（PLC 结束IO逻辑地址 - 起始IO逻辑地址 + 1）
		int m_do; // 信号共享区域的DO编号，范围 0到（PLC 结束DO逻辑地址 - 起始DO逻辑地址 + 1）
	};

	//安全区域工具包络数据
	struct EnvelopData {
		    EnvelopData()
        : group_index(-1),
          index_in_group(-1),
          envelop_name(NULL),
          comment(NULL),
          position_data(NULL),
          position_data_num(0),
          enable(false)
    {}
		int group_index;//工具包络组索引（0-5）（备注：-1：关节包络，未开放）  
		int index_in_group;//每组中的索引（0-5）
		char* envelop_name;//名称
		char* comment;//注释
		double* position_data;//球数据 {x,y,z,r}
		int position_data_num; // 球数据数量,设置时会校验输入的数据数量是否等于4
		bool enable;//是否生效
	};

	/*
	*@brief 机器人控制模式
	*/
	enum RobotMode {
		ROBOT_MODE_MANUAL,	//手动低速模式
		ROBOT_MODE_AUTO,	//自动模式
		ROBOT_MODE_MANUFAST	//手动高速模式
	};

	/*
	*@brief 程序运行状态
	*/
	enum ProgramState{
		PROG_STATE_NOT_LOAD,	//程序未加载
		PROG_STATE_RUNNING,		//运行中
		PROG_STATE_PAUSE,		//暂停
		PROG_STATE_STOP			//停止
	};

	/*
	*@brief JOG模式
	*/
	enum JogMode{
		JOG_SINGLE_AXIS,	//单轴模式
		JOG_CARTESIAN		//笛卡尔模式
	};

	//JOG方向
	enum JogDir {
		DIR_POSITIVE,	//正向
		DIR_NEGATIVE	//负向
	};

	//程序运行模式
	enum ProgramStepMode {
		STEP,		//单步
		CONTINUE,	//连续
		MSTEP		//段调试
	};

	//程序正逆向模式
	enum ProgramDirMode {
		FORWARD,	//正向
		BACKWARD	//逆向
	};

	//仿真模式
	enum UserSimulationMode {
		USER_SIMU_MODE_SIMU,
		USER_SIMU_MODE_REAL
	};

	//轴数据类型
	enum DataType {
		CURRENT_COMMAND = 0,	//当前指令位置
		CURRENT_POS,			//当前实时位置
		CURRENT_SPEED,			//当前速度
		CURRENT_TORQUE,			//当前扭矩
		CURRENT_CURRENT			//当前电流
	};
	//系统变量类型
	enum VarNameType {
		VAR_INT = 0,
		VAR_BOOL,
		VAR_DOUBLE,
		VAR_STRING,
		VAR_POSE,	//$P,$PV1,$PV2,$PV3,$PV4,$PV5,$PV6,$PV7,$PV8,$PV9统一使用此类型，序号从0-9999
		VAR_JOINT
	};

	/*
	*@brief 错误码
	*使用try-catch调用所有API时捕获的异常码，10000以上为第三方库抛出的异常码
	*/
	enum ErrorCode {
		ERROR_OK = 0,
		ERROR_CONNECT_FAILED,		//与机器人连接失败 1
		ERROR_NO_CONNECTION,		//尚未与机器人连接 2
		ERROR_CONNECTION_BROKEN,	//与机器人连接中断 3
		ERROR_ACCESS_REJECTED,		//访问拒绝，机器人设置为不允许API访问 4
		ERROR_CUR_MODE_NOT_SUPPORT,	//当前模式不支持该操作 5
		ERROR_SERVO_ON_FAILED,		//上电失败 6
		ERROR_POWER_OFF_FAILED,		//下电失败 7
		ERROR_SET_MODE_FAILED,		//设置控制模式失败 8
		ERROR_SET_SPEED_RATIO_FAILED,//设置速度倍率失败，请检查设置的倍率值是否有效 9
		ERROR_SWITCH_CHANNEL_FAILED,//切换通道失败，请检查设置的通道号是否有效 10
		ERROR_START_PROGRAM_FAILED,	//启动程序失败，只有在没有告警、已成功加载程序且系统状态处于暂停或停止的情况下才可以启动程序 11
		ERROR_RESET_PROGRAM_FAILED, //复位程序失败，只有系统状态处于暂停或停止时才可以复位程序 12
		ERROR_LOAD_PROGRAM_FAILED,	//加载程序失败，请获取告警列表查看具体失败信息 13
		ERROR_PARA_INVALID,			//输入参数范围有误 14
		ERROR_STILL_RUNNING,		//系统仍处于运行中，无法执行运动指令 15
		ERROR_SET_PARA_FAILED,		//设置变量失败 16
		ERROR_GET_PARA_FAILED,		//查询变量失败 17
		ERROR_MOVE_FAILED,			//控制机器人移动失败 18
		ERROR_ENABLE_API_CONTROL_FAILED,//设置外部API控制失败 19
		ERROR_SWITCH_INTERP_MODE_FAILED,//设置插补模式失败 20
		ERROR_MAX_INTERP_NUM,		//外部插补控制时发送的插补点数超过最大值 21
		ERROR_SEND_PROGRAM_FAILED,    //发送程序失败 22
		ERROR_GET_WELD_PACK_STATUS_FAILED, //获取弧焊包安装状态失败 23
		ERROR_GET_SAFETY_ZONE_LIST_FAILED, //获取安全区域列表失败 24
		ERROR_GET_SAFET_ZONE_FAILED, // 获取安全区域操作失败 25
		ERROR_SET_SAFET_ZONE_FAILED, // 设置安全区域操作失败 26
		ERROR_CAL_PARA_IN_SZ_FAILED, // 示教点要计算参数失败 27
		ERROR_SZ_NAME_SAME,			 // 安全区域名称重复 28
		ERROR_SSZ_DI_DO_NOT_ALLOW_ZERO, //信号共享区域DI/DO编号不允许为0 29
		ERROR_SZ_INDEX_OUT_OF_RANGE, // 安全区域index参数超范围[0, 39]   30
		ERROR_SZ_NAME_IS_NULL,		// 安全区域名称指针为空  31
		ERROR_SZ_COMMENT_IS_NULL,	// 安全区域备注指针为空  32
		ERROR_SZ_GEO_DATA_IS_NULL,  // 安全区域几何数据指针为空  33
		ERROR_SET_SZ_ENABLE_FAILED, // 设置安全区域启动停止失败  34
		ERROR_SET_ENVELOP_FAILED,	// 设置包络失败   35
		ERROR_GET_ENVELOP_FAILED,	// 获取包络失败   36
		ERROR_SET_ENVELOP_ENABLED_FAILED, // 设置包络使能失败   37
		ERROR_ENV_POS_DATA_NUM,		// 包络位置数据大小设置时，必须是4  38
		ERROR_ENV_GROUP_INDEX_OUT_OF_RANGE, // 包络数据中group_index 超范围0-5  39
		ERROR_ENV_INDEX_OUT_OF_RANGE, // 包络数据中 index_in_group 超范围0-5	40
		ERROR_CH_SZ_OPERATION_FAILED, // 对任务通道中安全区域的操作失败		41
		ERROR_CH_SIG_INVALID,	// 对任务通道中安全区域的操作参数无效，必须是 0/1/2		42
		ERROR_GET_FORE_CHL_FAILED, // 获取前台通道数量失败 43
		ERROR_CHANNEL_NUM_INVAILD, // 通道索引不存在 44
		ERROR_CH_SZ_ALREADY_LOAD,	// 该安全区域已经加载 45
		ERROR_CH_SZ_USER_BY_OTHER_MANAGER, // 安全区域被其他通道使用 46
		ERROR_CH_SZ_SHAPE_DATA_ERR,	// 安全区域几何数据错误 47
		ERROR_CH_SZ_CREATE_ERR,	// 安全区域创建失败 48
		ERROR_POINTER_INVALID = 1000,     //指针参数无效
		ERROR_THIRD_PARTY = 10000	//第三方库抛出的异常码起始值
	};

	ROBOTAPI_API extern const unsigned int max_connection_count;    //最大连接数量，默认为100
	ROBOTAPI_API extern unsigned int curr_connection_count;    //现存连接数量，初始值为0

	class ROBOTAPI_API CRobotAPI
	{
	public:
		/*
		*@brief 构造函数，创建机器人连接实例
		*@para index(in):所创建的机器人连接序号,从0开始，最大max_connection_count - 1
		*/
		CRobotAPI(unsigned int index);

		/*
		*@brief 析构函数，删除机器人连接实例，序号无法再使用
		*/
		~CRobotAPI();

		/*
		*@brief 查询当前有控制权，这里只是指主控权，即使没有主控权，也是可以查询状态的，只是不能控制机器人运动
		*/
		bool HasControlPermission();
		/*
		*@brief 初始化并连接机器人
		*@param robot_addr(in):机器人IP地址
		*@return 0:连接成功,非0：错误码
		*/
		int ConnectRobot(char* robot_addr);

		/*
		*@brief 断开机器人连接
		*/
		void DisconnectRobot();

		/*
		*@brief 使能或禁止外部API控制
		*@param enable(in):是否使能
		*@return 0:设置成功,非0：错误码
		*/
		int EnableApiControl(const bool enable);

		/*
		*@brief 设置机器人控制模式
		*@param mode(in):设置的模式
		*@return 0:设置成功,非0：错误码
		*/
		int SetControlMode(const RobotMode mode);

		/*
		*@brief 切换通道,20240812版本之后，不允许从外部api切换至后台通道
		*@param channel_num(in):通道序号，从1开始，依次为前台通道和后台通道
		*@return 0:成功,非0：错误码
		*/
		int SwitchChannel(unsigned int channel_num);

		/*
		*@brief 获取前台通道数量
		*@param channel_num(out):前台通道
		*@return 0:成功,非0：错误码
		*/
		int GetForeChannelNum(unsigned int& channel_num);

		/*
		*@brief 设置单步连续运行模式
		*@param mode(in):运行模式
		*@param channel(in):要操作的程序所在通道号，从1开始，依次是前台通道和后台通道，默认-1表示当前前台通道
		*@return 0:成功,非0：错误码
		*/
		int SetProgStepMode(ProgramStepMode mode, int channel = -1);

		/*
		*@brief 设置程序正逆向运行模式
		*@param mode(in):正逆向模式
		*@return 0:成功,非0：错误码
		*/
		int SetProgDirMode(ProgramDirMode mode, int channel = -1);

		/*
		*@brief 设置程序仿真模式
		*@param mode(in):仿真模式
		*@param channel(in):要操作的程序所在通道号，从1开始，依次是前台通道和后台通道，默认-1表示当前前台通道
		*@return 0：成功， 非0：错误码
		*/
		int SetSimuMode(UserSimulationMode mode);

		/*
		*@brief 机器人上电
		*@return 0:上电成功,非0：错误码
		*/
		int PowerOn();

		/*
		*@brief 机器人下电
		*@return 0:下电成功,非0：错误码
		*/
		int PowerOff();

		/*
		*@brief 清除当前告警，该API不能保证所有告警都能清除，所以清除后需要调用GetAlarmState来查询是否还有报警存在
		*@return 0:成功,非0：错误码
		*/
		int ClearAlarm();

		/*
		*@brief 机器人回零点
		*@param home_index(in):希望移动到的home点序号，范围1-5
		*@param is_block(in):设置接口是否为阻塞接口，TRUE为阻塞接口，FALSE为非阻塞接口，可缺省
		*@return 0:成功,非0：错误码
		*/
		int Move2Home(const unsigned int home_index, bool is_block = false);

		/*
		*@brief 检查是否可以通过直线移动到某些位姿
		*@param start_pos(in):直线运动起点位姿
		*@param target_pos(in):希望移动到的目标位姿数组
		*@param target_pos_size(in):希望移动到的目标位姿数组长度
		*@param tool_index(in):工具坐标系序号，0：法兰坐标系，1-TOOL_NUM（工具坐标系个数）：自定义工具坐标系
		*@param wobj_index(in):工件坐标系序号，0：世界坐标系，1-3：通道基坐标系，4-3+WOBJ_NUM(工件坐标系个数)：自定义工件坐标系
		*@param valid(out):目标点是否可达
		*@param valid_size(in):目标点是否可达数组长度
		*@return 0:成功,非0：错误码
		*/
		int CheckLinePosValid(const RobotPos start_pos, const RobotPos* target_pos, const unsigned int target_pos_size, unsigned int tool_index, unsigned int wobj_index, bool* valid, const unsigned int valid_size);

		/*
		*@brief 检查是否可以通过PTP移动到某些位姿
		*@param target_pos(in):希望移动到的目标位姿数组
		*@param target_pos_size(in):希望移动到的目标位姿数组长度
		*@param tool_index(in):工具坐标系序号，0：法兰坐标系，1-TOOL_NUM（工具坐标系个数）：自定义工具坐标系
		*@param wobj_index(in):工件坐标系序号，0：世界坐标系，1-3：通道基坐标系，4-3+WOBJ_NUM(工件坐标系个数)：自定义工件坐标系
		*@param valid(out):目标点是否可达
		*@param valid_size(in):目标点是否可达数组长度
		*@return 0:成功,非0：错误码
		*/
		int CheckPtpPosValid(const RobotPos* target_pos, const unsigned int target_pos_size, unsigned int tool_index, unsigned int wobj_index, bool* valid, const unsigned int valid_size);

		/*
		*@brief 控制机器人各轴移动到某个角度
		*@param robot_joint(in):希望移动到的目标轴角度
		*@param speed_percent(in):速度百分比，范围0.001-100
		*@param speed_exj(in):外轴速度，单位：度/秒，如果没有外轴，该参数可以缺省
		*@param dura(in):轨迹运行时间，单位：秒，如果不指定，该参数可以缺省
		*@param is_block(in):设置接口是否为阻塞接口，TRUE为阻塞接口，FALSE为非阻塞接口，可缺省
		*@return 0:成功,非0：错误码
		*/
		int Move2Joint(const RobotJoint robot_joint, double speed_percent, double speed_exj = 0, double dura = -1, bool is_block = false);

		/*
		*@brief 控制机器人移动到某个位姿
		*@param robot_pos(in):希望移动到的目标位姿
		*@param tool_index(in):工具坐标系序号，0：法兰坐标系，1-TOOL_NUM（工具坐标系个数）：自定义工具坐标系
		*@param wobj_index(in):工件坐标系序号，0：世界坐标系，1-3：通道基坐标系，4-3+WOBJ_NUM(工件坐标系个数)：自定义工件坐标系
		*@param speed_percent(in):速度百分比，范围0.001-100
		*@param speed_exj(in):外轴速度，单位：度/秒，如果没有外轴，该参数可以缺省
		*@param dura(in):轨迹运行时间，单位：秒，如果不指定，该参数可以缺省
		*@param is_block(in):设置接口是否为阻塞接口，TRUE为阻塞接口，FALSE为非阻塞接口，可缺省
		*@return 0:成功,非0：错误码
		*/
		int Move2Pos(const RobotPos robot_pos, unsigned int tool_index, unsigned int wobj_index, double speed_percent, double speed_exj = 0, double dura = -1, bool is_block = false);

		/*
		*@brief 控制机器人依次移动到若干个位姿
		*@param robot_pos(in):希望移动到的目标位姿数组
		*@param robot_pos_size(in):希望移动到的目标位姿数组长度
		*@param tool_index(in):工具坐标系序号，0：法兰坐标系，1-TOOL_NUM（工具坐标系个数）：自定义工具坐标系
		*@param wobj_index(in):工件坐标系序号，0：世界坐标系，1-3：通道基坐标系，4-3+WOBJ_NUM(工件坐标系个数)：自定义工件坐标系
		*@param speed_percent(in):速度百分比，范围0.001-100
		*@param speed_exj(in):外轴速度，单位：度/秒，如果没有外轴，该参数可以缺省
		*@return 0:成功,非0：错误码
		*/
		int Move2MultiPos(const RobotPos* robot_pos, const unsigned int robot_pos_size, unsigned int tool_index, unsigned int wobj_index, double speed_percent, double speed_exj = 0);

		/*
		*@brief 控制机器人以直线移动到某个位姿
		*@param robot_pos(in):希望移动到的目标位姿
		*@param tool_index(in):工具坐标系序号，0：法兰坐标系，1-TOOL_NUM（工具坐标系个数）：自定义工具坐标系
		*@param wobj_index(in):工件坐标系序号，0：世界坐标系，1-3：通道基坐标系，4-3+WOBJ_NUM(工件坐标系个数)：自定义工件坐标系
		*@param speed_tcp(in): TCP点移动速度，单位：毫米/秒
		*@param speed_ori(in): 工具坐标系姿态转动速度，单位：度/秒
		*@param speed_exj(in):外轴速度，单位：度/秒，如果没有外轴，该参数可以缺省
		*@param dura(in):轨迹运行时间，单位：秒，如果不指定，该参数可以缺省
		*@param is_block(in):设置接口是否为阻塞接口，TRUE为阻塞接口，FALSE为非阻塞接口，可缺省
		*@return 0:成功,非0：错误码
		*/
		int Line2Pos(const RobotPos robot_pos, unsigned int tool_index, unsigned int wobj_index, double speed_tcp, double speed_ori, double speed_exj = 0, double dura = -1, bool is_block = false);

		/*
		*@brief 控制机器人以直线依次移动到若干个位姿
		*@param robot_pos(in):希望移动到的目标位姿数组
		*@param robot_pos_size(in):希望移动到的目标位姿数组长度
		*@param tool_index(in):工具坐标系序号，0：法兰坐标系，1-TOOL_NUM（工具坐标系个数）：自定义工具坐标系
		*@param wobj_index(in):工件坐标系序号，0：世界坐标系，1-3：通道基坐标系，4-3+WOBJ_NUM(工件坐标系个数)：自定义工件坐标系
		*@param speed_tcp(in): TCP点移动速度，单位：毫米/秒
		*@param speed_ori(in): 工具坐标系姿态转动速度，单位：度/秒
		*@param speed_exj(in):外轴速度，单位：度/秒，如果没有外轴，该参数可以缺省
		*@return 0:成功,非0：错误码
		*/
		int Line2MultiPos(const RobotPos* robot_pos, const unsigned int robot_pos_size, unsigned int tool_index, unsigned int wobj_index, double speed_tcp, double speed_ori, double speed_exj = 0);

		/*
		*@brief 控制机器人以圆弧移动到某个位姿
		*@param robot_pos(in):希望移动到的目标位姿
		*@param m(in):辅助点
		*@param CA(in):圆心角，如果用户指定了CA参数，则robot_pos参数只用来和辅助点一起确定圆弧的几何形状，而不是真正的目标点，真正的目标点系统通过用户指定的圆心角自动计算
		*@param tool_index(in):工具坐标系序号，0：法兰坐标系，1-TOOL_NUM（工具坐标系个数）：自定义工具坐标系
		*@param wobj_index(in):工件坐标系序号，0：世界坐标系，1-3：通道基坐标系，4-3+WOBJ_NUM(工件坐标系个数)：自定义工件坐标系
		*@param speed_tcp(in): TCP点移动速度，单位：毫米/秒
		*@param speed_ori(in): 工具坐标系姿态转动速度，单位：度/秒
		*@param speed_exj(in):外轴速度，单位：度/秒，如果没有外轴，该参数可以缺省
		*@param dura(in):轨迹运行时间，单位：秒，如果不指定，该参数可以缺省
		*@param is_block(in):设置接口是否为阻塞接口，TRUE为阻塞接口，FALSE为非阻塞接口，可缺省
		*@return 0:成功,非0：错误码
		*/
		int Circle2Pos(const RobotPos robot_pos, const RobotPos m, double CA, unsigned int tool_index, unsigned int wobj_index, double speed_tcp, double speed_ori, double speed_exj = 0, double dura = -1, bool is_blcok = false);

		/*
		*@brief 控制机器人以门形移动到某个位姿
		*@param robot_pos(in):希望移动到的目标位姿
		*@param a(in): 从起点垂直上升相对距离，单位mm
		*@param b(in): 到达目标点前垂直下降距离，单位mm
		*@param Z(in): Z方向允许到达的最大绝对高度，单位mm
		*@param tool_index(in):工具坐标系序号，0：法兰坐标系，1-TOOL_NUM（工具坐标系个数）：自定义工具坐标系
		*@param wobj_index(in):工件坐标系序号，0：世界坐标系，1-3：通道基坐标系，4-3+WOBJ_NUM(工件坐标系个数)：自定义工件坐标系
		*@param speed_tcp(in): TCP点移动速度，单位：毫米/秒
		*@param speed_ori(in): 工具坐标系姿态转动速度，单位：度/秒
		*@param speed_exj(in):外轴速度，单位：度/秒，如果没有外轴，该参数可以缺省
		*@return 0:成功,非0：错误码
		*/
		int Jump2Pos(const RobotPos robot_pos, double a, double b, double Z, unsigned int tool_index, unsigned int wobj_index, double speed_tcp, double speed_ori, double speed_exj = 0);

		/*
		*@brief 控制机器人停止移动
		*@return 0:成功,非0：错误码
		*/
		int StopMove();

		/*
		*@brief 控制机器人开始JOG运动
		*@param jog_mode(in):JOG模式，单轴模式时控制单个轴运动，笛卡尔模式时控制笛卡尔坐标系下运动
		*@param jog_dir(in):JOG方向
		*@param tool_index(in):工具坐标系序号，0：法兰坐标系，1-TOOL_NUM（工具坐标系个数）：自定义工具坐标系
		*@param wobj_index(in):工件坐标系序号，0：世界坐标系，1-3：通道基坐标系，4-3+WOBJ_NUM(工件坐标系个数)：自定义工件坐标系
		*@param axis_index(in):单轴模式时表示轴序号，例如对于6轴机器人，1-6表示本体轴，7-12表示外轴，笛卡尔模式下，1-6分别对应X/Y/Z/A/B/C方向
		*@param link(in):是否联动，缺省时为false
		*@return 0:成功,非0：错误码
		*/
		int StartJog(JogMode jog_mode, JogDir jog_dir, unsigned int tool_index, unsigned int wobj_index, unsigned int axis_index, bool link = false);

		/*
		*@brief 控制机器人JOG停止
		*@return 0:成功,非0：错误码
		*/
		int StopJog();

		/*
		*@brief 发送插补点数据控制机器人运动
		*@param robot_joints(in):发送的插补点队列
		*@param robot_joints_size(in):插补点队列长度
		*@param error(out):如果返回失败，此参数输出错误子码，1：当前不是外部插补控制模式，2:当前未上电，3:剩余缓冲区长度不足，4:当前有报警，5：当前通道没有有效机械单元
		*@return 0:成功,非0：错误码
		*/
		int SendInterpData(const RobotJoint* robot_joints, const unsigned int robot_joints_size, int& error);

		/*
		*@brief 查询剩余插补点数
		*@param left_num(out):剩余插补点数
		*@return 0:成功,非0：错误码
		*/
		int GetInterpLeftNum(unsigned int& left_num);

		/*
		*@brief 查询插补缓冲区剩余长度
		*@param len(out):剩余缓冲区长度
		*@return 0:成功,非0：错误码
		*/
		int GetInterpBufLen(unsigned int& len);

		/*
		*@brief 使能外部插补控制
		*@param enable(in):是否使能
		*@param error(out):如果返回失败，此参数输出错误子码，1：当前不是外部插补控制模式，2:当前未上电，3：当前运行模式不允许切换插补控制模式，4：当前通道没有有效机械单元
		*@return 0:成功,非0：错误码
		*/
		int EnableInterpControl(bool enable, int& error);

		/*
		*@brief 获取数字量输入
		*@param index(in):DI序号
		*@param value(out):DI值
		*@return 0:成功,非0：错误码
		*/
		int GetDigitalIn(unsigned int index, unsigned int& value);

		/*
		*@brief 获取一组数字量输入
		*@param index(in):DI起始序号
		*@param index(in):DI结束序号
		*@param value(out):DI值
		*@return 0:成功,非0：错误码
		*/
		int GetMultiDigitalIn(unsigned int start_index, unsigned int end_index, unsigned int& value);

		/*
		*@brief 获取数字量输出
		*@param index(in):DO序号
		*@param value(out):DO值
		*@return 0:成功,非0：错误码
		*/
		int GetDigitalOut(unsigned int index, unsigned int& value);

		/*
		*@brief 获取一组数字量输出
		*@param index(in):DO起始序号
		*@param index(in):DO结束序号
		*@param value(out):DO值
		*@return 0:成功,非0：错误码
		*/
		int GetMultiDigitalOut(unsigned int start_index, unsigned int end_index, unsigned int& value);

		/*
		*@brief 设置数字量输出
		*@param index(in):DO序号，
		*@param value(in)：设置的DO值
		*@return 0:成功,非0：错误码
		*/
		int SetDigitalOut(unsigned int index, unsigned int value);

		/*
		*@brief 设置一组数字量输出
		*@param index(in):DO序号，
		*@param index(in):DO起始序号
		*@param index(in):DO结束序号
		*@return 0:成功,非0：错误码
		*/
		int SetMultiDigitalOut(unsigned int start_index, unsigned int end_index, unsigned int value);

		/*
		*@brief 设置速度倍率
		*@param ratio(in):倍率值，范围1-100
		*@return 0:成功,非0：错误码
		*/
		int SetSpeedRatio(unsigned int ratio);

		/*
		*@brief 设置工具坐标系
		*@param tool_index(in):工具坐标系序号，范围0-31
		*@param tool(in):设置的工件坐标系值
		*@return 0:成功,非0：错误码
		*/
		int SetToolCoordinateByIndex(unsigned int tool_index, RobotTool tool);

		/*
		*@brief 设置工具坐标系
		*@param tool_name(in):工具坐标系名称
		*@param tool(in):设置的工件坐标系值
		*@return 0:成功,非0：错误码
		*/
		int SetToolCoordinateByName(char* tool_name, RobotTool tool);

		/*
		*@brief 设置工件坐标系
		*@param workpiece_index(in):工件坐标系序号，范围0 - WOBJ_NUM-1
		*@param workpiece(in):设置的工件坐标系值
		*@return 0:成功,非0：错误码
		*/
		int SetWorkpieceCoordinateByIndex(unsigned int workpiece_index, RobotWorkpiece workpiece);

		/*
		*@brief 设置工件坐标系
		*@param workpiece_name(in):工件坐标系名称
		*@param workpiece(in):设置的工件坐标系值
		*@return 0:成功,非0：错误码
		*/
		int SetWorkpieceCoordinateByName(char* workpiece_name, RobotWorkpiece workpiece);

		/*
		*@brief 设置整型变量
		*@param index(in):变量序号，范围0-999
		*@param value(in):变量值
		*@return 0:成功,非0：错误码
		*/
		int SetIntVariableByIndex(unsigned int index, int value);

		/*
		*@brief 设置整型变量
		*@param name(in):变量名称
		*@param value(in):变量值
		*@return 0:成功,非0：错误码
		*/
		int SetIntVariableByName(char* name, int value);

		/*
		*@brief 设置浮点型变量
		*@param index(in):变量序号，范围0-999
		*@param value(in):变量值
		*@return 0:成功,非0：错误码
		*/
		int SetDoubleVariableByIndex(unsigned int index, double value);

		/*
		*@brief 设置浮点型变量
		*@param name(in):变量名称
		*@param value(in):变量值
		*@return 0:成功,非0：错误码
		*/
		int SetDoubleVariableByName(char* name, double value);

		/*
		*@brief 设置布尔型变量
		*@param index(in):变量序号，范围0-999
		*@param value(in):变量值
		*@return 0:成功,非0：错误码
		*/
		int SetBoolVariableByIndex(unsigned int index, bool value);

		/*
		*@brief 设置布尔型变量
		*@param name(in):变量名称
		*@param value(in):变量值
		*@return 0:成功,非0：错误码
		*/
		int SetBoolVariableByName(char* name, bool value);

		/*
		*@brief 设置字符串型变量
		*@param index(in):变量序号，范围0-999
		*@param value(in):变量值
		*@return 0:成功,非0：错误码
		*/
		int SetStringVariableByIndex(unsigned int index, char* value);

		/*
		*@brief 设置字符串型变量
		*@param name(in):变量名称
		*@param value(in):变量值
		*@return 0:成功,非0：错误码
		*/
		int SetStringVariableByName(char* name, char* value);

		/*
		*@brief 设置位姿变量
		*@param index(in):变量序号，范围0-9999，根据系统配置的变量个数确定
		*@param value(in):变量值
		*@param tool_index(in):此位姿示教时的工具坐标系序号，0：法兰坐标系，1-TOOL_NUM（工具坐标系个数）：自定义工具坐标系，默认值-1表示不设置
		*@param wobj_index(in):此位姿示教时的工件坐标系序号，0：世界坐标系，1-3：通道基坐标系，4-3+WOBJ_NUM(工件坐标系个数)：自定义工件坐标系，默认值-1表示不设置
		*@return 0:成功,非0：错误码
		*/
		int SetPoseVariableByIndex(unsigned int index, RobotPos value, int tool_index = -1, int wobj_index = -1);

		/*
		*@brief 设置位姿变量
		*@param name(in):变量名称
		*@param value(in):变量值
		*@param tool_index(in):此位姿示教时的工具坐标系序号，0：法兰坐标系，1-TOOL_NUM（工具坐标系个数）：自定义工具坐标系，默认值-1表示不设置
		*@param wobj_index(in):此位姿示教时的工件坐标系序号，0：世界坐标系，1-3：通道基坐标系，4-3+WOBJ_NUM(工件坐标系个数)：自定义工件坐标系，默认值-1表示不设置
		*@return 0:成功,非0：错误码
		*/
		int SetPoseVariableByName(char* name, RobotPos value, int tool_index = -1, int wobj_index = -1);

		/*
		*@brief 设置关节变量
		*@param index(in):变量序号，范围0-999
		*@param value(in):变量值
		*@return 0:成功,非0：错误码
		*/
		int SetJointVariableByIndex(unsigned int index, RobotJoint value);

		/*
		*@brief 设置关节变量
		*@param name(in):变量名称
		*@param value(in):变量值
		*@return 0:成功,非0：错误码
		*/
		int SetJointVariableByName(char* name, RobotJoint value);

		/*
		*@brief 设置变量名称
		*@param type(in)：变量类型
		*@param index(in)：变量序号
		*@param name(in):变量名称
		*@return 0:成功,非0：错误码
		*/
		int SetVariableName(VarNameType type, unsigned int index, char* name);

		/*
		*@brief 设置工具和工件坐标系
		*@param tool_index(in):工具坐标系序号，0：法兰坐标系，1-TOOL_NUM（工具坐标系个数）：自定义工具坐标系
		*@param wobj_index(in):工件坐标系序号，0：世界坐标系，1-3：通道基坐标系，4-3+WOBJ_NUM(工件坐标系个数)：自定义工件坐标系
		*@return 0:成功,非0：错误码
		*/
		int SetCurCoordinate(unsigned int tool_index, unsigned int wobj_index);

		/*
		*@brief 获取机器人当前控制模式
		*@param mode(out):当前模式
		*@return 0:获取成功,非0：错误码
		*/
		int GetControlMode(RobotMode& mode);

		/*
		*@brief 查询当前运行状态
		*@param state(out):当前运行状态
		*@return 0:查询成功,非0：错误码
		*/
		int GetProgramState(ProgramState& state);

		/*
		*@brief 获取当前速度倍率
		*@param ratio(out):当前倍率值
		*@return 0:成功,非0：错误码
		*/
		int GetSpeedRatio(unsigned int& ratio);

		/*
		*@brief //获取指定通道已加载程序路径，从1开始依次是前台通道和后台通道，默认-1表示当前通道
		*@param file_path(out):指定通道已加载程序路径
		*@return 0:成功,非0：错误码
		*/
		int GetLoadedProg(char* file_path, int channel = -1);

		/*
		*@brief 查询机器人当前是否已经上电
		*@param is_poweron(out):是否上电
		*@return 0:查询成功,非0：错误码
		*/
		int IsPowerOn(bool& is_poweron);

		/*
		*@brief 查询当前是否处于连接状态
		*@return 是否处于连接状态
		*/
		bool IsConnected();

		/*
		*@brief 获取机器人当前位姿
		*@param robot_pos(out):当前位姿
		*@return 0:获取成功,非0：错误码
		*/
		int GetPos(RobotPos& robot_pos);

		/*
		*@brief 获取机器人当前各轴角度
		*@param robot_joint(out):当前各轴角度，单位：度
		*@return 0:获取成功,非0：错误码
		*/
		int GetJoint(RobotJoint& robot_joint);

		/*
		*@brief 查询当前是否处于告警状态
		*@param state(out):当前是否告警
		*@return 0:查询成功,非0：错误码
		*/
		int GetAlarmState(bool& state);

		/*
		*@brief 获取当前系统告警列表
		*@param list(out):告警列表
		*@param list_size(in):告警列表长度，最大500，建议传入不大于500的数值
		*@return 0:查询成功,非0：错误码
		*/
		int GetAlarmList(unsigned int* list, const unsigned int list_size);

		/*
		*@brief 获取各异常轴的驱动器报警码子码列表
		*@param alarm(out):各异常轴的驱动器报警码子码序号列表，轴序号从1开始
		*@param alarm_size(in):最大异常轴数量MAX_SLAVE_SERVO_NUM，目前值为48，建议传入不大于48的数值
		*@return 0:查询成功,非0：错误码
		*/
		int GetAxisAlarm(int* alarm, const unsigned int alarm_size);

		/*
		*@brief 获取当前各轴数据
		*@param data_type(in):数据类型
		*@param axis_index(in):轴号,从1开始
		*@param data(out):返回数据
		*@return 0:查询成功,非0：错误码
		*/
		int GetAxisData(DataType data_type, unsigned int axis_index, double& data);

		/*
		*@brief 获取所有轴的速度
		*@param speeds(out):速度数组
		*@axis_num(in):需要获取的轴数量，不大于12
		*@return 0:获取成功,非0：错误码
		*/
		int GetAllAxisSpeeds(double* speeds, int axis_num);

		/*
		*@brief 获取当前机器人累计运行时间
		*@param time(out):累计运行时间
		*@return 0:查询成功,非0：错误码
		*/
		int GetRobotRunTime(double& time);

		/*
		*@brief 获取工具坐标系
		*@param tool_index(in):工具坐标系序号，范围0-31
		*@param tool(out):获取的工件坐标系值
		*@return 0:成功,非0：错误码
		*/
		int GetToolCoordinateByIndex(unsigned int tool_index, RobotTool& tool);

		/*
		*@brief 获取全部工具坐标系名称及值
		*@param tool_names(out):0-31所有工具坐标系名称
		*@param tools(out):0-31所有工具坐标系值
		*@return 0:成功,非0：错误码
		*/
		int GetAllToolCoordinateNameAndValue(char* tool_names[], RobotTool* tools);

		/*
		*@brief 获取当前DH参数
		*@param dh_index(out):dh_index
		*@param dh_parameter(out):对应dh_index的dh_parameter
		*@return 0:成功,非0：错误码
		*/
		int GetDH(int& dh_index,double dh_parameter[6][5]);
		/*
		*@brief 获取工具坐标系
		*@param tool_name(in):工具坐标系名称
		*@param tool(out):获取的工件坐标系值
		*@return 0:成功,非0：错误码
		*/
		int GetToolCoordinateByName(char* tool_name, RobotTool& tool);

		/*
		*@brief 获取工件坐标系
		*@param workpiece_index(in):工件坐标系序号，范围0-99
		*@param workpiece(out):获取的工件坐标系值
		*@return 0:成功,非0：错误码
		*/
		int GetWorkpieceCoordinateByIndex(unsigned int workpiece_index, RobotWorkpiece& workpiece);

		/*
		*@brief 获取工件坐标系
		*@param workpiece_name(in):工件坐标系名称
		*@param workpiece(out):获取的工件坐标系值
		*@return 0:成功,非0：错误码
		*/
		int GetWorkpieceCoordinateByName(char* workpiece_name, RobotWorkpiece& workpiece);

		/*
		*@brief 查询整型变量值
		*@param index(in):变量序号，范围0-999
		*@param value(out):变量值
		*@return 0:成功,非0：错误码
		*/
		int GetIntVariableByIndex(unsigned int index, int& value);

		/*
		*@brief 查询整型变量值
		*@param name(in):变量名称
		*@param value(out):变量值
		*@return 0:成功,非0：错误码
		*/
		int GetIntVariableByName(char* name, int& value);

		/*
		*@brief 查询浮点型变量
		*@param index(in):变量序号，范围0-999
		*@param value(out):变量值
		*@return 0:成功,非0：错误码
		*/
		int GetDoubleVariableByIndex(unsigned int index, double& value);

		/*
		*@brief 查询浮点型变量
		*@param name(in):变量名称
		*@param value(out):变量值
		*@return 0:成功,非0：错误码
		*/
		int GetDoubleVariableByName(char* name, double& value);

		/*
		*@brief 查询布尔型变量
		*@param index(in):变量序号，范围0-999
		*@param value(out):变量值
		*@return 0:成功,非0：错误码
		*/
		int GetBoolVariableByIndex(unsigned int index, bool& value);

		/*
		*@brief 查询布尔型变量
		*@param name(in):变量名称
		*@param value(out):变量值
		*@return 0:成功,非0：错误码
		*/
		int GetBoolVariableByName(char* name, bool& value);

		/*
		*@brief 查询字符串型变量
		*@param index(in):变量序号，范围0-999
		*@param value(out):变量值
		*@return 0:成功,非0：错误码
		*/
		int GetStringVariableByIndex(unsigned int index, char* value);

		/*
		*@brief 查询字符串型变量
		*@param name(in):变量名称
		*@param value(out):变量值
		*@return 0:成功,非0：错误码
		*/
		int GetStringVariableByName(char* name, char* value);

		/*
		*@brief 查询位姿变量
		*@param index(in):变量序号，范围0-9999，根据系统配置的变量个数确定
		*@param value(out):变量值
		*@param tool_index(out):此位姿示教时的工具坐标系序号，0：法兰坐标系，1-TOOL_NUM（工具坐标系个数）：自定义工具坐标系，默认值-1表示不设置
		*@param wobj_index(out):此位姿示教时的工件坐标系序号，0：世界坐标系，1-3：通道基坐标系，4-3+WOBJ_NUM(工件坐标系个数)：自定义工件坐标系，默认值-1表示不设置
		*@return 0:成功,非0：错误码
		*/
		int GetPoseVariableByIndex(unsigned int index, RobotPos& value, int& tool_index, int& wobj_index);

		/*
		*@brief 查询位姿变量
		*@param name(in):变量名称
		*@param value(out):变量值
		*@param tool_index(out):此位姿示教时的工具坐标系序号，0：法兰坐标系，1-TOOL_NUM（工具坐标系个数）：自定义工具坐标系，默认值-1表示不设置
		*@param wobj_index(out):此位姿示教时的工件坐标系序号，0：世界坐标系，1-3：通道基坐标系，4-3+WOBJ_NUM(工件坐标系个数)：自定义工件坐标系，默认值-1表示不设置
		*@return 0:成功,非0：错误码
		*/
		int GetPoseVariableByName(char* name, RobotPos& value, int& tool_index, int& wobj_index);

		/*
		*@brief 查询关节变量
		*@param index(in):变量序号，范围0-999
		*@param value(out):变量值
		*@return 0:成功,非0：错误码
		*/
		int GetJointVariableByIndex(unsigned int index, RobotJoint& value);

		/*
		*@brief 查询关节变量
		*@param name(in):变量名称
		*@param value(out):变量值
		*@return 0:成功,非0：错误码
		*/
		int GetJointVariableByName(char* name, RobotJoint& value);

		/*
		*@brief 查询当前设置的工具和工件坐标系
		*@param tool_index(out):工具坐标系序号，0：法兰坐标系，1-TOOL_NUM（工具坐标系个数）：自定义工具坐标系
		*@param wobj_index(out):工件坐标系序号，0：世界坐标系，1-3：通道基坐标系，4-3+WOBJ_NUM(工件坐标系个数)：自定义工件坐标系
		*@return 0:成功,非0：错误码
		*/
		int GetCurCoordinate(unsigned int& tool_index, unsigned int& wobj_index);

		/*
		*@brief 查询当前通道机械单元型号
		*@param index(in):机械单元索引
		*@param num(out):机械单元数量
		*@param value(out):机械单元型号
		*@return 0:成功,非0：错误码
		*/
		int GetMechUnitModel(unsigned int index, unsigned int& num, char* value);

		/*
		*@brief 发送ARL程序
		*@param file_path(in):本地ARL程序文件完整路径名或文件名，如果为路径名，则整个目录都会发送
		*@return 0:成功,非0：错误码
		*/
		int SendProgram(char* file_path);

		/*
		*@brief 加载程序，只有在没有告警、且系统状态处于暂停或停止的情况下才可以加载程序
		*@param file_path(in):要加载的程序路径和文件名
		*@param channel(in):要操作的程序所在通道号，从1开始，依次是前台通道和后台通道，默认-1表示当前前台通道
		*@return 0:成功,非0：错误码
		*/
		int LoadProgram(char* file_path, int channel = -1);

		/*
		*@brief 启动程序，只有在没有告警、且系统状态处于暂停或停止的情况下才可以启动程序
		*@param channel(in):要操作的程序所在通道号，从1开始，依次是前台通道和后台通道，默认-1表示当前前台通道
		*@return 0:成功,非0：错误码
		*/
		int StartProgram(int channel = -1);

		/*
		*@brief 暂停程序
		*@param channel(in):要操作的程序所在通道号，从1开始，依次是前台通道和后台通道，默认-1表示当前前台通道
		*@return 0:成功,非0：错误码
		*/
		int PauseProgram(int channel = -1);

		/*
		*@brief 复位程序，只有系统状态处于暂停或停止时才可以复位程序
		*@param channel(in):要操作的程序所在通道号，从1开始，依次是前台通道和后台通道，默认-1表示当前前台通道
		*@return 0:成功,非0：错误码
		*/
		int ResetProgram(int channel = -1);

		/*
		*@brief 机器人位姿、关节角度正解接口
		*@return 0:成功,非0：错误码
		*/
		int FkSolver(RobotJoint joint, unsigned int tool_index, unsigned int wobj_index, RobotPos& pos);

		/*
		*@brief 机器人位姿、关节角度逆解接口
		*@return 0:成功,非0：错误码
		*/
		int IkSolver(RobotPos pos, unsigned int tool_index, unsigned int wobj_index, RobotJoint& joint);
		/*
		*@brief 批量设置系统变量&批量获取系统变量
		*@param start_index(in):系统变量起始索引(包含)
		*@param start_index(in):系统变量终止索引(包含)
		*@param _val(in):系统变量值向量
		*@param tool_index(in):工具坐标系序号向量，个数同pose变量个数，0：法兰坐标系，1-TOOL_NUM（工具坐标系个数）：自定义工具坐标系(仅SetPoseVariables使用)
		*@param wobj_index(in):工件坐标系序号向量，个数同pose变量个数，0：世界坐标系，1-3：通道基坐标系，4-3+WOBJ_NUM(工件坐标系个数)：自定义工件坐标系(仅SetPoseVariables使用)
		*@return 0:成功,非0：错误码
		*/
		int SetIntVariables(unsigned int start_index, unsigned int end_index, int* i_val);
		int SetDoubleVariables(unsigned int start_index, unsigned int end_index, double* d_val);
		int SetBoolVariables(unsigned int start_index, unsigned int end_index, bool* b_val);
		int SetStringVariables(unsigned int start_index, unsigned int end_index, char* s_val[]);
		int SetJointVariables(unsigned int start_index, unsigned int end_index, RobotJoint* j_val);
		int SetPoseVariables(unsigned int start_index, unsigned int end_index, RobotPos* p_val, int* tool_index, int* wobj_index);

		int GetIntVariables(unsigned int start_index, unsigned int end_index, int* i_val);
		int GetDoubleVariables(unsigned int start_index, unsigned int end_index, double* d_val);
		int GetBoolVariables(unsigned int start_index, unsigned int end_index, bool* b_val);
		int GetStringVariables(unsigned int start_index, unsigned int end_index, char* s_val[]);
		int GetJointVariables(unsigned int start_index, unsigned int end_index, RobotJoint* j_val);
		int GetPoseVariables(unsigned int start_index, unsigned int end_index, RobotPos* p_val);
		//函数内部要求value的size不小于200
		int GetParaValueCommon(const char* para_path, char* value);
		int SetParaValueCommon(const char* para_path, char* value, unsigned int length);
		// 获取弧焊包的安装状态，如果安装的话，PLC从站是否配置
		int GetWeldPackAndPLCStatus(bool& weld_status, bool& plc_status);
		/*
		*@brief 设置索引的安全区域
		*@param zone_index(in):安全区域索引 (1-40)
		*@param data(in):安全区域数据
		*@return 0:成功,非0：错误码
		*/
		int SetSafetyZone(int zone_index, const SafetyZoneData& data);
		/*
		*@brief 获取索引的安全区域
		*@param zone_index(in):安全区域索引 (1-40)
		*@param data(out):安全区域数据
		*@return 0:成功,非0：错误码
		*/
		int GetSafetyZone(int zone_index, SafetyZoneData& data);
		/*
		*@brief 启停安全区域
		*@param zone_indices(in):安全区域索引数组
		*@param enabled: true: 启动 false:停止
		*@param count: 启停安全区域的数量
		*@return 0:成功,非0：错误码
		*/
		int SetSafetyZonesEnabled(int* zone_indices, int count, bool enabled);
		/*
		*@brief 设置包络数据
		*@param group_index(in): 工具包络组索引（0-5）（备注：同 EnvelopData::group_index）  
		*@param index(in): 包络组中包络的索引（0-5）（备注：同 EnvelopData::index_in_group）  
		*@param EnvelopData(in):包络数据
		*@return 0:成功,非0：错误码
		*/
		int SetEnvelop(int group_index, int index, const EnvelopData& data);
		/*
		*@brief 获取包络数据
		*@param group_index(in): 工具包络组索引（0-5）（备注：同 EnvelopData::group_index）  
		*@param index(in): 包络组中包络的索引（0-5）（备注：同 EnvelopData::index_in_group）  
		*@param EnvelopData(out):包络数据
		*@return 0:成功,非0：错误码
		*/
		int GetEnvelop(int group_index, int index, EnvelopData& data);
		/*
		*@brief 设置包络数据是否生效
		*@param group_index(in): 工具包络组索引（0-5）
		*@param indices(in): 包络组中包络的索引数组
		*@param index_count(in): 包络组中包络的索引数量
		*@param enabled(in):是否生效
		*@return 0:成功,非0：错误码
		*/
		int SetEnvelopEnabled(int group_index, int* indices, int index_count, bool enabled);

		/*
		*@brief 针对任务通道中安全区域的操作
		*@param channel_index(in):机器人通道索引，从0开始
		*@param safety_zone_indics(in):安全区域索引列表
		*@param index_count(in):安全区域索引数量
		*@param err_index(out):增加/删除失败的安全区域索引
		*@param sig(in):操作信号
		0：获取当前通道channel_index的所有安全区域的列表  
		1：在当前通道channel_index中增加安全区域
		2：在当前通道channel_index中删除安全区域
		*@return 0:成功,非0：错误码
		*/
		int ChannelSafetyZoneOperation(int channel_index, int* safety_zone_indics, int& index_count, int& err_index,int sig);
	private:
#ifdef _WIN32
		void* m_mutex;
#else
		pthread_mutex_t m_mutex;
#endif
		void Lock();
		void Unlock();
		unsigned int m_robot_index;
		char* m_server_addr;
		bool m_connected;
		unsigned int m_wobj_num;  //自定义工件坐标系个数，可取值32-200，默认200
	};
}
#endif