#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 : 单轴速度连续运动模式JOG运动例程
* 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_JOG_PRF_MODE);// 模式配置：将指定轴配置为JOG模式
	gc_rtn_error(rtn);
	TJogPara jogPrm;
	jogPrm.acc = 0.5;		//加速度
	jogPrm.dec = 0.5;		//减加速度
	jogPrm.smoothCoef = 0;	//平滑系数
	rtn = NMC_MtSetJogPara(axisHandle, &jogPrm);	// 运动参数配置
	gc_rtn_error(rtn);
	double maxVel = 5;
	rtn = NMC_MtSetVel(axisHandle, maxVel);// 设置规划的最高速度
	gc_rtn_error(rtn);

	rtn = NMC_MtUpdate(axisHandle);// 启动运动
	gc_rtn_error(rtn);
	/*** 运动过程控制 ***/
	short velUpdateFlag = 0;
	long axisPos;
	while (true)
	{
		rtn = NMC_MtGetAxisPos(axisHandle, &axisPos);	// 读取电机当前的理论位置
		gc_rtn_error(rtn);
		if ((axisPos > 10000) && (velUpdateFlag == 0)) // 位置大于10000时，更新速度
		{
			velUpdateFlag = 1;
			maxVel = 1;
			rtn = NMC_MtSetVel(axisHandle, maxVel);		// 设置规划的最高速度
			gc_rtn_error(rtn);
			rtn = NMC_MtUpdate(axisHandle);				// 更新速度
			gc_rtn_error(rtn);
		}
		if (axisPos > 20000)							// 位置大于20000时，停止运动
		{
			rtn = NMC_MtStop(axisHandle);				// 停止运动
			gc_rtn_error(rtn);
			break;
		}
	}
	/****** JOG运动用一条指令完成 ******/
	/*double acc = 0.5;
	double dec = 0.5;
	maxVel = 5;
	short smoothCoef = 0;
	short clrStsFlag = 0;
	rtn = NMC_MtMoveJog(axisHandle, acc, dec, maxVel, smoothCoef, clrStsFlag);
	gc_rtn_error(rtn);*/
	/*** 运动过程控制 省略 ***/
	return rtn;
}