Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        //특수기능
        /// <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);
        }