#include "GCMotion.h"

using namespace System;
using namespace System::Windows::Forms;

/*****************************************************************
* Function Name : 指令返回值
* Description   : 返回错误值 rtn
* Date			: 2022年8月3日
* Auther		: LWH
******************************************************************/
short gc_rtn_error(short rtn)
{
	if (rtn != RTN_CMD_SUCCESS) {
		return rtn;		// 指令执行错误
	}
}

/*****************************************************************
* Function Name : 坐标系(插补)运动初始化
* Description   : 略
* Date			: 2022年8月3日
* Auther		: LWH
******************************************************************/
short gc_example(void)
{
	short rtn;					// 指令返回值
	short devNum;				// 设备序号，从0开始
	short axisNum;				// 轴号，从0开始
	HAND devHandle;				// 设备句柄
	HAND axisHandle;			// 轴句柄
	HAND crdHandle;				// 坐标系句柄
	rtn = NMC_DevOpen(devNum, &devHandle);				//打开控制器
	gc_rtn_error(rtn);
	rtn = NMC_MtOpen(devHandle, axisNum, &axisHandle);	//打开轴,并获得轴句柄
	gc_rtn_error(rtn);
	rtn = NMC_MtSetSvOn(axisHandle);					//打开轴使能(根据实际情况使用)
	gc_rtn_error(rtn);

	rtn = NMC_CrdOpen(devHandle, &crdHandle);			//打开坐标系
	gc_rtn_error(rtn);
	TCrdConfig crd;
	crd.axCnts = 3;			// 设置3轴坐标系
	crd.pAxArray[0] = 0;	// 轴端口0对应X轴
	crd.pAxArray[1] = 1;	// 轴端口1对应Y轴
	crd.pAxArray[2] = 2;	// 轴端口2对应Z轴
	crd.pAxArray[3] = -1;	// 轴端口3对应A轴，-1为不使用
	crd.port[0] = 0;		// 端口设为0
	crd.port[1] = 0;		// 端口设为0
	crd.port[2] = 0;		// 端口设为0
	crd.port[3] = 0;		// 端口设为0
	rtn = NMC_CrdConfig(crdHandle, &crd);		//配置坐标系
	gc_rtn_error(rtn);
	TCrdPara crdPara;		
	crdPara.orgFlag = 1;						// 默认原点(0,0,0,0)
	crdPara.offset[0] = 0;						// 坐标原点设为0
	crdPara.offset[1] = 0;						// 坐标原点设为0
	crdPara.offset[2] = 0;						// 坐标原点设为0
	crdPara.offset[3] = 0;						// 坐标原点设为0
	crdPara.synAccMax = 50;				//最大合成加速度p/ms^2,50已经比较大
	crdPara.synVelMax = 800;			//最大合成速度,允许范围内，两个参数尽可能大
	rtn = NMC_CrdSetPara(crdHandle, &crdPara);	// 设置运动参数
	gc_rtn_error(rtn);

	/******************* 以下配置可选 *******************/
	TCrdSafePara crdSafePara;
	crdSafePara.estpDec = 1000;					//急停加速度
	crdSafePara.maxAcc = 50;					//设置坐标系最大加速度50p/ms^2
	crdSafePara.maxVel = 800;					//设置坐标系最大速度800p/ms
	rtn = NMC_CrdSetSafePara(crdHandle, &crdSafePara);//设置安全参数
	gc_rtn_error(rtn);
	/******************* 以上配置可选 *******************/
	
	rtn = NMC_CrdClrError(crdHandle);			//清除坐标系错误状态
	gc_rtn_error(rtn);
	rtn = NMC_CrdBufClr(crdHandle);				//压入指令之前需要清空缓存区
	gc_rtn_error(rtn);
	/**********************************************************************************
	* 以上为坐标系初始化完成，坐标系(插补)运动基本流程：
	* 打开坐标系->初始化坐标系->压入插补指令->启动插补运动->查询坐标系状态->等待运动完成
	************************************************************************************/
	return rtn;
}