#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;			// 轴句柄
	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);

	short axisSts;		// 轴的状态
	long axisPos;		// 电机的理论值位置
	long encPos;		// 电机的实际位置
	double axisVel;		// 轴的规划速度
	while (true)
	{
		rtn = NMC_MtGetSts(axisHandle, &axisSts);	//读取单轴的状态标志
		gc_rtn_error(rtn);
		//包括是否正在运动、是否限位触发报警,是否限位等，请参考头文件对应位定义
		if ((axisSts & BIT_AXIS_BUSY) != 0){    }	// 轴正在运动
		if ((axisSts & BIT_AXIS_ALM) != 0) {	}	// 伺服报警触发
		if ((axisSts & BIT_AXIS_LMTP) != 0){	}	// 正向限位触发
		
		//取 bit0,0 静止,1 运动
		bool IsRuning = (axisSts & (1 << 0)) == 0 ? false : true;
		//取 bit1,位置到达,0,未到达,1 到达
		bool IsArrive = (axisSts & (1 << 1)) == 0 ? false : true;
		//取 bit2,运动是否出错,0,未出错,1,出错
		bool IsError = (axisSts & (1 << 2)) == 0 ? false : true;
		//取 bit3,是否使能中
		bool IsAxisOn = (axisSts & (1 << 3)) == 0 ? false : true;
		//取 bit6,正向限位是否触发
		bool PosArrived = (axisSts & (1 << 6)) == 0 ? false : true;
		//取 bit7,负向限位是否触发
		bool NegArrived = (axisSts & (1 << 7)) == 0 ? false : true;
		//取 bit8,正向软限位是否触发
		bool PosSoftArrived = (axisSts & (1 << 8)) == 0 ? false : true;
		//取 bit9,负向软限位是否触发
		rtn = NMC_MtGetAxisPos(axisHandle, &axisPos);	// 读取电机当前的理论位置
		gc_rtn_error(rtn);
		rtn = NMC_MtGetEncPos(axisHandle, &encPos);		// 读取电机当前的实际位置
		gc_rtn_error(rtn);
		rtn = NMC_MtGetPrfVel(axisHandle, &axisVel);	// 读取当前规划的速度
		gc_rtn_error(rtn);
	}
	return rtn;
}