public bool CycleWork() { String sTemp; if (m_tmCycle.OnDelay(Step.iCycle != 0 && Step.iCycle == PreStep.iCycle && CheckStop() && !OM.MstOptn.bDebugMode, 5000)) { sTemp = string.Format("Time Out Step.iCycle={0:00}", Step.iCycle); sTemp = m_sPartName + " " + Step.eSeq.ToString() + sTemp; IO_SetY(yi.LODR_MgzInAC, false); IO_SetY(yi.LODR_MgzOutAC, false); IO_SetY(yi.PREB_AirBlower, false); IO_SetY(yi.RAIL_FeedingAC1, false); ER_SetErr(ei.ETC_CycleTO, sTemp); Trace(sTemp); return(true); } if (Step.iCycle != PreStep.iCycle) { sTemp = string.Format("Cycle Step.iCycle={0:00}", Step.iCycle); Trace(sTemp); } PreStep.iCycle = Step.iCycle; if (Stat.bReqStop) { //return true ; } int r, c = 0; //double dPos = 0; switch (Step.iCycle) { default: sTemp = string.Format("Cycle Default Clear Step.iCycle={0:00}", Step.iCycle); return(true); case 10: dPos = (DM.ARAY[ri.LODR].GetMaxRow() - DM.ARAY[ri.LODR].FindLastRow(cs.Unknown) - 1) * OM.DevInfo.dMgzPitch; double dWorkStt = PM.GetValue(mi.LODR_ZClmp, pv.ULDR_ZClmpWorkStart) + dPos; if (!MT_CmprPos(mi.LODR_ZClmp, dWorkStt) && IO_GetX(xi.PREB_PkgInDetect)) { ER_SetErr(ei.LODR_SupplyFail, "Pre Buffer In Sensor Checked"); return(true); } MoveCyl(ci.LODR_ClampUpDn, fb.Fwd); MoveCyl(ci.LODR_PusherFwBw, fb.Bwd); IO_SetY(yi.LODR_MgzInAC, false); IO_SetY(yi.LODR_MgzOutAC, false); Step.iCycle++; return(false); case 11: if (!CL_Complete(ci.LODR_ClampUpDn, fb.Fwd)) { return(false); } if (!CL_Complete(ci.LODR_PusherFwBw, fb.Bwd)) { return(false); } MoveMotr(mi.LODR_YClmp, pv.LODR_YClmpWork); Step.iCycle++; return(false); case 12: if (!MT_GetStopPos(mi.LODR_YClmp, pv.LODR_YClmpWork)) { return(false); } dPos = (DM.ARAY[ri.LODR].GetMaxRow() - DM.ARAY[ri.LODR].FindLastRow(cs.Unknown) - 1) * OM.DevInfo.dMgzPitch; MoveMotr(mi.LODR_ZClmp, pv.LODR_ZClmpWorkStart, dPos); Step.iCycle++; return(false); case 13: if (!MT_GetStopPos(mi.LODR_ZClmp, pv.LODR_ZClmpWorkStart, dPos)) { return(false); } MoveCyl(ci.LODR_PusherFwBw, fb.Fwd); IO_SetY(yi.RAIL_FeedingAC1, true); Step.iCycle++; return(false); case 14: if (IO_GetX(xi.LODR_PushOverload)) { MoveCyl(ci.LODR_PusherFwBw, fb.Bwd); ER_SetErr(ei.LODR_PushOverload); return(true); } if (!CL_Complete(ci.LODR_PusherFwBw, fb.Fwd)) { return(false); } if (!IO_GetX(xi.PREB_PkgInDetect)) //Have no strip { MoveCyl(ci.LODR_PusherFwBw, fb.Bwd); r = DM.ARAY[ri.LODR].FindLastRow(cs.Unknown); DM.ARAY[ri.LODR].SetStat(0, r, cs.Empty); Step.iCycle = 20; return(false); } //요기서 살짝 씀 SEQ.PREB.MoveCyl(ci.PREB_StprUpDn, fb.Fwd); IO_SetY(yi.PREB_AirBlower, true); MoveCyl(ci.LODR_PusherFwBw, fb.Bwd); Step.iCycle++; return(false); case 20: //Have no strip case if (!CL_Complete(ci.LODR_PusherFwBw, fb.Bwd)) { return(false); } IO_SetY(yi.RAIL_FeedingAC1, false); Step.iCycle = 0; return(true); case 15: if (!CL_Complete(ci.PREB_StprUpDn, fb.Fwd)) { return(false); } //IO_SetY(yi.RAIL_FeedingAC1,true); m_tmDelay.Clear(); Step.iCycle++; return(false); case 16: if (m_tmDelay.OnDelay(4000)) { IO_SetY(yi.RAIL_FeedingAC1, false); IO_SetY(yi.PREB_AirBlower, false); ER_SetErr(ei.RAIL_FeedingFail, "Loader Pusher Feeding Fail"); return(true); } if (!IO_GetX(xi.PREB_StrpDetect)) { return(false); } m_tmDelay.Clear(); Step.iCycle++; return(false); case 17: if (!m_tmDelay.OnDelay(100)) { return(false); //자꾸 튕겨서 센서밖으로 나가서. } IO_SetY(yi.RAIL_FeedingAC1, false); IO_SetY(yi.PREB_AirBlower, false); //?? 쉬프트로 하면 안됌.//DM.ShiftData(ri.LODR,ri.PREB); r = DM.ARAY[ri.LODR].FindLastRow(cs.Unknown); DM.ARAY[ri.LODR].SetStat(0, r, cs.Empty); DM.ARAY[ri.PREB].SetStat(cs.Unknown); DM.ARAY[ri.PREB].LotNo = DM.ARAY[ri.LODR].LotNo; DM.ARAY[ri.PREB].ID = (LOT.GetWorkMgzCnt() * 100 + r).ToString(); //100자리는 메거진카운트 10자리까진 슬롯. OM.CmnOptn.sLdrPreLotNo = DM.ARAY[ri.PREB].LotNo; OM.CmnOptn.sLdrPreLotId = DM.ARAY[ri.PREB].ID; if (LOT.GetLotNo() != DM.ARAY[ri.PREB].LotNo) { LOT.LotOpen(DM.ARAY[ri.PREB].LotNo); OM.EqpStat.iPreRsltCnts = (int [])OM.EqpStat.iRsltCnts.Clone(); System.Array.Clear(OM.EqpStat.iRsltCnts, 0, OM.EqpStat.iRsltCnts.Length); //OM.EqpStat.iRsltCnts.Initialize(); } m_tmDelay.Clear(); Step.iCycle++; return(false); case 18: if (!m_tmDelay.OnDelay(1000)) { return(false); //자꾸 튕겨서 센서밖으로 나가서. } if (IO_GetX(xi.PREB_StrpDetect)) { Step.iCycle = 0; return(true); } IO_SetY(yi.RAIL_FeedingAC1, true); m_tmDelay.Clear(); Step.iCycle++; return(false); case 19: if (!m_tmDelay.OnDelay(300)) { return(false); //자꾸 튕겨서 센서밖으로 나가서. } IO_SetY(yi.RAIL_FeedingAC1, false); Step.iCycle = 0; return(true); } }
public bool CyclePick() { String sTemp; if (m_tmCycle.OnDelay(Step.iCycle != 0 && Step.iCycle == PreStep.iCycle && CheckStop() && !OM.MstOptn.bDebugMode, 5000)) { sTemp = string.Format("Time Out Step.iCycle={0:00}", Step.iCycle); sTemp = m_sPartName + " " + Step.eSeq.ToString() + sTemp; IO_SetY(yi.LODR_MgzInAC, false); IO_SetY(yi.LODR_MgzOutAC, false); ER_SetErr(ei.ETC_CycleTO, sTemp); Trace(sTemp); return(true); } if (Step.iCycle != PreStep.iCycle) { sTemp = string.Format("Cycle Step.iCycle={0:00}", Step.iCycle); Trace(sTemp); } PreStep.iCycle = Step.iCycle; if (Stat.bReqStop) { //return true ; } bool r, c; switch (Step.iCycle) { default: sTemp = string.Format("Cycle Default Clear Step.iCycle={0:00}", Step.iCycle); return(true); case 10: if (IO_GetX(xi.LODR_MgzDetect1) || IO_GetX(xi.LODR_MgzDetect2)) { ER_SetErr(ei.LODR_SupplyFail, "Loader magazine sensor is detected"); return(true); } MoveCyl(ci.LODR_ClampUpDn, fb.Bwd); MoveCyl(ci.LODR_PusherFwBw, fb.Bwd); IO_SetY(yi.LODR_MgzInAC, true); IO_SetY(yi.LODR_MgzOutAC, false); Step.iCycle++; return(false); case 11: if (!CL_Complete(ci.LODR_ClampUpDn, fb.Bwd)) { return(false); } if (!CL_Complete(ci.LODR_PusherFwBw, fb.Bwd)) { return(false); } MoveMotr(mi.LODR_YClmp, pv.LODR_YClmpWork); Step.iCycle++; return(false); case 12: if (!MT_GetStopPos(mi.LODR_YClmp, pv.LODR_YClmpWork)) { return(false); } MoveMotr(mi.LODR_ZClmp, pv.LODR_ZClmpPickFwd); Step.iCycle++; return(false); case 13: if (!MT_GetStopPos(mi.LODR_ZClmp, pv.LODR_ZClmpPickFwd)) { return(false); } MoveMotr(mi.LODR_YClmp, pv.LODR_YClmpPick); Step.iCycle++; return(false); case 14: if (!MT_GetStopPos(mi.LODR_YClmp, pv.LODR_YClmpPick)) { return(false); } m_tmDelay.Clear(); Step.iCycle++; return(false); case 15: r = IO_GetX(xi.LODR_MgzDetect1) || IO_GetX(xi.LODR_MgzDetect2); //둘다 보는게 좋긴한데 하나로 일단 감 if (m_tmDelay.OnDelay(4000)) { IO_SetY(yi.LODR_MgzInAC, false); IO_SetY(yi.LODR_MgzOutAC, false); MT_GoAbsMan(mi.LODR_YClmp, pv.LODR_YClmpWork); ER_SetErr(ei.LODR_SupplyFail, "The magazine sensor of the loader is not detected."); return(true); } if (!r) { return(false); } MoveMotr(mi.LODR_ZClmp, pv.LODR_ZClmpClampOn); Step.iCycle++; return(false); case 16: if (!MT_GetStopPos(mi.LODR_ZClmp, pv.LODR_ZClmpClampOn)) { return(false); } MoveCyl(ci.LODR_ClampUpDn, fb.Fwd); Step.iCycle++; return(false); case 17: if (!CL_Complete(ci.LODR_ClampUpDn, fb.Fwd)) { return(false); } MoveMotr(mi.LODR_ZClmp, pv.LODR_ZClmpPickBwd); Step.iCycle++; return(false); case 18: if (!MT_GetStopPos(mi.LODR_ZClmp, pv.LODR_ZClmpPickBwd)) { return(false); } IO_SetY(yi.LODR_MgzInAC, false); MoveMotr(mi.LODR_YClmp, pv.LODR_YClmpWork); Step.iCycle++; return(false); case 19: if (!MT_GetStopPos(mi.LODR_YClmp, pv.LODR_YClmpWork)) { return(false); } Stat.bSupply = false; //if(LOT.CrntLotData.sLotNo != LOT.LotList[0].sLotNo) //{ // LOT.CrntLotData = LOT.LotList[0]; // LOT.LotOpen(LOT.CrntLotData); //} //LOT.CrntLotData.iCnt++; //여기서는 그냥 메거진정보꺼내서 lotno에 입히기만 하고 WorkCycle에서 랏오픈. string sLot = LOT.PopMgz(); //실제 시간은 어쩔수 없이 여기서 나우로 가져오지면 실제 SPC에서 데이터 남기는 랏스타트 시간과 약간의 딜레이가 있지만 크게 문제 없다. //다만 이시점에 폴더 확인 하고 랏오픈시점에 다음날로 넘어가면 //IA10010000 을 19일날 두번째 돌리기 시작 했으면 20일날 데이터가 IA10010000_0이 아닌 IA10010000_1로 남게됨. //메거진 2개씩 돌리면 픽2번해서 랏이 따로따로 쪼개짐.. ㅜㅠ //랏넘버 입력 할때로 옮김. //string sLotNo = SPC.MAP.GetLotNo(sLot) ; DM.ARAY[ri.LODR].LotNo = sLot; //sLotNo ; DM.ARAY[ri.LODR].SetStat(cs.Unknown); DM.ARAY[ri.LODR].ID = LOT.GetWorkMgzCnt().ToString(); MoveMotr(mi.LODR_ZClmp, pv.LODR_ZClmpWorkStart); Step.iCycle++; return(false); case 20: if (!MT_GetStopPos(mi.LODR_ZClmp, pv.LODR_ZClmpWorkStart)) { return(false); } Step.iCycle = 0; return(true); } }