|
|
#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<CLab> &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; |