#include "StdAfx.h" #include "PlatformXY.h" #include "LogMgr.h" #include "PciPortMgr.h" #include "Propertie.h" #include "PropertieMgr.h" #include "AuthorityMgr.h" #include "GlobalDrawMgr.h" #include "DrawSimpleShape.h" #include "ExceptionMsg.h" #include "ObjComponentMgr.h" #include "DeviceState.h" #include "WorkCmdMovePlatformXY.h" #include "MsgBox.h" #include "WorkCmdInvoker.h" #include "MotionCard_PCI1245.h" #include "WorkCmdSetMotorSpeed.h" #include "WorkCmdWaitMotorStop.h" #include "WorkCmdMoveMotor.h" #include "Program_SZ_XL.h" //电机速度校准文件 #define MOTOR_SPEED_FILE_X _T("\\Parameter\\PlatformXY\\MotorSpeedX.txt") #define MOTOR_SPEED_FILE_Y _T("\\Parameter\\PlatformXY\\MotorSpeedY.txt") CPlatformXY *gPlatformXY = NULL; CPlatformXY::CPlatformXY(CMotor &MotorX,CMotor &MotorY) :m_MotorX(MotorX),m_MotorY(MotorY) { m_bBresenhamAlgorithm = false;//是否使用直线算法来移动 m_bUsed = false;//是否使用平台 m_MaxDisL = 0;//左边最大行程 m_MaxDisR = 0;//右边最大行程 m_MaxDisU = 0;//上边最大行程 m_MaxDisD = 0;//下边最大行程 m_MoveDelay = 200;//平台移动延时us m_MoveOrder = 0; m_bSpeedCtrl = false;//是否使用平台运动速度控制(mm/s) m_WorkSpeed = 40;//加工速度(mm/s) m_MoveSpeed = 40;//空移速度(mm/s) m_MoveNeedDeviceIni = true;//是否需要设备初始化后才能手动移动 m_XY_Angle = 0;//XY 轴的夹角(360 度角) m_bMoveToRealCoord = false;//是否移动到实际的坐标位置,应对平台有安装角度的情况 m_bUseMoveRange = true;//是否使用范围限制 m_MaxMoveDis = 10;//一次最大的移动距离 m_bUseManualMoveDis = true;//是否使用手调整量 m_MaxManualMoveDis =5;//最大的手动移动量(在这个正负范围之内) m_InitMotorX = true;//是否初始化X 轴 m_InitMotorY = true;//是否初始化Y 轴 m_bLockManualMoveDis = false;//锁定手动微调值 m_UserMaxMoveDis = 5;//操作员一次最大的移动距离mm } CPlatformXY::~CPlatformXY(void) { } #if 1 CMFCPropertyGridProperty *CPlatformXY::CreatGridProperty() { CString PropertyName;//属性名称 CString Description;//描述 CString Path = _T("PlatformXY");//存储路径 CString Name; //-------------------------------------------------------------------------------// PropertyName = _T("平台"); CMFCPropertyGridProperty* pGroup = new CMFCPropertyGridProperty(PropertyName); //-------------------------------------------------------------------------------// if(gAuthorityMgr->CheckAuthority(_FACTORY)) { { //添加属性变量映射 Name = _T("m_bUsed");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_bUsed); pPropertie->SetType(_PROP_TYPE_BOOL); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("使用平台"); Description = _T("是否使用电机平台"); CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_bUsed, Description); pGroup->AddSubItem(p1); gDevicePropertieMgr.Insert(p1, pPropertie); } { //添加属性变量映射 Name = _T("m_MoveNeedDeviceIni");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_MoveNeedDeviceIni); pPropertie->SetType(_PROP_TYPE_BOOL); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("需要初始化"); Description = _T("是否需要初始化设备后才能手动移动平台"); CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_MoveNeedDeviceIni, Description); pGroup->AddSubItem(p1); gDevicePropertieMgr.Insert(p1, pPropertie); } { //添加属性变量映射 Name = _T("m_InitMotorX");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_InitMotorX); pPropertie->SetType(_PROP_TYPE_BOOL); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("初始化X 轴"); Description = _T("是否初始化X 轴"); CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_InitMotorX, Description); pGroup->AddSubItem(p1); gDevicePropertieMgr.Insert(p1, pPropertie); } { //添加属性变量映射 Name = _T("m_InitMotorY");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_InitMotorY); pPropertie->SetType(_PROP_TYPE_BOOL); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("初始化Y 轴"); Description = _T("是否初始化Y 轴"); CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_InitMotorY, Description); pGroup->AddSubItem(p1); gDevicePropertieMgr.Insert(p1, pPropertie); } { //添加属性变量映射 Name = _T("m_MoveDelay");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_MoveDelay); pPropertie->SetType(_PROP_TYPE_INT); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("平台移动延时"); Description = _T("平台移动到位的等待延时,避免晃动(单位:us)"); CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_MoveDelay, Description); pGroup->AddSubItem(p1); gDevicePropertieMgr.Insert(p1, pPropertie); } { //添加属性变量映射 Name = _T("m_bBresenhamAlgorithm");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_bBresenhamAlgorithm); pPropertie->SetType(_PROP_TYPE_BOOL); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("直线算法"); Description = _T("平台移动是否使用直线算法"); CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_bBresenhamAlgorithm, Description); pGroup->AddSubItem(p1); gDevicePropertieMgr.Insert(p1, pPropertie); } { //添加属性变量映射 Name = _T("m_ProductPoint_x");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_ProductPoint.x); pPropertie->SetType(_PROP_TYPE_DOUBLE); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("取料点X"); Description = _T("取料点X 坐标"); CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_ProductPoint.x, Description); pGroup->AddSubItem(p1); gDevicePropertieMgr.Insert(p1, pPropertie); } { //添加属性变量映射 Name = _T("m_ProductPoint_y");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_ProductPoint.y); pPropertie->SetType(_PROP_TYPE_DOUBLE); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("取料点Y"); Description = _T("取料点Y 坐标"); CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_ProductPoint.y, Description); pGroup->AddSubItem(p1); gDevicePropertieMgr.Insert(p1, pPropertie); } { //添加属性变量映射 Name = _T("m_bMoveToRealCoord");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_bMoveToRealCoord); pPropertie->SetType(_PROP_TYPE_BOOL); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("实际坐标"); Description = _T("移动是否考虑平台角度,理论坐标校准为实际坐标"); CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_bMoveToRealCoord, Description); pGroup->AddSubItem(p1); gDevicePropertieMgr.Insert(p1, pPropertie); } { //添加属性变量映射 Name = _T("m_XY_Angle");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_XY_Angle); pPropertie->SetType(_PROP_TYPE_DOUBLE); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("XY 轴夹角"); Description = _T("电机XY 轴的夹角(360 度角)"); CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_XY_Angle, Description); pGroup->AddSubItem(p1); gDevicePropertieMgr.Insert(p1, pPropertie); } { //添加属性变量映射 Name = _T("m_bUseManualMoveDis");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_bUseManualMoveDis); pPropertie->SetType(_PROP_TYPE_BOOL); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("使用微调功能"); Description = _T("是否使用当前的微调值来调整对象的移动位置"); CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_bUseManualMoveDis, Description); pGroup->AddSubItem(p1); gDevicePropertieMgr.Insert(p1, pPropertie); } { //添加属性变量映射 Name = _T("m_MaxManualMoveDis");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_MaxManualMoveDis); pPropertie->SetType(_PROP_TYPE_DOUBLE); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("最大微调量"); Description = _T("最大手动微调量"); CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_MaxManualMoveDis, Description); pGroup->AddSubItem(p1); gDevicePropertieMgr.Insert(p1, pPropertie); } } { CMFCPropertyGridProperty* pGroup1 = new CMFCPropertyGridProperty(_T("平台范围")); if(gAuthorityMgr->CheckAuthority(_FACTORY)) { //添加属性变量映射 Name = _T("m_MaxMoveDis");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_MaxMoveDis); pPropertie->SetType(_PROP_TYPE_DOUBLE); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("最大手动距离"); Description = _T("手动移动平台一次最大的移动距离(mm)"); CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_MaxMoveDis, Description); pGroup1->AddSubItem(p); gDevicePropertieMgr.Insert(p, pPropertie); } if(gAuthorityMgr->CheckAuthority(_FACTORY)) { //添加属性变量映射 Name = _T("m_UserMaxMoveDis");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_UserMaxMoveDis); pPropertie->SetType(_PROP_TYPE_DOUBLE); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("操作限制距离"); Description = _T("非厂家权限一次最大移动距离(mm)"); CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_UserMaxMoveDis, Description); pGroup1->AddSubItem(p); gDevicePropertieMgr.Insert(p, pPropertie); } if(gAuthorityMgr->CheckAuthority(_FACTORY)) { //添加属性变量映射 Name = _T("m_bUseMoveRange");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_bUseMoveRange); pPropertie->SetType(_PROP_TYPE_DOUBLE); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("使用范围限制"); Description = _T("是否限制平台的移动范围"); CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_bUseMoveRange, Description); pGroup1->AddSubItem(p); gDevicePropertieMgr.Insert(p, pPropertie); } if(gAuthorityMgr->CheckAuthority(_FACTORY)) { //添加属性变量映射 Name = _T("m_MaxDisL");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_MaxDisL); pPropertie->SetType(_PROP_TYPE_DOUBLE); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("左边最大行程"); Description = _T("从原点位置开始X 轴左边最大行程"); CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_MaxDisL, Description); pGroup1->AddSubItem(p); gDevicePropertieMgr.Insert(p, pPropertie); } if(gAuthorityMgr->CheckAuthority(_FACTORY)) { //添加属性变量映射 Name = _T("m_MaxDisR");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_MaxDisR); pPropertie->SetType(_PROP_TYPE_DOUBLE); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("右边最大行程"); Description = _T("从原点位置开始X 轴右边最大行程"); CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_MaxDisR, Description); pGroup1->AddSubItem(p); gDevicePropertieMgr.Insert(p, pPropertie); } if(gAuthorityMgr->CheckAuthority(_FACTORY)) { //添加属性变量映射 Name = _T("m_MaxDisU");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_MaxDisU); pPropertie->SetType(_PROP_TYPE_DOUBLE); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("上边最大行程"); Description = _T("从原点位置开始Y 轴上边最大行程"); CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_MaxDisU, Description); pGroup1->AddSubItem(p); gDevicePropertieMgr.Insert(p, pPropertie); } if(gAuthorityMgr->CheckAuthority(_FACTORY)) { //添加属性变量映射 Name = _T("m_MaxDisD");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_MaxDisD); pPropertie->SetType(_PROP_TYPE_DOUBLE); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("下边最大行程"); Description = _T("从原点位置开始Y 轴下边最大行程"); CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_MaxDisD, Description); pGroup1->AddSubItem(p); gDevicePropertieMgr.Insert(p, pPropertie); } pGroup->AddSubItem(pGroup1); } { CMFCPropertyGridProperty* pGroup1 = new CMFCPropertyGridProperty(_T("运动速度")); if(gAuthorityMgr->CheckAuthority(_FACTORY)) { //添加属性变量映射 Name = _T("m_bSpeedCtrl");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_bSpeedCtrl); pPropertie->SetType(_PROP_TYPE_BOOL); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("mm/s 方式"); Description = _T("是否使用平台运动速度控制(mm/s)"); CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_bSpeedCtrl, Description); pGroup1->AddSubItem(p); gDevicePropertieMgr.Insert(p, pPropertie); } if(gAuthorityMgr->CheckAuthority(_FACTORY)) { //添加属性变量映射 Name = _T("m_WorkSpeed");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_WorkSpeed); pPropertie->SetType(_PROP_TYPE_DOUBLE); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("加工速度"); Description = _T("加工速度(mm/s)"); CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_WorkSpeed, Description); pGroup1->AddSubItem(p); gDevicePropertieMgr.Insert(p, pPropertie); } if(gAuthorityMgr->CheckAuthority(_FACTORY)) { //添加属性变量映射 Name = _T("m_MoveSpeed");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_MoveSpeed); pPropertie->SetType(_PROP_TYPE_DOUBLE); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("空移速度"); Description = _T("空移速度(mm/s)"); CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_MoveSpeed, Description); pGroup1->AddSubItem(p); gDevicePropertieMgr.Insert(p, pPropertie); } pGroup->AddSubItem(pGroup1); } //-------------------------------------------------------------------------------// return pGroup; } void CPlatformXY::ExportPar(ofstream *pFile) { (*pFile)<<"[模块] [CPlatformXY]------------------------------------------------"<=0) { bSendY = true; error = error - 2*PulseCntX; } error = error +2*PulseCntY; } //x 发送数量肯定是准的 //Y 的数量由于计算误差可能会少一个 if(TallyYWriteDebugLog(str); if(MotorY.MoveOnePluse(MotorY.GetDelay(bWork))==false) { return false;//撞到限位 } } return true; } //移动指定的距离(dis 的单位是毫米) bool CPlatformXY::MoveDistance(double dis,DIRECTION dir,bool bSaveCoord) { //获取当前坐标 Dbxy MovePt = GetCoord(); Dbxy TargetPt; switch(dir) { case _DIR_L: MovePt.x -= dis; break; case _DIR_R: MovePt.x += dis; break; case _DIR_U: MovePt.y += dis; break; case _DIR_D: MovePt.y -= dis; break; default: return true; break; } return Move(false,TargetPt,MovePt,bSaveCoord); } //移动指定的脉冲个数(不记录坐标) bool CPlatformXY::MovePulseCnt(int Cnt,DIRECTION dir) { if(Cnt<=0) return true; //设置方向 SetMoveDir(dir); int PulseCntX = 0; int PulseCntY = 0; switch(dir) { case _DIR_L: PulseCntX = Cnt*(-1); break; case _DIR_R: PulseCntX = Cnt; break; case _DIR_U: PulseCntY = Cnt; break; case _DIR_D: PulseCntY = Cnt*(-1); break; default: break; } if(PulseCntX<0) { PulseCntX *= -1; } if(PulseCntY<0) { PulseCntY *= -1; } //平台移动 m_MotorX.MoveByPluse((double)PulseCntX,false); m_MotorY.MoveByPluse((double)PulseCntY,false); return true; } void CPlatformXY::SetMoveDir(DIRECTION dir) { switch(dir) { case _DIR_L: m_MotorX.SetDir(false); break; case _DIR_R: m_MotorX.SetDir(true); break; case _DIR_U: m_MotorY.SetDir(true); break; case _DIR_D: m_MotorY.SetDir(false); break; default: return; break; } } //根据移动点来设置移动的方向 void CPlatformXY::SetMoveDir(Dbxy MovePt,Dbxy TargetPt) { Dbxy Coord = GetCoord(); bool bDirX = false;//负向 bool bDirY = false;//负向 if((TargetPt.x - (MovePt.x+Coord.x))>0) { bDirX = true; } if((TargetPt.y - (MovePt.y+Coord.y))>0) { bDirY = true; } if(!gLogMgr->IsDebuging())//调试状态 { m_MotorX.SetDir(bDirX); m_MotorY.SetDir(bDirY); } } //理论坐标系的坐标pt 转换为平台的实际坐标 Dbxy CPlatformXY::TheoryCoor2RealCoord(Dbxy pt) { double Angle = _360ToAngle(m_XY_Angle); Dbxy CenterPt(0,0);//相对于平台的坐标原点 Dbxy RealPt = RotatoPt(pt,Angle,CenterPt); return RealPt; } //移动MovePt 点到TargetPt 点(bSaveCoord 表示是否要记录移动的坐标(默认是要记录的)) //MovePt 和TargetPt都是相对于平台原点的坐标值 //bWork 表示工作或者空移 bool CPlatformXY::Move(bool bWork,Dbxy MovePt,Dbxy TargetPt,bool bSaveCoord) { if(!m_bUsed) return true; //移动前 OnPlatformMoveStart(); //按实际位置移动 if(m_bMoveToRealCoord) { //MovePt 和TargetPt 都是理论坐标系的坐标 //当平台有角度时平台移动的位置会有偏移 //理论坐标系的坐标pt 转换为平台的实际坐标 MovePt = TheoryCoor2RealCoord(MovePt); TargetPt = TheoryCoor2RealCoord(TargetPt); } //使用研华运动控制卡控制平台 if(gMotionCard_PCI1245->IsbUsed()) { Dbxy Coord = GetTargetCoord(MovePt,TargetPt);//平台的目标坐标点 //检查坐标的安全性(抛出异常) CheckCoordRange(Coord); Coord = gMotionCard_PCI1245->MovePlatformXY(Coord); #if 0 //设置新的坐标 if(bSaveCoord)//因为平台补偿的是否不需要记录坐标值 { m_Coord = Coord; //通知观察者平台坐标变化了 NotifyObservers(); } #endif } OnPlatformMoveEnd(); return true; } //设置当前位置为平台的坐标原点 void CPlatformXY::SetCurPosOrigin() { Dbxy pt(0,0); gMotionCard_PCI1245->SetCurGpIdx(0); SetCoord(pt); //切换组再设置一次 gMotionCard_PCI1245->SetCurGpIdx(1); SetCoord(pt); CString str1 = _T("[func][SetCurPosOrigin] [设置当前位置为工作原点]"); gLogMgr->WriteDebugLog(str1); } Dbxy CPlatformXY::GetTargetCoord(Dbxy MovePt,Dbxy TargetPt) { Dbxy Coord;//平台的目标坐标点 Coord.x = TargetPt.x - MovePt.x; #ifdef __CUSTOM_SW_XL__ Coord.y = MovePt.y -TargetPt.y; #else Coord.y = TargetPt.y - MovePt.y; #endif return Coord; } //检查坐标的安全性(抛出异常) void CPlatformXY::CheckCoordRange(Dbxy Coord) { //检查新坐标的安全性------------------------------------------ if(m_bUseMoveRange && IsPointInRect(Coord,GetRect())==false) { CString str = _T("电机不能移动到安全范围外!"); CExceptionMsg Msg; Msg.SetMsg(str); throw Msg; } } //设置新的坐标 void CPlatformXY::SetCoord(Dbxy pt) { m_Coord = pt; gMotionCard_PCI1245->SetCoord(pt); //通知观察者平台坐标变化了 NotifyObservers(); } //移动到指定坐标 void CPlatformXY::MoveToPt(Dbxy MovePt,Dbxy TargetPt) { gLogMgr->WriteDebugLog("MovePt.x","",MovePt.x); gLogMgr->WriteDebugLog("MovePt.y","",MovePt.y); Move(false,MovePt,TargetPt); } //手动步进移动平台 void CPlatformXY::ManualMovePlatForm(bool bMoveByDis,double MoveDis,DIRECTION MoveDir) { //自动运行中禁止移动 if(gProgram_SZ_XL->IsbAutoWorking()) return; //非厂家权限限制移动距离 if(gAuthorityMgr->CheckAuthority(_FACTORY,false)==false) { if(fabs(MoveDis)>m_UserMaxMoveDis) { CString s; s.Format("一次只能移动%.3f",m_UserMaxMoveDis); CMsgBox MsgBox; MsgBox.Show(s); return; } } CDeviceState &DeviceState = CDeviceState::GetInstance(); bool IniState = DeviceState.IsDeviceIni(); DeviceState.SetIniState(true);//强制初始化成功 //需要初始化后才能移动平台 if(IsMoveNeedDeviceIni()) { if(DeviceState.IsDeviceIni()==false) { CMsgBox MsgBox; MsgBox.Show("设备未初始化!"); return; } } if(bMoveByDis) { double Max = m_MaxMoveDis;//一次最大移动距离 if(MoveDis>Max) { CMsgBox MsgBox; CString str; str.Format(_T("每次最多只能移动%f (mm)"),Max); MsgBox.Show(str); return; } } CWorkCmdContainer CmdContainer; //设置电机速度 { CWorkCmdSetMotorSpeed *pCmd = new CWorkCmdSetMotorSpeed(); pCmd->SetbSetMotorX(); pCmd->SetbSetMotorX2(); pCmd->SetbSetMotorY(); pCmd->SetSpeedType(_SpeedType_Move); CmdContainer.AddCmd(pCmd); } //移动 { CMotor *pMotor = CMotor::GetMotor(MOTOR_Y); if(MoveDir == _DIR_L ||MoveDir == _DIR_R ) { if(gMotionCard_PCI1245->GetCurGpIdx()==0) pMotor = CMotor::GetMotor(MOTOR_X); else pMotor = CMotor::GetMotor(MOTOR_X2); } if(MoveDir == _DIR_L || MoveDir == _DIR_D) MoveDis *= (-1); CWorkCmdMoveMotor *pCmd = new CWorkCmdMoveMotor(*pMotor,MoveDis); pCmd->SetMoveFlg(true);//按距离移动 CmdContainer.AddCmd(pCmd); } //等待移动结束 { CWorkCmdWaitMotorStop *pCmd = new CWorkCmdWaitMotorStop(); if(MoveDir == _DIR_L ||MoveDir == _DIR_R ) { if(gMotionCard_PCI1245->GetCurGpIdx()==0) pCmd->SetbWaitMotorX(); else pCmd->SetbWaitMotorX2(); } else { pCmd->SetbWaitMotorY(); } CmdContainer.AddCmd(pCmd); } CWorkCmdInvoker WorkInvoker;//工作调度者 WorkInvoker.Excute(CmdContainer); //通知观察者平台坐标变化了 NotifyObservers(); DeviceState.SetIniState(IniState);//恢复初始化状态 } //平台是否在取料点上 bool CPlatformXY::IsAtProductPoint() { return (m_ProductPoint==m_Coord); } //设置当前点为取料点 void CPlatformXY::SetCurPosAsProductPt() { CMsgBox MsgBox; if(MsgBox.ConfirmOkCancel("设置当前点为取料点?")) { m_ProductPoint = m_Coord; gLogMgr->WriteDebugLog("Fuc---->SetCurPosAsProductPt"); } } //移动到取料点 void CPlatformXY::MoveToWorkPt() { CDeviceState &DeviceState = CDeviceState::GetInstance(); if(!DeviceState.CheckInitState()) return; vector CmdVec; CmdVec.push_back(_T("CmdName[CMD_PLATFORM_MOVE] Par1[TO_WORK_PT]")); CWorkCmdInvoker Invoker; Invoker.ExcuteCmd(CmdVec); } void CPlatformXY::MoveToOriginPt() { CDeviceState &DeviceState = CDeviceState::GetInstance(); if(!DeviceState.CheckInitState()) return; vector CmdVec; CmdVec.push_back(_T("CmdName[CMD_PLATFORM_MOVE] Par1[TO_ORIGIN]")); CWorkCmdInvoker Invoker; Invoker.ExcuteCmd(CmdVec); } //初始化平台(bConfirm 表示是否弹出提示) void CPlatformXY::IniPlat(bool bConfirm) { if(bConfirm) { CMsgBox MsgBox; if(MsgBox.ConfirmOkCancel(_T("初始化平台?"))==false) return; } OnPlatformMoveStart(); vector CmdVec; if(m_InitMotorX) { CmdVec.push_back(_T("CmdName[CMD_MOTOR_TO_MACHINE_ORIGIN] Par1[X]")); } if(m_InitMotorY) { CmdVec.push_back(_T("CmdName[CMD_MOTOR_TO_MACHINE_ORIGIN] Par1[Y]")); CmdVec.push_back(_T("CmdName[CMD_MOTOR_TO_OFFSET_POS] Par1[Y]")); } if(m_InitMotorX) { CmdVec.push_back(_T("CmdName[CMD_MOTOR_TO_OFFSET_POS] Par1[X]")); } CmdVec.push_back(_T("CmdName[CMD_DEVICE_PAR_RESET]")); CWorkCmdInvoker Invoker; Invoker.ExcuteCmd(CmdVec); OnPlatformMoveEnd(); } //移动平台之前的操作(主要是要停掉占cpu 的工作) void CPlatformXY::OnPlatformMoveStart() { } void CPlatformXY::OnPlatformMoveEnd() { } #if 1 //重置手动微调量 void CPlatformXY::ResetManualMoveDis() { m_ManualMoveDis.x = m_ManualMoveDis.y = 0; } //记录手动移动量 void CPlatformXY::SaveManualMoveDis(double MoveDis,DIRECTION MoveDir) { if(m_bLockManualMoveDis)//锁定状态 return; switch(MoveDir) { case _DIR_L: m_ManualMoveDis.x -= MoveDis; break; case _DIR_R: m_ManualMoveDis.x += MoveDis; break; case _DIR_U: m_ManualMoveDis.y += MoveDis; break; case _DIR_D: m_ManualMoveDis.y -= MoveDis; break; default: return; break; } //保证在限定范围之内 if(m_ManualMoveDis.x>m_MaxManualMoveDis) m_ManualMoveDis.x = m_MaxManualMoveDis; else if(m_ManualMoveDis.x < m_MaxManualMoveDis*(-1)) m_ManualMoveDis.x = m_MaxManualMoveDis*(-1); if(m_ManualMoveDis.y>m_MaxManualMoveDis) m_ManualMoveDis.y = m_MaxManualMoveDis; else if(m_ManualMoveDis.y < m_MaxManualMoveDis*(-1)) m_ManualMoveDis.y = m_MaxManualMoveDis*(-1); } #endif //获取XY 轴一个像素移动的距离 Dbxy CPlatformXY::GetMotorXYOnePulseDis() { Dbxy MotorXYOnePulseDis; MotorXYOnePulseDis.x = m_MotorX.GetOnePulseDis(); MotorXYOnePulseDis.y = m_MotorY.GetOnePulseDis(); return MotorXYOnePulseDis; }