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.
TwoLaserHead-PushJig/LaiPuLaser/Motor.h

114 lines
5.7 KiB
C++

#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;//光栅尺反向
};