#pragma once #include "Motor.h" #include "EnumDirection.h" #include "GlobalDefine.h" #include "Module.h" #include "Subject.h" //相对于振镜和激光头,下面会动的部分都是平台 /*数据映射到平台后的坐标是相对于平台原点的 平台移动时数据映射坐标不发生改变 也就是说m_Coord 指的是平台的物理坐标位置,和数据无关*/ /* 平台的理论坐标是标准的笛卡尔坐标,X 轴右为正,Y 轴上为正 */ //xy 平台 class CPlatformXY : public CModule,public CSubject { public: CPlatformXY(CMotor &MotorX,CMotor &MotorY); ~CPlatformXY(void); virtual MODULE GetModuleType(){return _PLATFORM_XY_PROP;}; virtual CMFCPropertyGridProperty *CreatGridProperty(); virtual void WriteWorkFileExt(vector &LabVec); virtual void ReadWorkFile(CLabVecRang &LabVecRang); virtual void Draw(CDC* pDC); virtual void ExportPar(ofstream *pFile); virtual bool Move(bool bWork,Dbxy MovePt,Dbxy TargetPt,bool bSaveCoord = true);//移动到指定坐标点(bSaveCoord 表示是否要记录移动的坐标) public: void SetCurPosOrigin();//设置当前位置为平台的坐标原点 Dbxy GetCoord();//获取当前坐标值(平台的实际坐标,考虑XY 有角度,不一定是理论数据的坐标) Dbxy GetProductPoint(){return m_ProductPoint;}; bool MoveDistance(double dis,DIRECTION dir,bool bSaveCoord = true);//移动指定的距离(bSaveCoord 表示是否要记录移动的坐标) bool MovePulseCnt(int Cnt,DIRECTION dir); int GetMoveDelay(){return m_MoveDelay;}; bool IsAtProductPoint(); void SetMoveOrder(int n){m_MoveOrder = n;}; void AdjustPlatformSpeed(); double GetWorkSpeed(){return m_WorkSpeed;}; void SetWorkSpeed(double s){m_WorkSpeed = s;} double GetMoveSpeed(){return m_MoveSpeed;}; void SetMoveSpeed(double s){m_MoveSpeed = s;} Dbxy GetMotorXYOnePulseDis(); bool IsMoveNeedDeviceIni(){return m_MoveNeedDeviceIni;}; void MoveToPt(Dbxy MovePt,Dbxy TargetPt); void ManualMovePlatForm(bool bMoveByDis,double MoveDis,DIRECTION MoveDir); void SetCurPosAsProductPt(); void MoveToWorkPt(); void MoveToOriginPt(); void IniPlat(bool bConfirm = true); Dbxy GetManualMoveDis(){return m_ManualMoveDis;}; void ResetManualMoveDis(); bool IsUseManualMoveDis(){return m_bUseManualMoveDis;}; void SetbLockManualMoveDis(bool b){m_bLockManualMoveDis = b;}; bool IsbBresenhamAlgorithm(){return m_bBresenhamAlgorithm;}; bool GetbUseMoveRange(){return m_bUseMoveRange;}; void SetbUseMoveRange(bool b){m_bUseMoveRange = b;}; void SetCoord(Dbxy pt); private: void CalPulseCntAndSaveCoord(Dbxy MovePt,Dbxy TargetPt,double &PulseCntX,double &PulseCntY,bool bSaveCoord); bool MoveBresenhamAlgorithm(bool bWork,CMotor &MotorX,double PulseCntX,CMotor &MotorY,double PulseCntY); void SetMoveDir(Dbxy MovePt,Dbxy TargetPt); void SetMoveDir(DIRECTION dir); void SaveCoord(int PulseCntX,int PulseCntY); DbRect GetRect(); Dbxy TheoryCoor2RealCoord(Dbxy pt); void OnPlatformMoveStart(); void OnPlatformMoveEnd(); void SaveManualMoveDis(double MoveDis,DIRECTION MoveDir); Dbxy GetTargetCoord(Dbxy MovePt,Dbxy TargetPt); void CheckCoordRange(Dbxy Coord); private: CMotor &m_MotorX;//X 轴 CMotor &m_MotorY;//Y 轴 Dbxy m_Coord;//平台当前的坐标(单位是毫米) Dbxy m_ProductPoint;//取料点坐标 bool m_bBresenhamAlgorithm;//是否使用直线算法来移动 bool m_bUsed;//是否使用平台 bool m_MoveNeedDeviceIni;//是否需要设备初始化后才能手动移动 double m_MaxMoveDis;//一次最大的移动距离mm double m_UserMaxMoveDis;//操作员一次最大的移动距离mm bool m_bUseMoveRange;//是否使用范围限制 double m_MaxDisL;//左边最大行程 double m_MaxDisR;//右边最大行程 double m_MaxDisU;//上边最大行程 double m_MaxDisD;//下边最大行程 int m_MoveDelay;//平台移动延时us int m_MoveOrder;//移动顺序 0:按长度决定(默认) 1:X 轴先移动 2:Y 轴先移动 (主要为了避免有的设备撞到平台) bool m_bSpeedCtrl;//是否使用平台运动速度控制(mm/s) double m_WorkSpeed;//加工速度(mm/s) double m_MoveSpeed;//空移速度(mm/s) double m_XY_Angle;//XY 轴的夹角(360 度角) bool m_bMoveToRealCoord;//是否移动到实际的坐标位置,应对平台有安装角度的情况 bool m_bUseManualMoveDis;//是否使用手调整量(保存值) bool m_bLockManualMoveDis;//锁定手动微调值 Dbxy m_ManualMoveDis;//记录当前手动微调量 double m_MaxManualMoveDis;//最大的手动移动量(在这个正负范围之内) bool m_InitMotorX;//是否初始化X 轴 bool m_InitMotorY;//是否初始化Y 轴 }; extern CPlatformXY *gPlatformXY;