You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

112 lines
5.3 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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