#pragma once #include "PciCh365Mgr.h" #include "Module.h" #include "Observer.h" #include "EnumPropertieType.h" #include "Subject.h" #define MOTOR_X _T("X") //电机X #define MOTOR_X2 _T("X2") //电机X2 #define MOTOR_Y _T("Y") //电机Y #define MOTOR_Z _T("Z") //电机Z //电机马达类 class CMotor :public CModule,public CObserver,public CSubject { public: CMotor(CString Name); virtual ~CMotor(void); virtual void Ini(); virtual MODULE GetModuleType(){return _MOTOR_PROP;}; virtual void ExportPar(ofstream *pFile); virtual CMFCPropertyGridProperty *CreatGridProperty(); virtual void Update();//收到属性变化的处理 public: void SetPciPortType(CString DirPortType,CString PulsePortType,CString LimitPortType_F,CString LimitPortType_N); void SetDirPort(SPciPort Port){m_DirPort = Port;}; void SetPulsePort(SPciPort Port){m_PulsePort = Port;}; bool MoveOnePluse(unsigned int Delay = 0); void SetDir(bool b);//设置方向(b 为true 表示正向) double GetOnePulseDis(){return m_OnePulseDis;}; bool FindOrigin(bool bSavePulseCnt = false); CString Name(){return m_Name;}; bool IsLimitOn(); bool MoveToOriginOffset(double AdjustVal = 0); bool SendSerialPulses(double TotalCnt,double &PulseCnt,unsigned int Delay); unsigned int GetDelay(bool bWork); void MoveByPluse(double PulseCnt,bool bWork); double GetCoord(){return m_Coord;}; double GetCoord2(); void SetCoord(double Coord){m_Coord = Coord;}; void MoveToCoord(double Coord); void MoveDis(double dis); static CMotor *GetMotor(CString Name); void SetMoveDelay(unsigned int n){m_MoveDelay = n;}; void SetWorkDelay(unsigned int n){m_WorkDelay = n;}; double GetOriginOffsetDis(){return m_OriginOffsetDis;}; void SetOriginOffsetDis(double n){m_OriginOffsetDis = n;}; void NeedCheckFiber(){m_bCheckFiber = true;} void SetAsixIdx(int idx){m_AsixIdx = idx;}; int GetAsixIdx(){return m_AsixIdx;}; bool IsbReverseDir(){return m_bReverseDir;}; bool IsbReverseMoveFirst(){return m_bReverseMoveFirst;}; double GetReverseMoveDis(){return m_bReverseMoveDis;}; bool GetFindOriginDir(){return m_FindOriginDir;}; bool IsbRevActCoordDir(){return m_bRevActCoordDir;}; private: void MoveByPluseAccelerate(double PulseCnt,bool bWork); void MoveByPluseNoAccelerate(double PulseCnt,bool bWork); double MoveDeviateLimit(unsigned int Delay); void SetCurLimitPortByDir(bool bForward); void OnMotorLimit(); private: static CMotor *gMotorX;//X 轴电机 static CMotor *gMotorX2;//X 轴电机 static CMotor *gMotorY;//Y 轴电机 static CMotor *gMotorZ;//Z 轴电机 CString m_Name;//马达的名字 CString m_DirPortType;//方向 CString m_PulsePortType;//脉冲 CString m_LimitPortType_F;//正限位 CString m_LimitPortType_N;//负限位 int m_AsixIdx;//在运动控制卡中的编号 //pci 卡端口参数-------------------------------------------------------- SPciPort m_DirPort;//方向端口 SPciPort m_PulsePort;//脉冲端口 SPciPort m_LimitPort_F;//正限位端口 SPciPort m_LimitPort_N;//负限位端口 SPciPort m_OriginPort;//原点端口 SPciPort m_CurLimitPort;//当前需要检查的限位端口 //UPK CO2 用的对射光纤 bool m_bCheckFiber;//时候检测光纤 SPciPort m_FiberPort1;//光纤端口1 SPciPort m_FiberPort2;//光纤端口2 //需要保存的参数----------------------------------------------------- double m_OnePulseDis;//一个脉冲的理论移动距离(mm) //找原点参数----------------------------------------------------- bool m_FindOriginDir;//找原点的方向(true 为向正,false 为向负) double m_OriginOffsetDis;//原点的反方向移动距离(mm) double m_MaxOriginOffsetDis;//原点的反方向最大移动距离(mm) -- 主要是保护硬件 double m_MaxPulseCnt;//找原点时最大脉冲,目的是为了防止硬件故障造成死循环 int m_FindOriginDelay;//找到原点后的等待延时(ms) 避免伺服电机的纠正过程 unsigned int m_ReverseMoveDelay;//找到光电开关后反方向移动的延时us (直到关电开关为OFF ) bool m_bReverseMoveFirst;//找原点之前是否先反向移动一段距离 double m_bReverseMoveDis;//找原点之前先反向移动的距离mm //速度参数-------------------------------------------------------------- unsigned int m_MoveDelay;//空移延时us unsigned int m_WorkDelay;//正常工作时脉冲延时us unsigned int m_OriginPulseDelay;//初始化找原点脉冲延时us bool m_bNeedCheckLimit;//电机在运行时刻是否检查限位开关 //加减速控制----------------------------------------------------------- bool m_bAccelerateCtrl;//是否加减速控制 unsigned int m_StartDelay;//初始速度延时us unsigned int m_PerChangeDelay;//每次改变的延时us //坐标管理----------------------------------------------------------- double m_Coord;//电机单轴的坐标值(mm) bool m_bReverseDir;//是否反向 bool m_bRevActCoordDir;//光栅尺反向 };