#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 : 数字量IO的读写操作
* Description   : 详细讲解DI DO如何进行输入输出
* 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 group = 0;
	long diVal;
	long doVal = 1;
	rtn = NMC_GetDI(devHandle, group, &diVal);	// 读取第一组数字量输入状态
	gc_rtn_error(rtn);

	rtn = NMC_SetDO(devHandle, group, doVal);	// 设置第一组数字量输出
	gc_rtn_error(rtn);
	rtn = NMC_MtLmtSns(axisHandle, 1, 1);// 限位开关触发电平设置为高电平
	gc_rtn_error(rtn);

	short bitVal;
	short bitIndex = 1;		// 位序号，从0开始
	rtn = NMC_GetDIBit(devHandle, bitIndex, &bitVal);// 按位读取数字量输入状态
	gc_rtn_error(rtn);

	bitIndex = 2;
	rtn = NMC_SetDOBit(devHandle, bitIndex, 0);	// 按位设置数字量输出状态
	gc_rtn_error(rtn);

	NMC_GetDOGroup(devHandle, &doVal, group);		// 获得DO第一组输出值
	gc_rtn_error(rtn);
	// 分别获得位DO值
	short bit0Val = doVal & (1 << 0);
	short bit1Val = doVal & (1 << 1);
	short bit2Val = doVal & (1 << 2);
	short bit3Val = doVal & (1 << 3);
	//	......
	short bit31Val = doVal & (1 << 31);

	return rtn;
}