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 처리 }