#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) {
		MessageBox::Show(Convert::ToString(rtn));
		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);
	
	short axsiSts = 0;
	rtn = NMC_MtGetSts(axisHandle, &axsiSts);		//获取轴状态
	gc_rtn_error(rtn);
	bool IsRuning = (axsiSts & (1 << 0)) == 0 ? false : true;	//取bit0,0静止,1运动
	bool IsArrive = (axsiSts & (1 << 1)) == 0 ? false : true;	//取bit1,位置到达,0,未到达,1到达
	bool IsError = (axsiSts & (1 << 2)) == 0 ? false : true;	//取bit2,运动是否出错,0,未出错,1,出错
	bool IsAxisOn = (axsiSts & (1 << 3)) == 0 ? false : true;	//取bit3,是否使能中
	bool PosArrived = (axsiSts & (1 << 6)) == 0 ? false : true;	//取bit6,正向限位是否触发
	bool NegArrived = (axsiSts & (1 << 7)) == 0 ? false : true;	//取bit7,负向限位是否触发
	bool PosSoftArrived = (axsiSts & (1 << 8)) == 0 ? false : true;//取bit8,正向软限位是否触发
	bool NegSoftArrived = (axsiSts & (1 << 9)) == 0 ? false : true;//取bit9,负向软限位是否触发
	bool IsAlarming = (axsiSts & (1 << 10)) == 0 ? false : true;	//取bit10,驱动器是否报警
	bool IsPosErr = (axsiSts & (1 << 11)) == 0 ? false : true;		//取bit11,位置是否超过误差极限
	rtn = NMC_MtClrError(axisHandle); // 轴运动之前，或者轴报错,调用清除轴状态的指令
	gc_rtn_error(rtn);

	/**********************************分割线**********************************/

	/*****下面获取为单轴的状态，要同时获取多个轴的状态，可使用for循环操作******/
	//获取轴1规划位置和实际位置，规划速度和实际速度
	long prfpos = 0;	
	long encpos = 0;	
	double prfvel = 0;	
	double encvel = 0;	
	rtn = NMC_MtGetPrfPos(axisHandle, &prfpos);//规划位置
	gc_rtn_error(rtn);
	rtn = NMC_MtGetEncPos(axisHandle, &encpos);//实际位置
	gc_rtn_error(rtn);
	rtn = NMC_MtGetPrfVel(axisHandle, &prfvel);//规划速度
	gc_rtn_error(rtn);
	rtn = NMC_MtGetEncPos(axisHandle, &encpos);//实际速度
	gc_rtn_error(rtn);

	/**********************************分割线**********************************/
	TAxisStsPack12Ex stspack;		// 控制器所有轴信息打包结构体
	rtn = NMC_MtGetStsPack12Ex(axisHandle, &stspack); //一次性获取所有轴信息,需要的时间会比较长
	gc_rtn_error(rtn);
	return rtn;
}