목차

CMP One

Code

C#

using ec = ComiLib.EtherCAT.SafeNativeMethods;


uint logBitAddr = 0; // 출력 채널에 대한 LogicBitAddress
int method = 0; // CMP 출력 조건
int cntrType = 0; // CMP 위치 조건. Command / Feedback
int logic = 0; // CMP 출력 로직. 
int duration = 10; // CMP 출력 유지 시간. 단위 ms. 

double cmpPosition = 0;
static ec.CallbackFunc callBackFunc;
        
private void btnCmpOneStart_Click(object sender, EventArgs e)
{
	// 출력 환경을 설정한다.        
        // CMP 출력 채널을 확인하여 LogicBitAddress로 변환
	// Local 채널도 사용 가능하지만, 본 예제에서는 다루지 않는다.
	if (usingOutputCh) // 범용 Output 채널 사용 시
	{
		int ch = 0; // CMP 출력 채널
		logBitAddr = ec.ecdoLogBitAddr_FromGlobalChannel(netID, ch, ref errorCode);
		if (errorCode != 0) 
		{
			// 에러처리
		}
	}
	else // OnBoard(마스터 보드) DO 사용 시
	{
		int ch = 0;
		logBitAddr = ec.ecdoLogBitAddr_FromOnboardChannel(netID, ch, ref errorCode);
		if (errorCode != 0) 
		{
			// 에러처리
		}
	}

	// 이전 출력 결과를 초기화한다.
	ec.ecmSxCmpOne_ClearOutResult(netID, axisID, ref errorCode);
	if (errorCode != 0) 
	{
		// 에러처리
	}

	cmpCount = 0;	
	logic = 0; // CMP 출력 로직. 0 : Logic A. 1 : Logic B
	duration = 100; // CMP 출력 유지 시간. 단위 ms.             

	// CMP 출력채널 정보를 설정한다.            
	ec.ecmSxCmpOne_SetChannel(netID, axisID, logBitAddr, logic, duration, ref errorCode);
	if (errorCode != 0) 
	{
		// 에러처리
	}           

	// CMP 출력조건을 설정한다.
	// CMP Method
	// 0 : Current = Reference (While Counting Down)
	// 1 : Current = Reference (While Counting Up)
	// 2 : Current = Reference
	// 3 : Current < Reference
	// 4 : Current > Reference
	// 5 : Current <= Reference
	// 6 : Current >= Reference
	
	// cntrType
	// 0 : Command
	// 1 : Feedback
	
	cmpPosition = 10000; //CMP 출력 위치
	method = 6; // CMP 출력 조건
	cntrType = 1; // CMP 위치 조건.
				
	ec.ecmSxCmpOne_SetCondition(netID, axisID, cntrType, method, cmpPosition, ref errorCode);
	if (errorCode != 0) 
	{
		// 에러처리
	}
	
	//이하 코드는 CMP Notify 관련 기능이다. 해당 기능을 사용하지 않는다면 생략.
	//CMP Notify : 출력 결과를 소프트웨어적으로 통지받고자 할때 사용하며, 단일 출력(ecmSxCmpOne_ )일때만 사용 가능하다.
	//본 예제에서는 message 방식과 CallBack 방식을 다룬다.
	switch (cbxTypeSel.SelectedIndex)
	{
		case 0:
			if (!ec.ecmSxCmpOne_SetHandler_MSG(netID, axisID, (int)ec.EEcmHandlerType.ecmHT_MESSAGE, this.Handle, WMU_CMPMESSAGE, this.Handle, ref errorCode)) // CMP Message 등록
			{
				AddLog(string.Format("ecmSxCmpOne_SetHandler_MSG failed. errorCode : {0}", errorCode));
				return;
			}
			break;

		case 1:
			callBackFunc = new ec.CallbackFunc(CallBackFunc);
			if (!ec.ecmSxCmpOne_SetHandler_CLB(netID, axisID, (int)ec.EEcmHandlerType.ecmHT_CALLBACK, callBackFunc, 0, this.Handle, ref errorCode)) // CMP Message 등록
			{
				AddLog(string.Format("ecmSxCmpOne_SetHandler_CLB failed. errorCode : {0}", errorCode));
				return;
			}
			break;
	}

	//CMP 시작
	bool isEnable = true;
	if (!ec.ecmSxCmpOne_SetEnable(netID, axisID, isEnable, ref errorCode)) // CMP Enable
	{
		// 에러처리
	}
}

private void btnCmpOneStop_Click(object sender, EventArgs e)
{
	//CMP Notify 관련 설정이 되어 있다면 해당 설정을 먼저 해제한다.
	switch (cbxTypeSel.SelectedIndex)
	{
		case 0:
			if (!ec.ecmSxCmpOne_SetHandler_MSG(netID, axisID, (int)ec.EEcmHandlerType.ecmHT_DISABLE, this.Handle, WMU_CMPMESSAGE, this.Handle, ref errorCode))
			{
				//에러처리
			}

			break;

		case 1:
			if (!ec.ecmSxCmpOne_SetHandler_CLB(netID, axisID, (int)ec.EEcmHandlerType.ecmHT_DISABLE, callBackFunc, 0, this.Handle, ref errorCode))
			{
				//에러처리
			}
			break;
	}

	// CMP 기능 비활성화
	bool isEnable = false;
	if (!ec.ecmSxCmpOne_SetEnable(netID, axisID, isEnable, ref errorCode))
	{
		//에러처리
	}
}



private void UpdateCmp() 
{
	// 마지막 입력된 값에 대한 설정값을 불러온다.
	// CmpOne 과 CmpCont 는 다른 함수를 사용한다
	
	// 채널 관련 정보를 확인한다.	
	ec.ecmSxCmpOne_GetChannel(netID, axisID, ref logBitAddr, ref logic, ref duration, ref errorCode);
		
	// 출력 조건을 확인한다.
	ec.ecmSxCmpOne_GetCondition(netID, axisID, ref cntrType, ref method, ref cmpPosition, ref errorCode);
	
	// UI 처리
}

C++