Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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);
            }
        }