#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 : 单轴点到点PTP运动例程
* 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_MtSetPrfMode(axisHandle, MT_PTP_PRF_MODE);// 模式配置：将指定轴配置为点到点的运动模式
	gc_rtn_error(rtn);
	TPtpPara ptpPrm;
	ptpPrm.acc = 0.5;								//加速度
	ptpPrm.dec = 0.5;								//减加速度
	ptpPrm.endVel = 0;								//结束速度
	ptpPrm.startVel = 0;							//起跳速度
	ptpPrm.smoothCoef = 0;							//平滑系数
	rtn = NMC_MtSetPtpPara(axisHandle, &ptpPrm);	// 运动参数配置
	gc_rtn_error(rtn);
	double maxVel = 1;
	rtn = NMC_MtSetVel(axisHandle, maxVel);			// 设置规划的最高速度
	gc_rtn_error(rtn);
	long targetPos = 10000;
	rtn = NMC_MtSetPtpTgtPos(axisHandle, targetPos);// 设置目标位置
	gc_rtn_error(rtn);
	rtn = NMC_MtUpdate(axisHandle);	// 启动运动
	gc_rtn_error(rtn);
	/********** 运动过程控制 ************/
	short axisSts;
	long axisPos;
	while (true)
	{
		rtn = NMC_MtGetSts(axisHandle, &axisSts);	//获取轴状态标志位
		gc_rtn_error(rtn);
		if ((axisSts & BIT_AXIS_BUSY) == 0)
		{
			break;	// 运动完成
		}
		rtn = NMC_MtGetAxisPos(axisHandle, &axisPos);// 读取电机当前的理论位置
		gc_rtn_error(rtn);
		if (axisPos > 2000)							 // 位置大于2000时，更新速度
		{
			maxVel = 5;
			rtn = NMC_MtSetVel(axisHandle, maxVel);
			gc_rtn_error(rtn);
			rtn = NMC_MtUpdate(axisHandle);// 更新速度
			gc_rtn_error(rtn);
		}
	}
	return rtn;
}