/// <summary> /// 테스트로 한번의 트리거를 출력. /// </summary> /// <param name="_bOnLevel">출력 레벨</param> /// <param name="_iTime">시간us</param> public void OneShotTrg(bool _bOnLevel, int _iTime) { //CMP 출력은 One-shot pulse 로 출력되는데, 출력되는 펄스의 폭을 조절할 //수 있습니다. 설정 및 반환되는 PropVal 은 다음과 같습니다. //• 0 : 트리거 시점의 Command 펄스의 펄스폭과 동일한 펄스폭을 가짐 //• 양수의 값 : 이 값에 1.5us 가 곱해진 값이 펄스폭이 됩니다. 즉, 이 값을 //1 로 하면 1.5us, 2 로 하면 3us…와 같이 됩니다. int iTrgTime = (int)(_iTime / 1.5); int iRet = Cmmsdk.cmmCfgSetMioProperty(Para.iPhysicalNo, (int)MotnDefines._TCmMioPropId.cmCMP_PWIDTH, iTrgTime); int iCmpSrc = (int)MotnDefines._TCmCntr.cmCNT_COMM; // Command Position 0 //CmpMethod 1번으로 사용하는건 잘 모르겟음 일단 기본 베이스 맞춰서 1,2사용으로 함 //0 (cmDISABLE) Disable comparator //1 (cmEQ_BIDIR) CmpData = CmpSrc_Value (regardless of counting direction) 카운팅 방향에 상관 없이 //2 (cmEQ_PDIR) CmpData = CmpSrc_Value (while counting up) //3 (cmEQ_NDIR) CmpData = CmpSrc_Value (while counting down) //4 (cmLESS) CmpData > CmpSrc_Value //5 (cmGREATER) CmpData < CmpSrc_Value //(+)방향쪽으로 이동시에만 트리거펄스가 출력되고 (-)방향으로 이동할 때는 출력하지 //않도록(cmEQ_PDIR) 합니다. 엣지 개념이 아닌듯해서 1번으로 사용 int iCmpMethod = (int)MotnDefines._TCmCmpMethod.cmEQ_BIDIR; //if(_bActual) iCmpMethod = (int)MotnDefines._TCmCmpMethod.cmEQ_PDIR; // CmpData = CmpSrc_Value (while counting up) //else iCmpMethod = (int)MotnDefines._TCmCmpMethod.cmEQ_NDIR; // CmpData = CmpSrc_Value (while counting down) //위치 비교기 조건 설정 및 확인 Cmmsdk.cmmCmpTrgSetConfig(Para.iPhysicalNo, iCmpSrc, iCmpMethod); Cmmsdk.cmmCmpTrgSetOneData(Para.iPhysicalNo, MotionInfo.iCmdPos); }
/// <summary> /// 하드웨어 트리거를 시작 위치 부터 끝위치 까지 일정 간격으로 트리거를 발생 시킨다. /// </summary> /// <param name="_dStt">시작 위치</param> /// <param name="_dEnd">종료 위치</param> /// <param name="_dDist">주기</param> /// <param name="_dTrgTime">트리거 시그널의 시간us</param> /// <param name="_bActual">엔코더기준인지 커맨드 기준인지</param> /// <param name="_bOnLevel">트리거 레벨</param> public void SetTrgBlock(double _dStt, double _dEnd, double _dPeriod, double _dTrgTime, bool _bActual, bool _bOnLevel) { //CMP 출력은 One-shot pulse 로 출력되는데, 출력되는 펄스의 폭을 조절할 //수 있습니다. 설정 및 반환되는 PropVal 은 다음과 같습니다. //• 0 : 트리거 시점의 Command 펄스의 펄스폭과 동일한 펄스폭을 가짐 //• 양수의 값 : 이 값에 1.5us 가 곱해진 값이 펄스폭이 됩니다. 즉, 이 값을 //1 로 하면 1.5us, 2 로 하면 3us…와 같이 됩니다. int iTrgTime = (int)(_dTrgTime / 1.5); int iRet = Cmmsdk.cmmCfgSetMioProperty(Para.iPhysicalNo, (int)MotnDefines._TCmMioPropId.cmCMP_PWIDTH, iTrgTime); //일정 간격의 비교위치 데이터 등록 //연속적인 위치 비교 출력 기능을 사용하기 위해서 일정한 위치 간격을 가지는 연속적인 위치 데이터를 자동으로 생성하여 //등록 하도록 합니다. //이 함수는 일정한 위치 간격으로 CMP 출력을 내보낼 때 cmmCmpTrgContRegTable()함수 대신에 사용할 수 있습니다. int iCmpSrc = 0; if (_bActual) { iCmpSrc = (int)MotnDefines._TCmCntr.cmCNT_COMM; // Command Position 0 } else { iCmpSrc = (int)MotnDefines._TCmCntr.cmCNT_FEED; // Feedback Position 1 } //CmpMethod 1번으로 사용하는건 잘 모르겟음 일단 기본 베이스 맞춰서 1,2사용으로 함 //0 (cmDISABLE) Disable comparator //1 (cmEQ_BIDIR) CmpData = CmpSrc_Value (regardless of counting direction) 카운팅 방향에 상관 없이 //2 (cmEQ_PDIR) CmpData = CmpSrc_Value (while counting up) //3 (cmEQ_NDIR) CmpData = CmpSrc_Value (while counting down) //4 (cmLESS) CmpData > CmpSrc_Value //5 (cmGREATER) CmpData < CmpSrc_Value //(+)방향쪽으로 이동시에만 트리거펄스가 출력되고 (-)방향으로 이동할 때는 출력하지 //않도록(cmEQ_PDIR) 합니다. 엣지 개념이 아닌듯해서 1번으로 사용 int iCmpMethod = (int)MotnDefines._TCmCmpMethod.cmEQ_BIDIR; //if(_bActual) iCmpMethod = (int)MotnDefines._TCmCmpMethod.cmEQ_PDIR; // CmpData = CmpSrc_Value (while counting up) //else iCmpMethod = (int)MotnDefines._TCmCmpMethod.cmEQ_NDIR; // CmpData = CmpSrc_Value (while counting down) //위치 비교기 조건 설정 및 확인 Cmmsdk.cmmCmpTrgSetConfig(Para.iPhysicalNo, iCmpSrc, iCmpMethod); //연속적인 위치데이터 등록 //이거 갯수는 맞을런지 모르겟다...추후 검증 필요 //NumData : 자동생성되는 총 데이터 수 라고 되어 있음 //public static extern unsafe int cmmCmpTrgContBuildTable( //[MarshalAs(UnmanagedType.I4)] int Axis, //[MarshalAs(UnmanagedType.R8)] double StartData, //[MarshalAs(UnmanagedType.R8)] double Interval, //[MarshalAs(UnmanagedType.I4)] int NumData); double dNumData = (_dEnd - _dStt) / _dPeriod; int iNumData = (int)dNumData + 1; Cmmsdk.cmmCmpTrgContBuildTable(Para.iPhysicalNo, _dStt, _dPeriod, iNumData); //연속적인 위치 비교 기능 시작 Cmmsdk.cmmCmpTrgContStart(Para.iPhysicalNo); }
/// <summary> /// 현재 파라미터들을 아진 함수를 이용하여 세팅함. /// </summary> public void ApplyPara(double _dPulsePerUnit) { m_dPulsePerUnit = _dPulsePerUnit; int iRet2; int iMode; //S-Curve 설정할때 가/감속을 Percentage로 변환해서 셋팅해야하는데 셋팅된 가/감속 가져오기 애매해서 주석처리. //if (Para.dSCurveAcPer == 0 && Para.dSCurveDcPer == 0)//커브 안쓸때. //{ // iMode = (int)MotnDefines._TCmSpeedMode.cmSMODE_T;//대칭 //} //else //{ // iMode = (int)MotnDefines._TCmSpeedMode.cmSMODE_S;//비대칭 //} ////S-Curve 설정 //Cmmsdk.cmmCfgSetSpeedPattern(Para.iPhysicalNo, iMode, 2000, 10000, 10000 ); //Use Inpos int iUse = Para.bUseInpos ? 1 : 0; int iRet = Cmmsdk.cmmCfgSetMioProperty(Para.iPhysicalNo, (int)MotnDefines._TCmMioPropId.cmINP_EN, iUse); //EncInputMode 설정 Cmmsdk.cmmCfgSetInMode(Para.iPhysicalNo, (int)Para.eEncMulti, (int)Para.eEncInputMode); //Pulse Output 설정 int iRst = Cmmsdk.cmmCfgSetOutMode(Para.iPhysicalNo, (int)Para.ePulseOutput); //하드웨어 리밋 Cmmsdk.cmmCfgSetMioProperty(Para.iPhysicalNo, (int)MotnDefines._TCmMioPropId.cmEL_MODE, 1); // 0-즉시정지,1-감속정지 Cmmsdk.cmmCfgSetMioProperty(Para.iPhysicalNo, (int)MotnDefines._TCmMioPropId.cmEL_LOGIC, (int)Para.eLimPhase); Cmmsdk.cmmCfgSetMioProperty(Para.iPhysicalNo, (int)MotnDefines._TCmMioPropId.cmALM_MODE, 1); // 0-즉시정지,1-감속정지 Cmmsdk.cmmCfgSetMioProperty(Para.iPhysicalNo, (int)MotnDefines._TCmMioPropId.cmALM_LOGIC, (int)Para.eAlarmPhase); Cmmsdk.cmmCfgSetMioProperty(Para.iPhysicalNo, (int)MotnDefines._TCmMioPropId.cmEZ_LOGIC, (int)Para.eZphaPhase); Cmmsdk.cmmCfgSetMioProperty(Para.iPhysicalNo, (int)MotnDefines._TCmMioPropId.cmINP_LOGIC, (int)Para.eInposPhase); Cmmsdk.cmmCfgSetMioProperty(Para.iPhysicalNo, (int)MotnDefines._TCmMioPropId.cmORG_LOGIC, (int)Para.eHomePhase); Cmmsdk.cmmCfgSetMioProperty(Para.iPhysicalNo, (int)MotnDefines._TCmMioPropId.cmSVON_LOGIC, (int)Para.eServoPhase); //링카운터 (ex, 원으로 돌때 해당 포지션에서 0로 변경) //이 기능은 COMI-LX502 제품에서는 지원하지 않습니다. 대여받은게 하필 이거라 테스트 못해봄 iUse = Para.dSetMaxPos == 0 ? 0 : 1; Cmmsdk.cmmCfgSetRingCntr(Para.iPhysicalNo, (int)MotnDefines._TCmCntr.cmCNT_COMM, iUse, Para.dSetMaxPos * m_dPulsePerUnit); Cmmsdk.cmmCfgSetRingCntr(Para.iPhysicalNo, (int)MotnDefines._TCmCntr.cmCNT_FEED, iUse, Para.dSetMaxPos * m_dPulsePerUnit); if (Para.bGantryEnable) { SetLinkEnable(); } else { SetLinkDisable(); } }
//특수기능 /// <summary> /// 하드웨어 트리거를 발생시킨다. /// </summary> /// <param name="_daPos">발생시킬 트리거 위치들</param> /// <param name="_dTrgTime">트리거 시그널의 시간us</param> /// <param name="_bActual">엔코더기준인지 커멘드 기준인지</param> /// <param name="_bOnLevel">트리거 레벨</param> public void SetTrgPos(double[] _daPos, double _dTrgTime, bool _bActual, bool _bOnLevel) //Target Actual Position or Command Position. { //CMP 출력은 One-shot pulse 로 출력되는데, 출력되는 펄스의 폭을 조절할 //수 있습니다. 설정 및 반환되는 PropVal 은 다음과 같습니다. //• 0 : 트리거 시점의 Command 펄스의 펄스폭과 동일한 펄스폭을 가짐 //• 양수의 값 : 이 값에 1.5us 가 곱해진 값이 펄스폭이 됩니다. 즉, 이 값을 //1 로 하면 1.5us, 2 로 하면 3us…와 같이 됩니다. int iTrgTime = (int)(_dTrgTime / 1.5); int iRet = Cmmsdk.cmmCfgSetMioProperty(Para.iPhysicalNo, (int)MotnDefines._TCmMioPropId.cmCMP_PWIDTH, iTrgTime); int iCmpSrc = 0; if (_bActual) { iCmpSrc = (int)MotnDefines._TCmCntr.cmCNT_COMM; // Command Position 0 } else { iCmpSrc = (int)MotnDefines._TCmCntr.cmCNT_FEED; // Feedback Position 1 } //CmpMethod 1번으로 사용하는건 잘 모르겟음 일단 기본 베이스 맞춰서 1,2사용으로 함 //0 (cmDISABLE) Disable comparator //1 (cmEQ_BIDIR) CmpData = CmpSrc_Value (regardless of counting direction) 카운팅 방향에 상관 없이 //2 (cmEQ_PDIR) CmpData = CmpSrc_Value (while counting up) //3 (cmEQ_NDIR) CmpData = CmpSrc_Value (while counting down) //4 (cmLESS) CmpData > CmpSrc_Value //5 (cmGREATER) CmpData < CmpSrc_Value //(+)방향쪽으로 이동시에만 트리거펄스가 출력되고 (-)방향으로 이동할 때는 출력하지 //않도록(cmEQ_PDIR) 합니다. 엣지 개념이 아닌듯해서 1번으로 사용 int iCmpMethod = (int)MotnDefines._TCmCmpMethod.cmEQ_BIDIR; //if(_bActual) iCmpMethod = (int)MotnDefines._TCmCmpMethod.cmEQ_PDIR; // CmpData = CmpSrc_Value (while counting up) //else iCmpMethod = (int)MotnDefines._TCmCmpMethod.cmEQ_NDIR; // CmpData = CmpSrc_Value (while counting down) //위치 비교기 조건 설정 및 확인 Cmmsdk.cmmCmpTrgSetConfig(Para.iPhysicalNo, iCmpSrc, iCmpMethod); //연속적인 위치데이터 등록 Cmmsdk.cmmCmpTrgContRegTable(Para.iPhysicalNo, _daPos, _daPos.Length); //연속적인 위치 비교 기능 시작 Cmmsdk.cmmCmpTrgContStart(Para.iPhysicalNo); }