#include "StdAfx.h" #include "CommonFlowMgr.h" #include "MsgBox.h" #include "WorkCmdInvoker.h" #include "Propertie.h" #include "PropertieMgr.h" #include "AuthorityMgr.h" #include "LogMgr.h" #include "CStringFuc.h" #include "Laser.h" #include "MarkAreaMgr.h" #include "ObjComponentMgr.h" #include "MeasureMgr.h" #include "ExceptionMsg.h" #include "FileMgr.h" #include "DrawSimpleShape.h" #include "LaiPuLaserView.h" #include "Layer.h" #include "ObjContainer.h" #include "WorkRecord.h" #include "EncryptionMgr.h" #include "WorkFileMgr.h" #include "ProgramLaserTuiHuo.h" #include "ProgressMgr.h" #include "WorkCmdTimingProgress.h" #include "TimingProgressMgr.h" #include "WaferRecipeDataMgr.h" #include "CommomText.h" #include "RecipeMgr.h" #include "WaferRecipeDataMgr.h" #include "LaserPowCheckMgr.h" #include "WorkAreaMgr.h" #include "ModuleDeviceMgr.h" #include "CriticalSection.h" UINT AutomationWorkFlowStartThread(LPVOID pParam) { CCommonFlowMgr *p = (CCommonFlowMgr *)pParam; p->StartAutomationWorkFlow(); return 0; } #define MAX_AREA_SIZE 10000 //单个area 的范围最大值 #define NOT_MOVE_Z_COORD 99999 #define ORG_POS_MAX_ADJUST_VAL 10//原点位置单次最大调整量 #define SPOT_METER_LASER_FRE 1000 //测量光斑时的固定激光频率 #define SPOT_METER_LASER_PULSE_DELAY 0 //测量光斑时的固定激光双脉冲延时 CCommonFlowMgr *gCommonFlowMgr = new CCommonFlowMgr; CCommonFlowMgr::CCommonFlowMgr(void) { m_bIniPlatfrom = true;//是否初始化电机平台 m_bIniConfirmMsgBox = true;//是否弹出初始化确认对话框 m_bIniMotorZ = false;//是否初始化电机Z m_bInitedToProductPt = false;//初始化完成后是否返回上料点 m_bSetLightState = true;//是否设置警示灯状态 m_bConnectObj = true;//是否连接多个obj 数据 m_bNeedInit = false;//是否需要初始化才能进行操作 m_bShowErrMsg = true;//运行时出错后对话框提示 m_bStopWorkMsg = true;//点了停止按钮后是否提示对话框 m_bShowStartMsg = true;//在开始加工时是否对话框提示 m_MotorZSafeCoord = 10;//Z 轴的安全坐标位置 m_DrawLineGapCnt = 1;//每间隔几条线绘制一次 m_OneLineScanSpeed = 150;//单条扫描线的速度 m_TransferTestDelay = 10000;//传片测试延时ms m_OneLineAnnealTimeAdjsut = 150;//单条线段退火时间的调整量 m_MoveTestDelay = 300;//移动测试延时ms m_bXyMoveTesting = false; m_bLaserSpotMarkMode = false;//当前是否为打光斑模式 m_LightAlamTime = 10;//蜂鸣器时间 m_bKeepJobN2Air = false;//在job 运行时一直保持吹气 m_bCtrlN2Air = true;//是否控制氮气开关(调试时可以关闭) m_bAutomationWorking = false; m_bStopAutomationWork = false; } CCommonFlowMgr::~CCommonFlowMgr(void) { } CString CCommonFlowMgr::GetParDirName() { CString DirName = _T("CommonFlowMgr"); return DirName; } CMFCPropertyGridProperty * CCommonFlowMgr::CreatGridProperty() { CString PropertyName;//属性名称 CString Description;//描述 CString Path = GetParDirName(); CString Name; CString GroupName; CString ModuleName; //-------------------------------------------------------------------------------// PropertyName = _T("常用流程"); ModuleName = PropertyName; CMFCPropertyGridProperty* pGroup = new CMFCPropertyGridProperty(PropertyName); { { GroupName = ("共通设定"); CMFCPropertyGridProperty* pGroup1 = new CMFCPropertyGridProperty(GroupName); if(gAuthorityMgr->CheckAuthority(_Authority_Factory)) { { //添加属性变量映射 Name = _T("m_bNeedInit");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_bNeedInit); pPropertie->SetType(_PROP_TYPE_BOOL); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("需要初始化"); Description = _T("是否需要初始化才能进行操作"); pPropertie->SetGroupName(GroupName); pPropertie->SetShowName(PropertyName); pPropertie->SetModuleName(ModuleName); CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_bNeedInit, Description); pGroup1->AddSubItem(p); gDevicePropertieMgr.Insert(p, pPropertie); } { //添加属性变量映射 Name = _T("m_DrawLineGapCnt");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_DrawLineGapCnt); pPropertie->SetType(_PROP_TYPE_INT); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("绘制间隔"); Description = _T("每间隔几条线绘制一次,避免有些线段没有显示"); pPropertie->SetGroupName(GroupName); pPropertie->SetShowName(PropertyName); CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_DrawLineGapCnt, Description); pGroup1->AddSubItem(p); gDevicePropertieMgr.Insert(p, pPropertie); } { //添加属性变量映射 Name = _T("m_OneLineAnnealTimeAdjsut");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_OneLineAnnealTimeAdjsut); pPropertie->SetType(_PROP_TYPE_INT); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("加减速时间"); Description = _T("单条线段退火时间的调整量ms"); pPropertie->SetGroupName(GroupName); pPropertie->SetShowName(PropertyName); CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_OneLineAnnealTimeAdjsut, Description); pGroup1->AddSubItem(p); gDevicePropertieMgr.Insert(p, pPropertie); } { //添加属性变量映射 Name = _T("m_bShowStartMsg");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_bShowStartMsg); pPropertie->SetType(_PROP_TYPE_BOOL); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("加工前提示"); Description = _T("在开始加工时是否对话框提示"); pPropertie->SetGroupName(GroupName); pPropertie->SetShowName(PropertyName); CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_bShowStartMsg, Description); pGroup1->AddSubItem(p); gDevicePropertieMgr.Insert(p, pPropertie); } { //添加属性变量映射 Name = _T("m_bShowErrMsg");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_bShowErrMsg); pPropertie->SetType(_PROP_TYPE_BOOL); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("运行时错误"); Description = _T("运行过程中发生错误时弹出对话框提示"); pPropertie->SetGroupName(GroupName); pPropertie->SetShowName(PropertyName); CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_bShowErrMsg, Description); pGroup1->AddSubItem(p); gDevicePropertieMgr.Insert(p, pPropertie); } { //添加属性变量映射 Name = _T("m_bStopWorkMsg");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_bStopWorkMsg); pPropertie->SetType(_PROP_TYPE_BOOL); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("停止提示"); Description = _T("运行过程中点停止是否弹出对话框提示"); pPropertie->SetGroupName(GroupName); pPropertie->SetShowName(PropertyName); CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_bStopWorkMsg, Description); pGroup1->AddSubItem(p); gDevicePropertieMgr.Insert(p, pPropertie); } { //添加属性变量映射 Name = _T("m_LightAlamTime");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_LightAlamTime); pPropertie->SetType(_PROP_TYPE_INT); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("蜂鸣器时间"); Description = _T("蜂鸣器时间"); pPropertie->SetGroupName(GroupName); pPropertie->SetShowName(PropertyName); CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_LightAlamTime, Description); pGroup1->AddSubItem(p); gDevicePropertieMgr.Insert(p, pPropertie); } { //添加属性变量映射 Name = _T("m_MotorZSafeCoord");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_MotorZSafeCoord); pPropertie->SetType(_PROP_TYPE_DOUBLE); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("Z轴安全坐标"); Description = _T("Z轴安全坐标(危险)"); pPropertie->SetGroupName(GroupName); pPropertie->SetShowName(PropertyName); CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_MotorZSafeCoord, Description); pGroup1->AddSubItem(p); gDevicePropertieMgr.Insert(p, pPropertie); } { //添加属性变量映射 Name = _T("m_TransferTestDelay");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_TransferTestDelay); pPropertie->SetType(_PROP_TYPE_INT); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("传片测试延时"); Description = _T("传片测试每片的延时时间ms"); pPropertie->SetGroupName(GroupName); pPropertie->SetShowName(PropertyName); CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_TransferTestDelay, Description); pGroup1->AddSubItem(p1); gDevicePropertieMgr.Insert(p1, pPropertie); } { //添加属性变量映射 Name = _T("m_MoveTestDelay");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_MoveTestDelay); pPropertie->SetType(_PROP_TYPE_INT); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("移动测试延时"); Description = _T("移动测试延时ms"); pPropertie->SetGroupName(GroupName); pPropertie->SetShowName(PropertyName); CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_MoveTestDelay, Description); pGroup1->AddSubItem(p1); gDevicePropertieMgr.Insert(p1, pPropertie); } { //添加属性变量映射 Name = _T("m_bKeepJobN2Air");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_bKeepJobN2Air); pPropertie->SetType(_PROP_TYPE_BOOL); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("Job 持续氮气"); Description = _T("在job 运行时一直保持吹氮气"); pPropertie->SetGroupName(GroupName); pPropertie->SetShowName(PropertyName); CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_bKeepJobN2Air, Description); pGroup1->AddSubItem(p); gDevicePropertieMgr.Insert(p, pPropertie); } { //添加属性变量映射 Name = _T("m_bCtrlN2Air");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_bCtrlN2Air); pPropertie->SetType(_PROP_TYPE_BOOL); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("氮气控制"); Description = _T("是否控制氮气开关(调试时可以关闭)"); pPropertie->SetGroupName(GroupName); pPropertie->SetShowName(PropertyName); CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_bCtrlN2Air, Description); pGroup1->AddSubItem(p); gDevicePropertieMgr.Insert(p, pPropertie); } pGroup->AddSubItem(pGroup1); } } { GroupName = ("设备初始化"); CMFCPropertyGridProperty* pGroup1 = new CMFCPropertyGridProperty(_T("设备初始化")); if(gAuthorityMgr->CheckAuthority(_Authority_Factory)) { { //添加属性变量映射 Name = _T("m_bIniConfirmMsgBox");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_bIniConfirmMsgBox); pPropertie->SetType(_PROP_TYPE_BOOL); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("初始化msgbox"); Description = _T("是否弹出对话框确认"); pPropertie->SetGroupName(GroupName); pPropertie->SetShowName(PropertyName); CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_bIniConfirmMsgBox, Description); pGroup1->AddSubItem(p1); gDevicePropertieMgr.Insert(p1, pPropertie); } { //添加属性变量映射 Name = _T("m_bIniPlatfrom");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_bIniPlatfrom); pPropertie->SetType(_PROP_TYPE_BOOL); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("初始化平台"); Description = _T("是否初始化XY 电机平台"); pPropertie->SetGroupName(GroupName); pPropertie->SetShowName(PropertyName); CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_bIniPlatfrom, Description); pGroup1->AddSubItem(p1); gDevicePropertieMgr.Insert(p1, pPropertie); } { //添加属性变量映射 Name = _T("m_bIniMotorZ");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_bIniMotorZ); pPropertie->SetType(_PROP_TYPE_BOOL); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("初始化电机Z"); Description = _T("是否初始化电机Z"); pPropertie->SetGroupName(GroupName); pPropertie->SetShowName(PropertyName); CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_bIniMotorZ, Description); pGroup1->AddSubItem(p1); gDevicePropertieMgr.Insert(p1, pPropertie); } pGroup->AddSubItem(pGroup1); } } } return pGroup; } void CCommonFlowMgr::OnAppInitialize() { } void CCommonFlowMgr::Draw(CDC* pDC) { //绘制光斑mark 点 DrawLaserSpotPt(pDC); DrawTestLineVec(pDC); } void CCommonFlowMgr::DrawTestLineVec(CDC* pDC) { int size = m_CTestLineVec.size(); for(int k=0;kGetCatchNodePen(),TestLine.m_pt1,TestLine.m_pt2); else DrawLine(pDC,gDraw->GetScanLine(),TestLine.m_pt1,TestLine.m_pt2); } } //绘制光斑mark 点 void CCommonFlowMgr::DrawLaserSpotPt(CDC* pDC) { if(!m_bLaserSpotMarkMode) return; int CenterIdx = 0; int size = m_LaserSpotPtVec.size(); for(int k=0;kIsbScanByDirX()) Size = DbSize(w,h); else Size = DbSize(h,w); DbRect rect(SpotPt.m_Coord,DbSize(h,w)); COLORREF color; if(SpotPt.m_AdjustZVal==0) { color = RGB_RED; CenterIdx = k; } else { color = RGB_YELLOW; } DrawSolidRect(pDC,color,rect); //把每个点的Z 轴调整量显示出来 CString str; str.Format(_T("%.2f"),SpotPt.m_AdjustZVal); if(gLaser->IsbScanByDirX()) { SpotPt.m_Coord.x -= 0.5; SpotPt.m_Coord.y += 3; } else { SpotPt.m_Coord.x += 3; } gDraw->DrawTxt(pDC,str,SpotPt.m_Coord); int Idx = k+1; if(CenterIdx>0 && color == RGB_YELLOW) { //Idx = (size-k)+(k-CenterIdx); } str.Format(_T("%d"),Idx); if(gLaser->IsbScanByDirX()) SpotPt.m_Coord.y -= 6; else SpotPt.m_Coord.x -= 6; gDraw->DrawTxt(pDC,str,SpotPt.m_Coord); } } #if 1 //检查设备初始化状态 bool CCommonFlowMgr::CheckDeviceInitState() { return true; } //初始化设备(平台,Z 轴) bool CCommonFlowMgr::InitDeviceFlow(bool bConfirmMsgBox) { return true; } #endif #if 1 //开始加工前的统一工作 bool CCommonFlowMgr::CommWorkStart() { //恢复扫描线的颜色 gWaferRecipeDataMgr->SetbScanEnd(false); //检查是否初始化设备 if(!CheckDeviceInitState()) return false; //加工记录开始 gWorkRecordMgr->StartRecord(); m_pView->RefreshView(); return true; } //结束加工后的统一工作 void CCommonFlowMgr::CommWorkEnd() { //结束记录 gWorkRecordMgr->EndRecord(); } #endif #if 1 //移动到指定的位置(MotorZCoord 是移动后Z 轴坐标) bool CCommonFlowMgr::MoveToPos(Dbxy MovePt,Dbxy TargetPt,double MotorZCoord) { return true; } //当前是否在激光安全位置 bool CCommonFlowMgr::AtLaserSafePlace(Dbxy PlatformCoord) { return false; } #endif #if 1 //收集多点移动数据(返回退火所需要的时间) //ABCDEF点参照笔记里面的原理图 int CCommonFlowMgr::CollectMultiMovePoint() { return 1; } #endif #if 1 //关闭激光器的流程 void CCommonFlowMgr::CloseLaserLddFlow() { } #endif #if 1 //手动步进移动平台 void CCommonFlowMgr::ManualMoveAsixXY(double MoveDis,DIRECTION MoveDir) { } //手动移动Z轴 void CCommonFlowMgr::ManualMoveAsixZ(double dis) { } //载盘上手动取放wafer 的流程(顶针/真空/破空) void CCommonFlowMgr::ManualCtrlPlatWaferFlow(bool bWaferOn) { } #endif #if 1 //利用测距仪平面度测量流程 void CCommonFlowMgr::PlanenessMeasureFlow() { } //XY 运动测试流程 void CCommonFlowMgr::XyMoveTestFlow() { } //打开运动测试对象 void CCommonFlowMgr::OpenMoveTestObj() { } //记录坐标 void CCommonFlowMgr::XYMoveSaveCoord() { } //打印运动测试结果 void CCommonFlowMgr::CalXYMoveTestResult(int MeasurePtCnt) { } //初始化结果列表 void CCommonFlowMgr::InitMoveRetList(CListCtrl &List) { } //测量结果插入列表 void CCommonFlowMgr::InsertMoveRetList(CListCtrl &List) { } void CCommonFlowMgr::InsertMoveRetListExt(CListCtrl &List,int Line,int Idx,CMovePtData &MovePtData,X_OR_Y Xy) { } #endif #if 1 //创建点检准备cmd void CCommonFlowMgr::CreatPowCheckPrepareCmd(CWorkCmdInvoker &WorkCmdInvoker) { } //激光功率点检流程(不操作激光LDD,双绿光的时候只把另外一路设置为0) bool CCommonFlowMgr::LaserPowCheckFlow() { return true; } #endif #if 1 //创建自动校准的指令流程(bToLaserFocus表示完成后是否回到焦距位置) void CCommonFlowMgr::CreatAutoFindFocusInvokerCmd(CWorkCmdInvoker &WorkCmdInvoker,bool bToLaserFocus) { } //自动查找Z 轴焦点 void CCommonFlowMgr::AutoFindFocusFlow() { } #endif #if 1//打光斑功能 void CCommonFlowMgr::SetbLaserSpotMarkMode(bool b) { } //创建光斑数据点 void CCommonFlowMgr::CreatLaserSpotMarkPt() { } //检查数据安全性 bool CCommonFlowMgr::CheckLaserSpotData() { return true; } //打光斑流程 void CCommonFlowMgr::LaserSpotMarkFlow() { } #endif #if 1 //单条线段扫描test(用来看光斑找焦距) void CCommonFlowMgr::OneLineLaserTest() { } //扫描单条线段 void CCommonFlowMgr::OneLineLaserTestExt(Dbxy Pt1,Dbxy Pt2) { } #endif #if 1 //测试用 void CCommonFlowMgr::CollectMultiPointVecToFile() { } #endif #if 1 //检测光束质量的流程 bool CCommonFlowMgr::CheckLaserBeamFlow() { return true; } //移动到功率测量位置的流程(只是移动XYZ) bool CCommonFlowMgr::MoveToPowMeasureFlow() { return true; } //通过测功率来判断当前功率密度和recipe 是否匹配 //如果打开自动调整的话,只调整Laser1Curr 的电流值 bool CCommonFlowMgr::CheckRecipeEnergyDensityFlow(double Laser1Curr) { return true; } #endif #if 1//新的执行流程 //指令简易的流程 bool CCommonFlowMgr::ExcuteSimpleFlowType(eExcuteFlowType FlowType) { return true; } #endif #if 1//job 相关流程 void CCommonFlowMgr::JobQueueCtrlFlow() { } //暂停job cmd 流程 void CCommonFlowMgr::PauseJobQueueCtrlFlow() { } //停止job cmd 流程 void CCommonFlowMgr::StopJobQueueCtrlFlow() { } #endif #if 1 //手动传输Wafer bool CCommonFlowMgr::ManualTransferWaferFlow() { return true; } void CCommonFlowMgr::StartAutomationWorkFlowThread() { } //启动自动生产流程 void CCommonFlowMgr::StartAutomationWorkFlow() { } //停止自动生产流程 void CCommonFlowMgr::StopAutomationWorkFlow() { } #endif