public bool Init() { int iRet = 0; //포트 혹시 안열려 있으면 열고 열렸으면 리스트에 넣어둠. if (Para.iPortNo != 0 && !OpenPorts.Contains(Para.iPortNo)) //포트아이디가 0인경우 아직 세팅 안한상태. { //여기서 뻑나면 dll위치와 dll이름 64 32비트 여부 확인 //iRet = EziMOTIONPlusRLib.FAS_OpenPort((byte)Para.iPortNo, 115200) ; iRet = EziMOTIONPlusRLib.FAS_Connect((byte)Para.iPortNo, 115200); if (iRet == 0) { if (!bDisplayedErr) { bDisplayedErr = true; Log.ShowMessage("EzServoPlusR", Para.iPortNo.ToString() + "Port Open Failed!"); } return(false); } OpenPorts.Add(Para.iPortNo); } if (EziMOTIONPlusRLib.FAS_IsSlaveExist((byte)Para.iPortNo, (byte)Para.iMotorID) == 0) { return(false); } m_bConnected = true; return(true); }
/// <summary> /// 현재 파라미터들을 아진 함수를 이용하여 세팅함. /// </summary> public void ApplyPara(double _dPulsePerUnit) { m_dPulsePerUnit = _dPulsePerUnit; //포트관련. 원래 있던 포트는 다른애가 쓸수도 있어서 그냥 냅둔다. //한번 여기 타면 파일에 저장 되어서 다음에 켤때는 생성 안됌. if (!OpenPorts.Contains(Para.iPortNo)) { m_bConnected = false; Init(); } if (!m_bConnected) { return; } int iRet = 0; iRet = EziMOTIONPlusRLib.FAS_SetParameter((byte)Para.iPortNo, (byte)Para.iMotorID, 0, (int)9); //레졸루션 10000 ; iRet = EziMOTIONPlusRLib.FAS_SetParameter((byte)Para.iPortNo, (byte)Para.iMotorID, 1, (int)500000); //맥스스피드. iRet = EziMOTIONPlusRLib.FAS_SetParameter((byte)Para.iPortNo, (byte)Para.iMotorID, 2, (int)1); //시작스피드 iRet = EziMOTIONPlusRLib.FAS_SetParameter((byte)Para.iPortNo, (byte)Para.iMotorID, 26, (int)0); //인포지션밸류. iRet = EziMOTIONPlusRLib.FAS_SetParameter((byte)Para.iPortNo, (byte)Para.iMotorID, 28, Para.bDirection?1:0); //모터방향. }
/// <summary> /// Command Encoder Target포지션 세팅. /// </summary> /// <param name="_dPos">세팅할 펄스</param> public void SetPos(double _dPos) { int iCmdPos = (int)_dPos; int iRet = 0; iRet = EziMOTIONPlusRLib.FAS_SetCommandPos((byte)Para.iPortNo, (byte)Para.iMotorID, iCmdPos); iRet = EziMOTIONPlusRLib.FAS_SetActualPos((byte)Para.iPortNo, (byte)Para.iMotorID, iCmdPos); }
/// <summary> /// 리셑 시그널 온오프 제어 /// </summary> /// <param name="_bOn">온오프</param> public void SetReset(bool _bOn) { int iRet = 0; if (_bOn) { iRet = EziMOTIONPlusRLib.FAS_ServoAlarmReset((byte)Para.iPortNo, (byte)Para.iMotorID); } }
/// <summary> /// -방향 조그 이동 /// </summary> /// <param name="_dVel">초당 구동 속도 펄스</param> /// <param name="_dAcc">구동 가속율 펄스</param> /// <param name="_dDec">감속율 펄스</param> public void JogN(double _dVel, double _dAcc, double _dDec) { Stat.bJogP = false; EziMOTIONPlusRLib.VELOCITY_OPTION_EX Option = new EziMOTIONPlusRLib.VELOCITY_OPTION_EX(); Option.BIT_USE_CUSTOMACCDEC = true; Option.wCustomAccDecTime = (ushort)(_dVel * 1000 / _dAcc); int iRet = 0; iRet = EziMOTIONPlusRLib.FAS_MoveVelocityEx((byte)Para.iPortNo, (byte)Para.iMotorID, (uint)_dVel, 0, Option); }
/// <summary> /// 홈센서 기준 절대 위치로 이동. /// </summary> /// <param name="_dPos">이동할 위치 펄스단위</param> /// <param name="_dVel">이동할 속도 펄스단위</param> /// <param name="_dAcc">이동할 가속 펄스단위</param> /// <param name="_dDec">이동할 감속 펄스단위</param> /// <returns>성공여부</returns> public void GoAbs(double _dPos, double _dVel, double _dAcc, double _dDec) { Stat.iTrgPos = (int)_dPos; EziMOTIONPlusRLib.MOTION_OPTION_EX Option = new EziMOTIONPlusRLib.MOTION_OPTION_EX(); Option.BIT_USE_CUSTOMACCEL = true; Option.BIT_USE_CUSTOMDECEL = true; Option.wCustomAccelTime = (ushort)(_dVel * 1000 / _dAcc); Option.wCustomDecelTime = (ushort)(_dVel * 1000 / _dDec); int iRet = 0; iRet = EziMOTIONPlusRLib.FAS_MoveSingleAxisAbsPosEx((byte)Para.iPortNo, (byte)Para.iMotorID, (int)_dPos, (uint)_dVel, Option); }
/// <summary> /// 종료 함수 /// </summary> /// <returns>종료 성공여부</returns> public bool Close() { m_bConnected = false; if (Para.iPortNo != 0 && OpenPorts.Contains(Para.iPortNo)) //포트아이디가 0인경우 아직 세팅 안한상태. { EziMOTIONPlusRLib.FAS_Close((byte)Para.iPortNo); OpenPorts.Remove(Para.iPortNo); } return(false); }
/// <summary> /// 홈을 수행한다. /// </summary> /// <returns>수행 성공여부.</returns> public bool GoHome(double _dHomeVelFirst, double _dHomeVelLast, double _dHomeAccFirst) { int iRet = 0; iRet = EziMOTIONPlusRLib.FAS_SetParameter((byte)Para.iPortNo, (byte)Para.iMotorID, 17, (int)_dHomeVelFirst); //홈속도 iRet = EziMOTIONPlusRLib.FAS_SetParameter((byte)Para.iPortNo, (byte)Para.iMotorID, 18, (int)_dHomeVelLast); //홈 엣지스캔속도 iRet = EziMOTIONPlusRLib.FAS_SetParameter((byte)Para.iPortNo, (byte)Para.iMotorID, 19, (int)(1000 * _dHomeVelFirst / _dHomeAccFirst)); //홈 가감속 시간. int iVal = (int)Para.eHomeMethode; iRet = EziMOTIONPlusRLib.FAS_SetParameter((byte)Para.iPortNo, (byte)Para.iMotorID, 20, iVal); //홈 잡는 방법. ?? 좀 이상하다 ;; iRet = EziMOTIONPlusRLib.FAS_SetParameter((byte)Para.iPortNo, (byte)Para.iMotorID, 21, (int)1); //-방향. iRet = EziMOTIONPlusRLib.FAS_SetParameter((byte)Para.iPortNo, (byte)Para.iMotorID, 22, (int)(Para.dHomeOffset * m_dPulsePerUnit)); //홈잡고 오프셑 iRet = EziMOTIONPlusRLib.FAS_SetParameter((byte)Para.iPortNo, (byte)Para.iMotorID, 23, (int)0); //홈잡고 포지션 세팅값. iRet = EziMOTIONPlusRLib.FAS_MoveOriginSingleAxis((byte)Para.iPortNo, (byte)Para.iMotorID); return(iRet == EziMOTIONPlusRLib.FMM_OK); }
/// <summary> /// 홈이 지원 안되는 보드 같은경우 돌려주고 Update 함수 내부에서 처리 해야 한다. /// </summary> public void Update() { if (!m_bConnected) { return; } uint dwOutStatus = 0; uint dwInStatus = 0; uint dwAxisStatus = 0; int lCmdPos = 0; int lActPos = 0; int lPosErr = 0; int lActVel = 0; ushort wPosItemNo = 0; int iRet = 0; iRet = EziMOTIONPlusRLib.FAS_GetAllStatus((byte)Para.iPortNo, (byte)Para.iMotorID, ref dwInStatus, ref dwOutStatus, ref dwAxisStatus, ref lCmdPos, ref lActPos, ref lPosErr, ref lActVel, ref wPosItemNo); if (iRet == EziMOTIONPlusRLib.FMM_OK) { Stat.bHomeSnsr = (dwAxisStatus & 0X00800000) != 0; Stat.bNLimSnsr = (dwAxisStatus & 0X00000004) != 0; Stat.bPLimSnsr = (dwAxisStatus & 0X00000002) != 0; Stat.bAlarmSgnl = (dwAxisStatus & 0X00000001) != 0; Stat.bInPosSgnl = (dwAxisStatus & 0X00080000) != 0; Stat.bZphaseSgnl = (dwAxisStatus & 0X01000000) != 0; Stat.bHomeDone = (dwAxisStatus & 0X02000000) != 0; Stat.bServo = (dwAxisStatus & 0X00100000) != 0; Stat.bRun = lActVel != 0; Stat.bHomming = (dwAxisStatus & 0X00040000) != 0; Stat.iCmdPos = lCmdPos; Stat.iEncPos = lActPos; Stat.iSpeed = lActVel; if (Stat.bJogN || Stat.bJogP) { Stat.iTrgPos = Stat.iCmdPos; } if (!Stat.bRun) { Stat.bJogP = false; Stat.bJogN = false; } } }
/// <summary> /// 모터 감속 무시 긴급정지. /// </summary> public void EmgStop() { int iRet = 0; iRet = EziMOTIONPlusRLib.FAS_EmergencyStop((byte)Para.iPortNo, (byte)Para.iMotorID); }
//Motion Functions. /// <summary> /// 모터 정지 명령. /// </summary> public void Stop() { int iRet = 0; iRet = EziMOTIONPlusRLib.FAS_MoveStop((byte)Para.iPortNo, (byte)Para.iMotorID); }
/// <summary> /// 서보 온오프 /// </summary> /// <param name="_bOn">온오프</param> public void SetServo(bool _bOn) { int iRet = EziMOTIONPlusRLib.FAS_ServoEnable((byte)Para.iPortNo, (byte)Para.iMotorID, _bOn?1:0); }