#include "GCMotion.h"
#include "string.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   : 略
* 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);

	long diVal = 0;
	long diValEx = 0;
	long doVal = 0;
	long doValEx = 0;
	short di0 = 0;
	short di64 = 0;
	long axisIO = 0;
	bool IsExmoNeed = false;
	//如果需要读取扩展模块
	if (IsExmoNeed == true) {
		//设备ID需要从2开始，多个扩展模块，依次增加，拨码开关也要拨码成对应ID
		rtn = NMC_IOModuleSetEn(devHandle, 2, 1);
	}
	rtn = NMC_GetDIGroup(devHandle, &diVal, 0);	 //读取全部本地通用数字量输入
	gc_rtn_error(rtn);
	rtn = NMC_GetDIBit(devHandle, 0, &di0);		 //按位读取(单个读取),这里示范读取第0个输入
	gc_rtn_error(rtn);
	rtn = NMC_GetDIGroup(devHandle, &diValEx, 2);//全部读取扩展模，这里读取一个模块的
	gc_rtn_error(rtn);
	rtn = NMC_GetDIBit(devHandle, 64, &di64);	//按位读取(单个读取)，读取扩展模块第0个输入
	gc_rtn_error(rtn);
	rtn = NMC_GetDOGroup(devHandle, &doVal, 0);	//读取本地全部通用数字量输出
	gc_rtn_error(rtn);
	rtn = NMC_GetDOGroup(devHandle, &doValEx, 2);//读取扩展模块
	gc_rtn_error(rtn);
	rtn = NMC_SetDOGroup(devHandle, 0, 0);		//设置通用数字量全部输出
	gc_rtn_error(rtn);
	rtn = NMC_SetDOGroup(devHandle, 0xFFFD, 0);	//设置通用数字量第1个输出
	gc_rtn_error(rtn);
	rtn = NMC_SetDOBit(devHandle, 0, 0);		//设置通用数字量第0个输出,按位输出
	gc_rtn_error(rtn);
	rtn = NMC_MtGetMotionIO(axisHandle, &axisIO);//专用IO，如限位原点的电平读取
	if ((axisIO & (1 << 0)) != 0) {}			//负限位为高电平
	if ((axisIO & (1 << 1)) != 0) {}			//正限位为高电平
	if ((axisIO & (1 << 2)) != 0) {}			//原点为高电平
	rtn = NMC_SetDacMode(devHandle, 0, 4);		//模拟量设置，默认，+-10V，此函数可省略
	gc_rtn_error(rtn);
	rtn = NMC_SetDac(devHandle, 0, 32767);		//模拟量设置输出满值
	short dac = 0;
	rtn = NMC_GetDac(devHandle, 0, &dac);		//读取模拟输出
	gc_rtn_error(rtn);
	short adc = 0;
	rtn = NMC_SetAdcMode(devHandle, 0, 4, 0);	//设置ADC，默认，+-10V，此函数可省略
	gc_rtn_error(rtn);
	rtn = NMC_GetAdc(devHandle, 0, &adc);		// 读取ADC
	gc_rtn_error(rtn);
	return 0;
}
