/// <summary> /// 현재 파라미터들을 아진 함수를 이용하여 세팅함. /// </summary> public void ApplyPara(double _dPulsePerUnit) { m_dPulsePerUnit = _dPulsePerUnit; const int iStart_Stop_speed = 1; //모션프로파일 생성시 처음 치고 나가는 속도. 이보다 느리면 구동이 안됨. const int iMax_Speed_Pulse = 6000000; //최대 구동 펄스. CAXM.AxmMotSetMinVel(Para.iPhysicalNo, iStart_Stop_speed); //모션프로파일 생성시 처음 치고 나가는 속도. 이보다 느리면 구동이 안됨. CAXM.AxmMotSetMaxVel(Para.iPhysicalNo, iMax_Speed_Pulse); //최대 구동 속도를 설정 uint iRet2; uint iMode; if (Para.dSCurveAcPer == 0 && Para.dSCurveDcPer == 0) //커브 안쓸때. { iMode = (uint)AXT_MOTION_PROFILE_MODE.SYM_TRAPEZOIDE_MODE; //대칭 } else { iMode = (uint)AXT_MOTION_PROFILE_MODE.ASYM_TRAPEZOIDE_MODE;//비대칭 } CAXM.AxmMotSetProfileMode(Para.iPhysicalNo, iMode); CAXM.AxmMotSetAccelJerk(Para.iPhysicalNo, Para.dSCurveAcPer); CAXM.AxmMotSetDecelJerk(Para.iPhysicalNo, Para.dSCurveDcPer); iRet2 = CAXM.AxmSignalSetZphaseLevel(Para.iPhysicalNo, (uint)Para.eZphaPhase); //Z상 접점. iRet2 = CAXM.AxmHomeSetSignalLevel(Para.iPhysicalNo, (uint)Para.eHomePhase); //홈센서 접점. CAXM.AxmSignalGetServoOnLevel(Para.iPhysicalNo, ref iMode); iRet2 = CAXM.AxmSignalSetServoOnLevel(Para.iPhysicalNo, (uint)Para.eServoPhase); CAXM.AxmSignalGetServoOnLevel(Para.iPhysicalNo, ref iMode); // 지정 축의 end limit sensor의 사용 유무 및 신호의 입력 레벨을 설정한다. const uint iStopMode = 0;//EMERGENCY_STOP CAXM.AxmSignalSetLimit(Para.iPhysicalNo, iStopMode, (uint)Para.ePLimPhase, (uint)Para.eNLimPhase); CAXM.AxmSignalSetServoAlarm(Para.iPhysicalNo, (uint)Para.eAlarmPhase); //알람시에 비상정지 않씀 직접 세움. CAXM.AxmMotSetEncInputMethod(Para.iPhysicalNo, (uint)Para.eEncInput); //엔코더 입력 방식 설정 엔코더 방향 전환. CAXM.AxmMotSetPulseOutMethod(Para.iPhysicalNo, (uint)Para.ePulseOutput); //펄스 출력 방식 설정 // uLevel : LOW(0), HIGH(1), UNUSED(2), USED(3) CAXM.AxmSignalSetInpos(Para.iPhysicalNo, (uint)Para.eInposPhase); //인포지션(Inposition) 신호 액티브레벨 설정 int iDir = Para.bUseInpos ? 3 : 2; // uLevel : LOW(0), HIGH(1), UNUSED(2), USED(3) CAXM.AxmSignalSetInpos(Para.iPhysicalNo, (uint)iDir); // AccelUnit : UNIT_SEC2 '0' - 가감속 단위를 unit/sec2 사용 // SEC '1' - 가감속 단위를 sec 사용 CAXM.AxmMotSetAccelUnit(Para.iPhysicalNo, 0); SetGantryEnable(); }
public void AxtMotorInit(int ServoXDir, int ServoYDir, int ServoZDir) { #if PROGRAM_RUNNING //각 축에 대한 리미트 센서의 Low/High Active 값을 설정한다. Axt_ServoOnOff(mStatus.X_SELECT, true); Axt_ServoOnOff(mStatus.Y_SELECT, true); Axt_ServoOnOff(mStatus.Z_SELECT, true); AlarmOperating(mStatus.X_SELECT, true); AlarmOperating(mStatus.Y_SELECT, true); delay(500); AlarmOperating(mStatus.X_SELECT, false); AlarmOperating(mStatus.Y_SELECT, false); AlarmOperating(mStatus.Z_SELECT, false); Axt_CWCCW_LimitSet(mStatus.X_SELECT, false, false); Axt_CWCCW_LimitSet(mStatus.Y_SELECT, false, false); Axt_CWCCW_LimitSet(mStatus.Z_SELECT, false, false); CAXM.AxmSignalSetServoAlarm(mStatus.X_SELECT, LOW_ACTIVE); CAXM.AxmSignalSetServoAlarm(mStatus.Y_SELECT, LOW_ACTIVE); CAXM.AxmSignalSetServoAlarm(mStatus.Z_SELECT, LOW_ACTIVE); //e stop 신호 입력시 처리 uint uStopMode = 0; // 0 - emergency stop , 1 - Slow down stop CAXM.AxmSignalSetStop(mStatus.X_SELECT, uStopMode, LOW_ACTIVE); CAXM.AxmSignalSetStop(mStatus.Y_SELECT, uStopMode, LOW_ACTIVE); CAXM.AxmSignalSetStop(mStatus.Z_SELECT, uStopMode, LOW_ACTIVE); uint UnitMode = 0; // 0 - unit/sec1 , 1 - sec CAXM.AxmMotSetAccelUnit(mStatus.X_SELECT, UnitMode); CAXM.AxmMotSetAccelUnit(mStatus.Y_SELECT, UnitMode); CAXM.AxmMotSetAccelUnit(mStatus.Z_SELECT, UnitMode); SetAbsMode(mStatus.X_SELECT); SetAbsMode(mStatus.Y_SELECT); SetAbsMode(mStatus.Z_SELECT); AxtPulseMethodeSet(mStatus.X_SELECT, (byte)ServoXDir); AxtPulseMethodeSet(mStatus.Y_SELECT, (byte)ServoYDir); AxtPulseMethodeSet(mStatus.Z_SELECT, (byte)ServoZDir); UnitPulse_StartStopSpeed(mStatus.X_SELECT, 0); UnitPulse_StartStopSpeed(mStatus.Y_SELECT, 0); UnitPulse_StartStopSpeed(mStatus.Z_SELECT, 0); AxtEncoderMethod(mStatus.X_SELECT, 3); //4채배 AxtEncoderMethod(mStatus.Y_SELECT, 3); //4채배 AxtEncoderMethod(mStatus.Z_SELECT, 3); //4채배 AxtOriginSpeedSet(mStatus.X_SELECT, 20); AxtOriginSpeedSet(mStatus.Y_SELECT, 20); AxtOriginSpeedSet(mStatus.Z_SELECT, 20); #endif return; }
public void AlarmOperating(short m_nAxis, bool Flag) { #if PROGRAM_RUNNING if (GetRunAxis(m_nAxis) == false) { return; } if (Flag == true) { if (CAXM.AxmSignalServoAlarmReset(m_nAxis, 0x01) != (uint)AXT_FUNC_RESULT.AXT_RT_SUCCESS) { MessageBox.Show("No1 Error - 알람 리셋중 에러가 발생하였습니다."); } ; } else { if (CAXM.AxmSignalServoAlarmReset(m_nAxis, 0x0) != (uint)AXT_FUNC_RESULT.AXT_RT_SUCCESS) { MessageBox.Show("No2 Error - 알람 리셋중 에러가 발생하였습니다."); } ; } #endif return; }
public bool AxtReadAlarm(short m_nAxis) { #if PROGRAM_RUNNING /* * if (CAxtCAMCFS20.CFS20get_alarm_switch(m_nAxis) != 0) * return true; * else return false; */ if (GetRunAxis(m_nAxis) == false) { return(true); } uint mStatus = 0; if (CAXM.AxmSignalReadServoAlarm(m_nAxis, ref mStatus) != (uint)AXT_FUNC_RESULT.AXT_RT_SUCCESS) { return(false); } if ((mStatus & 0x01) == 0) { return(false); } else { return(true); } #else return(false); #endif }
public bool AxtMovingEndCheck(short m_nAxis) { #if PROGRAM_RUNNING //return CAxtCAMCFS20.CFS20in_motion(m_nAxis); if (GetRunAxis(m_nAxis) == false) { return(true); } uint Result = 0; if (CAXM.AxmStatusReadInMotion(m_nAxis, ref Result) != (uint)AXT_FUNC_RESULT.AXT_RT_SUCCESS) { return(false); } if (Result == 0) { return(true); //이동 완료면 설정된다. } else { return(false); } #else return(true); #endif }
/// <summary> /// 펄스 엔코더 리턴. /// </summary> /// <returns>펄스 리턴</returns> public double GetEncPos() { double dPos = 0.0; CAXM.AxmStatusGetActPos(Para.iPhysicalNo, ref dPos); return(dPos); }
public void Move(double pos, bool isRelative) { try { if (m_bIsUseAxis) { uint duRetCode = 0; duRetCode = CAXM.AxmMotSetAbsRelMode(m_nAxisNumber, Convert.ToUInt32(isRelative)); if (duRetCode != (uint)AXT_FUNC_RESULT.AXT_RT_SUCCESS) { MessageBox.Show(String.Format("AxmMotSetAbsRelMode return error[Code:{0:d}]", duRetCode)); return; } //++ 지정한 축을 지정한 거리(또는 위치)/속도/가속도/감속도로 모션구동하고 모션 종료여부와 상관없이 함수를 빠져나옵니다. duRetCode = CAXM.AxmMoveStartPos(m_nAxisNumber, pos * UnitPerMM, Velocity * UnitPerMM, Acceleration * UnitPerMM, Deceleration * UnitPerMM); m_fPosDst = pos; m_eStat = eAxis.eMove; if (duRetCode != (uint)AXT_FUNC_RESULT.AXT_RT_SUCCESS) { MessageBox.Show(String.Format("AxmMoveStartPos return error[Code:{0:d}]", duRetCode)); } } } catch (Exception E) { LogFile.LogExceptionErr(E.ToString()); throw E; } }
public bool IsBusy() { try { if (m_bIsUseAxis) { uint duRetCode = 0; CAXM.AxmStatusReadInMotion(m_nAxisNumber, ref duRetCode); if (duRetCode == 0) { return(false); } else { return(true); } } else { return(false); } } catch (Exception E) { LogFile.LogExceptionErr(E.ToString()); throw E; } }
// 지정거리이동 - AxmMoveStartPos // distance - 이동 거리 public void MoveTo(double distance) { lock (execLock) { Validate(CAXM.AxmMoveStartPos(Index, distance, HiVelocity, HiAcceleration, HiDeceleration)); } }
// 구동 급정지 - AxmMoveEStop public void MoveEStop() { lock (execLock) { Validate(CAXM.AxmMoveEStop(Index)); } }
// 구동 감속 정지 - AxmMoveStop // deceleration - 감속 속도 public void MoveStop(double deceleration) { lock (execLock) { Validate(CAXM.AxmMoveStop(Index, deceleration)); } }
// 구동 감속 정지 - AxmMoveStop public void MoveStop() { lock (execLock) { Validate(CAXM.AxmMoveStop(Index, HiDeceleration)); } }
// 구동 시작 - AxmMoveVel // velocity - 구동 속도 // acceleration - 가속 속도 // deceleration - 감속 속도 public void MoveStart(double velocity, double acceleration, double deceleration) { lock (execLock) { Validate(CAXM.AxmMoveVel(Index, velocity, acceleration, deceleration)); } }
// 구동 시작 - AxmMoveVel public void MoveStart() { lock (execLock) { Validate(CAXM.AxmMoveVel(Index, HiVelocity, HiAcceleration, HiDeceleration)); } }
// 원점 검출 구동 - AxmHomeSetStart public void HomeSeek() { lock (execLock) { Validate(CAXM.AxmHomeSetStart(Index)); } }
// Home Search public bool OriginMoveEnd(short m_nAxis) { #if PROGRAM_RUNNING uint Result = 0; if (GetRunAxis(m_nAxis) == false) { return(true); } if (CAXM.AxmHomeGetResult(m_nAxis, ref Result) != (uint)AXT_FUNC_RESULT.AXT_RT_SUCCESS) { return(false); } if (Result == 1) { return(true); } else { return(false); } #else return(true); #endif }
// 지정거리이동 - AxmMoveStartPos // distance - 이동 거리 // velocity - 이동 속도 // acceleration - 가속 속도 // deceleration - 감속 속도 public void MoveTo(double distance, double velocity, double acceleration, double deceleration) { lock (execLock) { Validate(CAXM.AxmMoveStartPos(Index, distance, velocity, acceleration, deceleration)); } }
public bool GantrySetEnable() { try { if (GantryMasterAxis == -1 || GantrySlaveAxis == -1 || GantryMasterAxis == GantrySlaveAxis) { return(false); } uint res = CAXM.AxmGantrySetEnable(GantryMasterAxis, GantrySlaveAxis, GantrySlaveHomeUse, GantrySlaveOffset * m_listAxis[GantrySlaveAxis].UnitPerMM, GantrySlaveOffsetRange * m_listAxis[GantrySlaveAxis].UnitPerMM); if (res == (uint)AXT_FUNC_RESULT.AXT_RT_SUCCESS || res == (uint)AXT_FUNC_RESULT.AXT_RT_MOTION_ERROR_GANTRY_ENABLE) { m_listAxis[GantrySlaveAxis].IsUseAxis = false; return(true); } else { return(false); } } catch (Exception E) { LogFile.LogExceptionErr(E.ToString()); throw E; } }
public bool GantrySetDisable() { try { if (GantryMasterAxis == -1 || GantrySlaveAxis == -1 || GantryMasterAxis == GantrySlaveAxis) { return(false); } uint res = CAXM.AxmGantrySetDisable(GantryMasterAxis, GantrySlaveAxis); if (res == (uint)AXT_FUNC_RESULT.AXT_RT_SUCCESS) { return(true); } else { return(false); } } catch (Exception E) { LogFile.LogExceptionErr(E.ToString()); throw E; } }
/// <summary> /// 서보 온오프 /// </summary> /// <param name="_bOn">온오프</param> public void SetServo(bool _bOn) { //const int iServoOnBit = 0 ; uint uiOn = _bOn ? (uint)1 : (uint)0; //Stop the Motor. Stop(); //Servo On/Off. CAXM.AxmSignalServoOn(Para.iPhysicalNo, uiOn); //CAXM.AbUseBreak xmSignalWriteOutputBit(Para.iPhysicalNo, iServoOnBit, uiOn); if (Para.bUseBreak) { SetY(Para.iBreakOffAdd, _bOn); } if (!_bOn) { SetHomeDone(false); } else { //가끔 장비껐다가 켜서 홈잡을때 겐트리가 안엮여서 병신짓 할때 있어서 //서보 온에서 한번씩 해본다. //밖에 사이클홈에서 홈시작전에 확인 하여 알람 띄워보자. SetGantryEnable(); } }
// unit/pulse, Startstop speed setting private void UnitPulse_StartStopSpeed(short m_nAxis, short Speed) { // #if PROGRAM_RUNNING if (GetRunAxis(m_nAxis) == false) { return; } if (m_nAxis == mStatus.X_SELECT) { //CAxtCAMCFS20.AxmMotSetMoveUnitPerPulse(m_nAxis, 5.0 , (XOneCycleToPulse * 1.0)); //볼 스크류 리드(1회전 이동거리) , (모터 1회전 펄스수 * 감속비) CAXM.AxmMotSetMoveUnitPerPulse(m_nAxis, YOneCycleToStroke, (int)(YOneCycleToPulse * 1.0)); //볼 스크류 리드(1회전 이동거리) , (모터 1회전 펄스수 * 감속비) } else if (m_nAxis == mStatus.Y_SELECT) { CAXM.AxmMotSetMoveUnitPerPulse(m_nAxis, ZOneCycleToStroke, (int)(ZOneCycleToPulse * 1.0)); //볼 스크류 리드(1회전 이동거리) , (모터 1회전 펄스수 * 감속비) } else if (m_nAxis == mStatus.Z_SELECT) { CAXM.AxmMotSetMoveUnitPerPulse(m_nAxis, XOneCycleToStroke, (int)(XOneCycleToPulse * 1.0)); //볼 스크류 리드(1회전 이동거리) , (모터 1회전 펄스수 * 감속비) } //0 축에 초기 속도를 1로 설정한다 설정한다 . Default : 1 //모션이 시작될 때의 초기 속도를 지정, 초기 속도는 모션 구도의 기준점이 되므로 반드시 설정해야 한다. //int lAxisNo = 0; //double dMinVelocity = 1; if (CAXM.AxmMotSetMinVel(m_nAxis, Speed) != (uint)AXT_FUNC_RESULT.AXT_RT_SUCCESS) { MessageBox.Show("초기 속도 설정 오류 입니다."); } #endif return; }
//동기구동, 버그 있는듯. 갠트리로 대신 쓴다. //현재 동기구동 상태인지 확인하기 위해 uint로 리턴한다. //AXT_RT_SUCCESS 반환하면 동기구동상태 public bool SetLinkEnable(int _iSlvMotrNo) { //GantryEnable 실행하고 확인하면 가끔 확인 안될때가 있어서 먼저 확인하고 실행하는 것으로 바꾼다. uint uiHomeMathod = 0; double dOffset = .0; double dOfsRange = .0; uint uiGantryOn = 0; CAXM.AxmGantryGetEnable(Para.iPhysicalNo, ref uiHomeMathod, ref dOffset, ref dOfsRange, ref uiGantryOn); if (uiGantryOn != 0) { return(true); } uint uiRet = CAXM.AxmGantrySetEnable(Para.iPhysicalNo, _iSlvMotrNo, 0, 0, 999999); //System.Threading.Thread.Sleep(100); //uint uiHomeMathod = 0; //double dOffset = .0; //double dOfsRange = .0; //uint uiGantryOn = 0; //CAXM.AxmGantryGetEnable(Para.iPhysicalNo, ref uiHomeMathod ,ref dOffset, ref dOfsRange ,ref uiGantryOn); //if (uiGantryOn != 0) //{ // return true; //} return(false); }
// 원점 검출 방법 설정 - AxmHomeSetMethod // dir(원점검색 진행방향) : DIR_CCW(0)-반시계방향, DIR_CW(1)-시계방향 // detect(검출Signal) : PosEndLimit(0)-(+)Limit신호, NegEndLimit(1)-(-)Limit신호, HomeSensor(4)-Home신호 // zPhase(Z상검출) : DISABLE(0)-사용안함, (1)-(+)방향검출 , (2)-(-)방향검출 // clearTime : 원점 검색 Encoder 값 Set하기 위한 대기시간 // offset : 원점검출후 이동거리. public void SetHomeSeekType( AXT_MOTION_MOVE_DIR dir, AXT_MOTION_HOME_DETECT detect, UInt32 zPhase, double clearTime, double offset) { Validate(CAXM.AxmHomeSetMethod(Index, (int)dir, (UInt32)detect, zPhase, clearTime, offset)); }
public int GetContCrntIdx(int _iCoord) { int iIdx = 0; CAXM.AxmContiGetNodeNum(_iCoord, ref iIdx); return(iIdx); }
//2축 제어 겐트리. public void SetGantryEnable() { uint uiHomeMathod = 0; double dOffset = .0; double dOfsRange = .0; uint uiGantryOn = 0; CAXM.AxmGantryGetEnable(Para.iPhysicalNo, ref uiHomeMathod, ref dOffset, ref dOfsRange, ref uiGantryOn); if (uiGantryOn != 0) { SetGantryDisable(); } if (Para.bGantryEnable) { uint uiRet = CAXM.AxmGantrySetEnable(Para.iPhysicalNo, Para.iGantrySubAdd, (uint)Para.eGantryMathod, Para.dGantryOffset * m_dPulsePerUnit, Para.dGantryOfsRange * m_dPulsePerUnit); } //프로그램 켜고 가끔 개별 홈 잡으면 서브축이 서보온이 안된상태일 경우가 있어서 야매로 이렇게 한다. //const int iServoOnBit = 0 ; //Servo On/Off. //iRet = AxmSignalWriteOutputBit(_iSlaveAxis, iServoOnBit, true); }
//특수기능 /// <summary> /// 하드웨어 트리거를 발생시킨다. /// </summary> /// <param name="_dPos">발생시킬 트리거 위치들</param> /// <param name="_dTrgTime">트리거 시그널의 시간us</param> /// <param name="_bActual">엔코더기준인지 커멘드 기준인지</param> /// <param name="_bOnLevel">트리거 레벨</param> public void SetTrgPos(double[] _dPos, double _dTrgTime, bool _bActual, bool _bOnLevel) { //====================트리거 함수 =================================================================================== // 주의사항: 트리거 위치를 설정할경우 반드시 UNIT/PULSE의 맞추어서 설정한다. // 위치를 UNIT/PULSE 보다 작게할 경우 최소단위가 UNIT/PULSE로 맞추어지기때문에 그위치에 출력할수없다. // 지정 축에 트리거 기능의 사용 여부, 출력 레벨, 위치 비교기, 트리거 신호 지속 시간 및 트리거 출력 모드를 설정한다. // 트리거 기능 사용을 위해서는 먼저 AxmTriggerSetTimeLevel 를 사용하여 관련 기능 설정을 먼저 하여야 한다. // dTrigTime : 트리거 출력 시간, 1usec - 최대 50msec ( 1 - 50000 까지 설정) // upTriggerLevel : 트리거 출력 레벨 유무 => LOW(0), HIGH(1) // uSelect : 사용할 기준 위치 => COMMAND(0), ACTUAL(1) // uInterrupt : 인터럽트 설정 => DISABLE(0), ENABLE(1) // 지정 축에 트리거 신호 지속 시간 및 트리거 출력 레벨, 트리거 출력방법을 설정한다. // public static extern uint AxmTriggerSetTimeLevel(int lAxisNo, double dTrigTime, uint uTriggerLevel, uint uSelect, uint uInterrupt); // 0축에 트리거 신호의 레벨과 지속시간을 설정한다. double dTrigTime = _dTrgTime; //1~50000(50ms) uint uTriggerLevel = _bOnLevel ? (uint)1 : (uint)0; uint uSelect = _bActual ? (uint)1 : (uint)0; // Encorder or Command Position 을 기준으로 트리거 발생 uint uInterrupt = 0; uint dwRet = CAXM.AxmTriggerSetTimeLevel(Para.iPhysicalNo, dTrigTime, uTriggerLevel, uSelect, uInterrupt); //int nAxisNo, int nTrigNum, ref double dTrigPos); //배열 인자에 관해서 모르겠다. ;; //나중에 찾아보자. CAXM.AxmTriggerOnlyAbs(Para.iPhysicalNo, _dPos.Length, _dPos); //CAXM.AxmTriggerOnlyAbs(mPara.iPhysicalNo,_dPos.Length, _dPos); }
/// <summary> /// 서보 온오프 /// </summary> /// <param name="_bOn">온오프</param> public void SetServo(bool _bOn) { //const int iServoOnBit = 0 ; uint uiOn = _bOn ? (uint)1 : (uint)0; //Stop the Motor. Stop(); //다이렉트케이블이 같이 엮겨 있을때 Machine에서 그냥 MT_SetY로 쓰기때문에 사용한하게 됨. if (Para.bUseBreak) { SetY(Para.iBreakOffAdd, _bOn); } //Servo On/Off. CAXM.AxmSignalServoOn(Para.iPhysicalNo, uiOn); //CAXM.AbUseBreak xmSignalWriteOutputBit(Para.iPhysicalNo, iServoOnBit, uiOn); if (!_bOn) { SetHomeDone(false); } else { //가끔 장비껐다가 켜서 홈잡을때 겐트리가 안엮여서 병신짓 할때 있어서 //서보 온에서 한번씩 해본다. //밖에 사이클홈에서 홈시작전에 확인 하여 알람 띄워보자. //동기구동을 Gantry 이용해서 거는데 Para.bGantryEnable 조건 없으면 //Reset할때마다 GetLinkMode false 시켜서 조건 건다. 진섭. if (Para.bGantryEnable) { SetGantryEnable(); } } }
/// <summary> /// 초기화 함수. /// </summary> /// <returns>초기화 성공여부</returns> public bool Init() { Para = new CParaMotorAxl(); //통합 보드 초기화 부분. if (CAXL.AxlIsOpened() == 0) { // 통합 라이브러리가 사용 가능하지 (초기화가 되었는지) 확인 if (CAXL.AxlOpenNoReset(7) != 0) //초기화 사용 하지 않는 오픈. { // 통합 라이브러리 초기화 Log.ShowMessage("Motor", "AJIN AXL Lib Loading Error"); return(false); } } uint uStatus = 0; uint uRet = CAXM.AxmInfoIsMotionModule(ref uStatus); if (uRet != 0) { Log.ShowMessage("Motor", "AJIN AXL Motion Module Loading Error"); return(false); } //public static extern uint AxmInfoIsMotionModule(ref uint upStatus); return(true); }
/// <summary> /// 홈이 지원 안되는 보드 같은경우 돌려주고 Update 함수 내부에서 처리 해야 한다. /// </summary> public void Update() { //uint uiSignal = 0; //uint uiInMotion = 1; //CAXM.AxmStatusReadMechanical(Para.iPhysicalNo,ref uiSignal); //MotionStat.bHomeSnsr = ((uiSignal >> 7) & 0x01) == 0x01; //MotionStat.bNLimSnsr = ((uiSignal >> 1) & 0x01) == 0x01; //MotionStat.bPLimSnsr = ((uiSignal >> 0) & 0x01) == 0x01; //MotionStat.bZphaseSgnl = ((uiSignal >> 8) & 0x01) == 0x01; //MotionStat.bAlarmSgnl = ((uiSignal >> 4) & 0x01) == 0x01; //CAXM.AxmStatusReadInMotion(Para.iPhysicalNo, ref uiInMotion); ////MotionStat.bInPosSgnl = ((uiSignal >> 5) & 0x01) == 0x01; //MotionStat.bInPosSgnl = uiInMotion == 0; //화면에 display MOTION_INFO MotionInfoTemp = MotionInfo; MotionInfoTemp.uMask = 0x1F; // 모든 모션상태반환. CAXM.AxmStatusReadMotionInfo(Para.iPhysicalNo, ref MotionInfoTemp); MotionInfo = MotionInfoTemp; //MOTION_INFO MotionInfo; //MotionInfo.uMask = 0x1F;// 모든모션상태반환 //CAXM.AxmStatusReadMotionInfo(Para.iPhysicalNo,ref MotionInfo); MotionStat.bInPosSgnl = ((MotionInfo.uDrvStat >> 0) & 0x01) != 0x01; MotionStat.bHomeSnsr = ((MotionInfo.uMechSig >> 7) & 0x01) == 0x01; MotionStat.bNLimSnsr = ((MotionInfo.uMechSig >> 1) & 0x01) == 0x01; MotionStat.bPLimSnsr = ((MotionInfo.uMechSig >> 0) & 0x01) == 0x01; MotionStat.bZphaseSgnl = ((MotionInfo.uMechSig >> 8) & 0x01) == 0x01; MotionStat.bAlarmSgnl = ((MotionInfo.uMechSig >> 4) & 0x01) == 0x01; }
public void Home() { if (m_bIsUseAxis) { SetServoOn(true); uint duRetCode = 0; duRetCode = CAXM.AxmHomeSetVel(m_nAxisNumber, 30 * m_dUnitperMM, 10 * m_dUnitperMM, 5 * m_dUnitperMM, 2 * m_dUnitperMM, 50 * m_dUnitperMM, 50 * m_dUnitperMM); if (duRetCode != (uint)AXT_FUNC_RESULT.AXT_RT_SUCCESS) { MessageBox.Show(String.Format("AxmHomeSetVel return error[Code:{0:d}]", duRetCode)); return; } duRetCode = CAXM.AxmHomeSetStart(m_nAxisNumber); if (duRetCode != (uint)AXT_FUNC_RESULT.AXT_RT_SUCCESS) { MessageBox.Show(String.Format("AxmHomeSetStart return error[Code:{0:d}]", duRetCode)); return; } m_eStat = eAxis.eHome; } }