Example #1
0
        private void UpdateLapsedTime(object obj)
        {
            DateTime StartTime = DateTime.Now;

            while (!ThreadEnd)
            {
                SpinWait.SpinUntil(() => false, 1000);
                TimeSpan timeDiff = DateTime.Now - StartTime;
                RunningUpdate.UpdateRunningInfo("LapsedTime", timeDiff.ToString(@"hh\:mm\:ss"));
            }
        }
Example #2
0
        public void On_Mode_Changed(string Mode)
        {
            logger.Debug("On_Mode_Changed");

            ConnectionStatusUpdate.UpdateModeStatus(Mode);
            RunningUpdate.UpdateModeStatus(Mode);
            MonitoringUpdate.UpdateStatus(Mode);
            foreach (Node port in NodeManagement.GetLoadPortList())
            {
                WaferAssignUpdate.RefreshMapping(port.Name);
                if (Mode.Equals("Stop"))
                {
                    WaferAssignUpdate.ResetAssignCM(port.Name, true);
                }
            }
        }
Example #3
0
        private bool NextAction(string TaskName, string Target, string Position, string Slot, string Arm, string Value)
        {
            bool   result  = true;
            string Message = "";

            TaskJobManagment.CurrentProceedTask CurrTask;
            Dictionary <string, string>         param = new Dictionary <string, string>();


            if (!Target.Trim().Equals(""))
            {
                param.Add("@Target", Target);
            }
            if (!Position.Trim().Equals(""))
            {
                param.Add("@Position", Position);
            }
            if (!Slot.Trim().Equals(""))
            {
                param.Add("@Slot", Slot);
            }
            if (!Arm.Trim().Equals(""))
            {
                param.Add("@Arm", Arm);
            }
            if (!Value.Trim().Equals(""))
            {
                param.Add("@Value", Value);
            }
            RouteControl.Instance.TaskJob.Excute("RunningScreen", out Message, out CurrTask, TaskName, param);
            SpinWait.SpinUntil(() => CurrTask.Finished, 99999999);
            if (CurrTask.HasError)
            {
                ThreadEnd = true;
                RunningUpdate.UpdateModeStatus("Start Running");
                result = false;
            }
            return(result);
        }
Example #4
0
 public void On_Job_Location_Changed(Job Job)
 {
     logger.Debug("On_Job_Location_Changed");
     MonitoringUpdate.UpdateJobMove(Job.Job_Id);
     RunningUpdate.UpdateJobMove(Job.Job_Id);
 }
Example #5
0
        public void On_Command_Excuted(Node Node, Transaction Txn, CommandReturnMessage Msg)
        {
            logger.Debug("On_Command_Excuted");
            string Message = "";

            Transaction SendTxn = new Transaction();

            if (Txn.Method == Transaction.Command.LoadPortType.Reset)
            {
                AlarmUpdate.UpdateAlarmList(AlarmManagement.GetAll());
            }



            switch (Node.Type)
            {
            case "LOADPORT":
                switch (Txn.Method)
                {
                case Transaction.Command.LoadPortType.GetMapping:
                case Transaction.Command.LoadPortType.Unload:
                case Transaction.Command.LoadPortType.MappingUnload:
                case Transaction.Command.LoadPortType.DoorUp:
                case Transaction.Command.LoadPortType.InitialPos:
                case Transaction.Command.LoadPortType.ForceInitialPos:
                    WaferAssignUpdate.RefreshMapping(Node.Name);
                    MonitoringUpdate.UpdateNodesJob(Node.Name);
                    RunningUpdate.UpdateNodesJob(Node.Name);
                    break;

                case Transaction.Command.LoadPortType.GetCassetteSize:
                    ManualPortStatusUpdate.UpdateParameter("CASSETTE_SIZE_tb", Msg.Value);
                    break;

                case Transaction.Command.LoadPortType.GetSlotOffset:
                    ManualPortStatusUpdate.UpdateParameter("SLOT_OFFSET_tb", Msg.Value);
                    break;

                case Transaction.Command.LoadPortType.GetWaferOffset:
                    ManualPortStatusUpdate.UpdateParameter("WAFER_OFFSET_tb", Msg.Value);
                    break;

                case Transaction.Command.LoadPortType.GetTweekDistance:
                    ManualPortStatusUpdate.UpdateParameter("TWEEK_tb", Msg.Value);
                    break;

                case Transaction.Command.LoadPortType.GetSlotPitch:
                    ManualPortStatusUpdate.UpdateParameter("SLOT_PITCH_tb", Msg.Value);
                    break;
                }
                break;

            case "ROBOT":
                switch (Txn.Method)
                {
                case Transaction.Command.RobotType.GetMapping:
                    WaferAssignUpdate.RefreshMapping(Node.CurrentPosition);
                    MonitoringUpdate.UpdateNodesJob(Node.CurrentPosition);
                    RunningUpdate.UpdateNodesJob(Node.CurrentPosition);
                    break;
                }
                break;
            }

            switch (Txn.FormName)
            {
            case "FormStatus":
                Util.StateUtil.UpdateSTS(Node.Name, Msg.Value);
                break;

            case "PauseProcedure":

                break;

            case "FormManual":
                switch (Node.Type)
                {
                case "SMARTTAG":
                    if (!Txn.Method.Equals(Transaction.Command.SmartTagType.GetLCDData))
                    {
                        //ManualPortStatusUpdate.LockUI(false);
                    }
                    break;

                case "LOADPORT":
                    if (!Txn.CommandType.Equals("MOV") && !Txn.CommandType.Equals("HCS"))
                    {
                        //ManualPortStatusUpdate.LockUI(false);
                    }
                    else
                    {
                        if (Txn.Method.Equals(Transaction.Command.LoadPortType.Reset))
                        {
                            // ManualPortStatusUpdate.LockUI(false);
                        }
                    }
                    ManualPortStatusUpdate.UpdateLog(Node.Name, Msg.Command + " Excuted");
                    switch (Txn.Method)
                    {
                    case Transaction.Command.LoadPortType.ReadVersion:
                        ManualPortStatusUpdate.UpdateVersion(Node.Name, Msg.Value);
                        break;

                    case Transaction.Command.LoadPortType.GetLED:
                        ManualPortStatusUpdate.UpdateLED(Node.Name, Msg.Value);
                        break;

                    case Transaction.Command.LoadPortType.ReadStatus:
                        ManualPortStatusUpdate.UpdateSmifStatus(Node.Name, Msg.Value);
                        break;

                    case Transaction.Command.LoadPortType.GetCount:

                        break;

                    case Transaction.Command.LoadPortType.GetMapping:
                        ManualPortStatusUpdate.UpdateMapping(Node.Name, Msg.Value);
                        break;
                    }
                    break;

                case "OCR":
                    switch (Txn.Method)
                    {
                    case Transaction.Command.OCRType.GetOnline:
                        //OCRUpdate.UpdateOCRStatus(Node.Name, Msg.Value);
                        break;
                    }
                    break;

                case "ROBOT":
                    switch (Txn.Method)
                    {
                    case Transaction.Command.RobotType.Speed:
                    case Transaction.Command.RobotType.Mode:
                    case Transaction.Command.RobotType.Reset:
                    case Transaction.Command.RobotType.Servo:

                        ManualRobotStatusUpdate.UpdateGUI(Txn, Node.Name, Msg.Value);            //update 手動功能畫面
                        break;

                    case Transaction.Command.RobotType.GetSpeed:
                    case Transaction.Command.RobotType.GetRIO:
                    case Transaction.Command.RobotType.GetError:
                    case Transaction.Command.RobotType.GetMode:
                    case Transaction.Command.RobotType.GetStatus:
                    case Transaction.Command.RobotType.GetSV:
                        ManualRobotStatusUpdate.UpdateGUI(Txn, Node.Name, Msg.Value);            //update 手動功能畫面
                        break;

                    case Transaction.Command.RobotType.GetCombineStatus:
                        ManualRobotStatusUpdate.UpdateGUI(Txn, Node.Name, Msg.Command);            //update 手動功能畫面
                        break;
                    }
                    break;

                case "ALIGNER":
                    switch (Txn.Method)
                    {
                    case Transaction.Command.AlignerType.Speed:
                    case Transaction.Command.AlignerType.Mode:
                    case Transaction.Command.AlignerType.Reset:
                    case Transaction.Command.AlignerType.Servo:
                    //Thread.Sleep(500);
                    ////向Aligner 詢問狀態
                    //Node aligner = NodeManagement.Get(Node.Name);
                    //String script_name = aligner.Brand.ToUpper().Equals("SANWA") ? "AlignerStateGet" : "AlignerStateGet(Kawasaki)";
                    ////aligner.ExcuteScript(script_name, "FormManual", out Message);
                    //ManualAlignerStatusUpdate.UpdateGUI(Txn, Node.Name, Msg.Value);//update
                    //break;
                    case Transaction.Command.AlignerType.GetMode:
                    case Transaction.Command.AlignerType.GetSV:
                    case Transaction.Command.AlignerType.GetStatus:
                    case Transaction.Command.AlignerType.GetSpeed:
                    case Transaction.Command.AlignerType.GetRIO:
                    case Transaction.Command.AlignerType.GetError:
                        ManualAlignerStatusUpdate.UpdateGUI(Txn, Node.Name, Msg.Value);            //update 手動功能畫面
                        break;

                    case Transaction.Command.RobotType.GetCombineStatus:
                        ManualAlignerStatusUpdate.UpdateGUI(Txn, Node.Name, Msg.Command);            //update 手動功能畫面
                        break;
                    }
                    break;
                }
                break;

            default:

                break;
            }
        }
Example #6
0
        private void Transfer(object obj)
        {
            int LapsedWfCount  = 0;
            int LapsedLotCount = 0;

            TaskJobManagment.CurrentProceedTask CurrTask;
            string Message  = "";
            string TaskName = "";
            Dictionary <string, string> param = new Dictionary <string, string>();
            Node LD  = SelectLoadports[1];
            Node ULD = SelectLoadports[0];

            //init
            TaskName = "ROBOT_Init";
            param.Clear();
            param.Add("@Target", "ROBOT01");
            RouteControl.Instance.TaskJob.Excute("RunningScreen", out Message, out CurrTask, TaskName, param);
            SpinWait.SpinUntil(() => CurrTask.Finished || CycleStop, 99999999);
            if (CurrTask.HasError || CycleStop)
            {
                ThreadEnd = true;
                RunningUpdate.UpdateModeStatus("Start Running");

                return;
            }
            TaskName = "LOADPORT_Init";
            param.Clear();
            param.Add("@Target", LD.Name);
            RouteControl.Instance.TaskJob.Excute("RunningScreen", out Message, out CurrTask, TaskName, param);
            SpinWait.SpinUntil(() => CurrTask.Finished || CycleStop, 99999999);
            if (CurrTask.HasError || CycleStop)
            {
                ThreadEnd = true;
                RunningUpdate.UpdateModeStatus("Start Running");
                return;
            }
            TaskName = "LOADPORT_Init";
            param.Clear();
            param.Add("@Target", ULD.Name);
            RouteControl.Instance.TaskJob.Excute("RunningScreen", out Message, out CurrTask, TaskName, param);
            SpinWait.SpinUntil(() => CurrTask.Finished || CycleStop, 99999999);
            if (CurrTask.HasError || CycleStop)
            {
                ThreadEnd = true;
                RunningUpdate.UpdateModeStatus("Start Running");
                return;
            }
            //org
            TaskName = "ROBOT_ORGSH";
            param.Clear();
            param.Add("@Target", "ROBOT01");
            RouteControl.Instance.TaskJob.Excute("RunningScreen", out Message, out CurrTask, TaskName, param);
            SpinWait.SpinUntil(() => CurrTask.Finished || CycleStop, 99999999);
            if (CurrTask.HasError || CycleStop)
            {
                ThreadEnd = true;
                RunningUpdate.UpdateModeStatus("Start Running");
                return;
            }
            TaskName = "LOADPORT_ORGSH";
            param.Clear();
            param.Add("@Target", LD.Name);
            RouteControl.Instance.TaskJob.Excute("RunningScreen", out Message, out CurrTask, TaskName, param);
            SpinWait.SpinUntil(() => CurrTask.Finished || CycleStop, 99999999);
            if (CurrTask.HasError || CycleStop)
            {
                ThreadEnd = true;
                RunningUpdate.UpdateModeStatus("Start Running");
                return;
            }
            TaskName = "LOADPORT_ORGSH";
            param.Clear();
            param.Add("@Target", ULD.Name);
            RouteControl.Instance.TaskJob.Excute("RunningScreen", out Message, out CurrTask, TaskName, param);
            SpinWait.SpinUntil(() => CurrTask.Finished || CycleStop, 99999999);
            if (CurrTask.HasError || CycleStop)
            {
                ThreadEnd = true;
                RunningUpdate.UpdateModeStatus("Start Running");
                return;
            }
            //set speed
            TaskName = "SPEED";
            param.Clear();
            param.Add("@Target", "ROBOT01");
            param.Add("@Value", SpeedSet);
            RouteControl.Instance.TaskJob.Excute("RunningScreen", out Message, out CurrTask, TaskName, param);
            SpinWait.SpinUntil(() => CurrTask.Finished || CycleStop, 99999999);
            if (CurrTask.HasError || CycleStop)
            {
                ThreadEnd = true;
                RunningUpdate.UpdateModeStatus("Start Running");
                return;
            }



            while (!LotEnd)
            {
                Node swap = LD;
                LD  = ULD;
                ULD = swap;
                //loadport open
                TaskName = "OPEN";
                param.Clear();
                param.Add("@Target", LD.Name);
                RouteControl.Instance.TaskJob.Excute("RunningScreen", out Message, out CurrTask, TaskName, param);
                SpinWait.SpinUntil(() => CurrTask.Finished || CycleStop, 99999999);
                if (CurrTask.HasError || CycleStop)
                {
                    ThreadEnd = true;
                    RunningUpdate.UpdateModeStatus("Start Running");
                    return;
                }
                TaskName = "OPEN";
                param.Clear();
                param.Add("@Target", ULD.Name);
                RouteControl.Instance.TaskJob.Excute("RunningScreen", out Message, out CurrTask, TaskName, param);
                SpinWait.SpinUntil(() => CurrTask.Finished || CycleStop, 99999999);
                if (CurrTask.HasError || CycleStop)
                {
                    ThreadEnd = true;
                    RunningUpdate.UpdateModeStatus("Start Running");
                    return;
                }

                for (int i = 0; i < ProcessSlotList.Length; i++)
                {
                    if (TransCount == 0)
                    {
                        ThreadEnd = true;
                        RunningUpdate.UpdateModeStatus("Start Running");
                        return;
                    }
                    int  slotNo      = i + 1;
                    bool needProcess = ProcessSlotList[i];
                    if (needProcess)
                    {
                        Job FromSlot = LD.JobList[slotNo.ToString()];
                        Job ToSlot   = ULD.JobList[slotNo.ToString()];
                        if (FromSlot.MapFlag && !FromSlot.ErrPosition && !ToSlot.MapFlag && !ToSlot.ErrPosition)//check slot status by from and to
                        {
                            if (!LL.Equals(""))
                            {//LL use
                                TaskName = "LOAD";
                                param.Clear();
                                param.Add("@Target", "ROBOT01");
                                param.Add("@Position", LD.Name);
                                param.Add("@Slot", slotNo.ToString());
                                RouteControl.Instance.TaskJob.Excute("RunningScreen", out Message, out CurrTask, TaskName, param);
                                SpinWait.SpinUntil(() => CurrTask.Finished, 99999999);
                                if (CurrTask.HasError)
                                {
                                    ThreadEnd = true;
                                    RunningUpdate.UpdateModeStatus("Start Running");
                                    return;
                                }
                                TaskName = "UNLOAD";
                                param.Clear();
                                param.Add("@Target", "ROBOT01");
                                param.Add("@Position", LL);
                                param.Add("@Slot", "1");
                                RouteControl.Instance.TaskJob.Excute("RunningScreen", out Message, out CurrTask, TaskName, param);
                                SpinWait.SpinUntil(() => CurrTask.Finished, 99999999);
                                if (CurrTask.HasError)
                                {
                                    ThreadEnd = true;
                                    RunningUpdate.UpdateModeStatus("Start Running");
                                    return;
                                }
                                TaskName = "LOAD";
                                param.Clear();
                                param.Add("@Target", "ROBOT01");
                                param.Add("@Position", LL);
                                param.Add("@Slot", "1");
                                RouteControl.Instance.TaskJob.Excute("RunningScreen", out Message, out CurrTask, TaskName, param);
                                SpinWait.SpinUntil(() => CurrTask.Finished, 99999999);
                                if (CurrTask.HasError)
                                {
                                    ThreadEnd = true;
                                    RunningUpdate.UpdateModeStatus("Start Running");
                                    return;
                                }
                                TaskName = "UNLOAD";
                                param.Clear();
                                param.Add("@Target", "ROBOT01");
                                param.Add("@Position", ULD.Name);
                                param.Add("@Slot", slotNo.ToString());
                                RouteControl.Instance.TaskJob.Excute("RunningScreen", out Message, out CurrTask, TaskName, param);
                                SpinWait.SpinUntil(() => CurrTask.Finished, 99999999);
                                if (CurrTask.HasError)
                                {
                                    ThreadEnd = true;
                                    RunningUpdate.UpdateModeStatus("Start Running");
                                    return;
                                }
                                TransCount--;
                                RunningUpdate.UpdateRunningInfo("TransCount", TransCount.ToString());
                                LapsedWfCount++;
                                RunningUpdate.UpdateRunningInfo("LapsedWfCount", LapsedWfCount.ToString());
                                if (CycleStop)
                                {
                                    break;
                                }
                            }
                            else
                            {//LL not use
                                TaskName = "LOAD";
                                param.Clear();
                                param.Add("@Target", "ROBOT01");
                                param.Add("@Position", LD.Name);
                                param.Add("@Slot", slotNo.ToString());
                                RouteControl.Instance.TaskJob.Excute("RunningScreen", out Message, out CurrTask, TaskName, param);
                                SpinWait.SpinUntil(() => CurrTask.Finished, 99999999);
                                if (CurrTask.HasError)
                                {
                                    ThreadEnd = true;
                                    RunningUpdate.UpdateModeStatus("Start Running");
                                    return;
                                }
                                TaskName = "UNLOAD";
                                param.Clear();
                                param.Add("@Target", "ROBOT01");
                                param.Add("@Position", ULD.Name);
                                param.Add("@Slot", slotNo.ToString());
                                RouteControl.Instance.TaskJob.Excute("RunningScreen", out Message, out CurrTask, TaskName, param);
                                SpinWait.SpinUntil(() => CurrTask.Finished, 99999999);
                                if (CurrTask.HasError)
                                {
                                    ThreadEnd = true;
                                    RunningUpdate.UpdateModeStatus("Start Running");
                                    return;
                                }
                                TransCount--;
                                RunningUpdate.UpdateRunningInfo("TransCount", TransCount.ToString());
                                LapsedWfCount++;
                                RunningUpdate.UpdateRunningInfo("LapsedWfCount", LapsedWfCount.ToString());
                                if (CycleStop)
                                {
                                    break;
                                }
                            }
                        }
                    }
                }
                if (CycleStop)
                {
                    break;
                }
                LapsedLotCount++;
                RunningUpdate.UpdateRunningInfo("LapsedLotCount", LapsedLotCount.ToString());
                TaskName = "CLOSE";
                param.Clear();
                param.Add("@Target", LD.Name);
                RouteControl.Instance.TaskJob.Excute("RunningScreen", out Message, out CurrTask, TaskName, param);
                SpinWait.SpinUntil(() => CurrTask.Finished || CycleStop, 99999999);
                if (CurrTask.HasError || CycleStop)
                {
                    ThreadEnd = true;
                    RunningUpdate.UpdateModeStatus("Start Running");
                    return;
                }
                TaskName = "CLOSE";
                param.Clear();
                param.Add("@Target", ULD.Name);
                RouteControl.Instance.TaskJob.Excute("RunningScreen", out Message, out CurrTask, TaskName, param);
                SpinWait.SpinUntil(() => CurrTask.Finished || CycleStop, 99999999);
                if (CurrTask.HasError || CycleStop)
                {
                    ThreadEnd = true;
                    RunningUpdate.UpdateModeStatus("Start Running");
                    return;
                }

                if (LotEnd)
                {
                    break;
                }
            }
            ThreadEnd = true;
        }
Example #7
0
        private void Start_btn_Click(object sender, EventArgs e)
        {
            if (Start_btn.Text.Equals("Start Running"))
            {
                if (SelectLoadports.Count != 2)
                {
                    MessageBox.Show("請選擇兩個Loadport!");
                    return;
                }

                foreach (Node port in NodeManagement.GetLoadPortList())
                {
                    if (port.Enable)
                    {
                        port.ManaulControl = false;
                        string TaskName = "LOADPORT_UNLOADCOMPLETE";
                        string Message  = "";
                        TaskJobManagment.CurrentProceedTask CurrTask;
                        Dictionary <string, string>         param1 = new Dictionary <string, string>();
                        param1.Add("@Target", port.Name);

                        RouteControl.Instance.TaskJob.Excute(Guid.NewGuid().ToString(), out Message, out CurrTask, TaskName, param1);
                        SpinWait.SpinUntil(() => CurrTask.Finished, 99999999);
                        if (CurrTask.HasError)
                        {
                            ThreadEnd = true;
                            RunningUpdate.UpdateModeStatus("Start Running");
                        }
                    }
                }



                if (LL_cb.Text.ToUpper().Equals("ALIGNER01"))
                {
                    LL = LL_cb.Text;
                }
                else
                {
                    LL = "";
                }
                TransCount = Convert.ToInt32(TransCount_tb.Text);
                SpeedSet   = RunningSpeed_cb.Text.Replace("%", "");
                //SpeedSet = SpeedSet.Equals("100") ? "0" : SpeedSet;

                Form form = Application.OpenForms["FormMain"];

                Button btn = form.Controls.Find("Mode_btn", true).FirstOrDefault() as Button;
                btn.Enabled = false;
                Button btn2 = form.Controls.Find("btnManual", true).FirstOrDefault() as Button;
                btn2.Enabled = false;

                Start_btn.Text = "End Running";
                Run            = true;
                CycleStop      = false;
                LotEnd         = false;
                ThreadEnd      = false;
                ThreadPool.QueueUserWorkItem(new WaitCallback(UpdateLapsedTime));
                ThreadPool.QueueUserWorkItem(new WaitCallback(Transfer));
            }
            else
            {
                using (var form = new FormEndOption())
                {
                    var result = form.ShowDialog();
                    if (result == DialogResult.OK)
                    {
                        switch (form.Option)
                        {
                        case FormEndOption.EndOption.CycleStop:
                            CycleStop = true;
                            break;

                        case FormEndOption.EndOption.LotEnd:
                            LotEnd = true;
                            break;
                        }
                        SpinWait.SpinUntil(() => ThreadEnd, 99999999);
                        Start_btn.Text = "Start Running";
                        Form formA = Application.OpenForms["FormMain"];

                        Button btn = formA.Controls.Find("Mode_btn", true).FirstOrDefault() as Button;
                        btn.Enabled = true;
                    }
                }
            }
        }
Example #8
0
        private void Transfer(object obj)
        {
            int LapsedWfCount  = 0;
            int LapsedLotCount = 0;



            Node LD  = SelectLoadports[1];
            Node ULD = SelectLoadports[0];

            //org

            if (!NextAction("ROBOT_ORGSH", "ROBOT01", "", "", "", ""))
            {
                return;
            }
            if (!NextAction("ALIGNER_ORGSH", "ALIGNER01", "", "", "", ""))
            {
                return;
            }
            if (!NextAction("LOADPORT_ORGSH", LD.Name, "", "", "", ""))
            {
                return;
            }
            if (!NextAction("LOADPORT_ORGSH", ULD.Name, "", "", "", ""))
            {
                return;
            }
            //set speed

            if (!NextAction("SPEED", "ROBOT01", "", "", "", SpeedSet))
            {
                return;
            }

            if (!NextAction("SPEED", "ALIGNER01", "", "", "", SpeedSet))
            {
                return;
            }

            while (!LotEnd)
            {
                Node swap = LD;
                LD  = ULD;
                ULD = swap;
                //loadport open

                if (!NextAction("LOADPORT_OPEN", LD.Name, "", "", "", ""))
                {
                    return;
                }
                if (!NextAction("LOADPORT_OPEN", ULD.Name, "", "", "", ""))
                {
                    return;
                }
                string useArm = "2";
                for (int i = 0; i < ProcessSlotList.Length; i++)
                {
                    if (useArm.Equals("2"))
                    {
                        useArm = "1";
                    }
                    else
                    {
                        useArm = "2";
                    }
                    if (TransCount == 0)
                    {
                        ThreadEnd = true;
                        RunningUpdate.UpdateModeStatus("Start Running");
                        return;
                    }
                    int  slotNo      = i + 1;
                    bool needProcess = ProcessSlotList[i];
                    if (needProcess && ULD.JobList.ContainsKey(slotNo.ToString()) && LD.JobList.ContainsKey(slotNo.ToString()))
                    {
                        Job FromSlot = LD.JobList[slotNo.ToString()];
                        Job ToSlot   = ULD.JobList[slotNo.ToString()];
                        if (FromSlot.MapFlag && !FromSlot.ErrPosition && !ToSlot.MapFlag && !ToSlot.ErrPosition)//check slot status by from and to
                        {
                            if (!LL.Equals(""))
                            {//ALIGNER use
                                if (!NextAction("LOAD", "ROBOT01", LD.Name, slotNo.ToString(), useArm, ""))
                                {
                                    return;
                                }
                                if (!NextAction("UNLOAD", "ROBOT01", LL, "1", useArm, ""))
                                {
                                    return;
                                }

                                if (!NextAction("ALIGNER_WAFER_HOLD", LL, "", "", "", ""))
                                {
                                    return;
                                }
                                if (!NextAction("ALIGNER_ALIGN", LL, "", "", "", "336"))
                                {
                                    return;
                                }
                                if (!NextAction("ALIGNER_WAFER_RELEASE", LL, "", "", "", ""))
                                {
                                    return;
                                }

                                if (!NextAction("LOAD", "ROBOT01", LL, "1", useArm, ""))
                                {
                                    return;
                                }
                                if (!NextAction("ALIGNER_HOME", LL, "", "", "", ""))
                                {
                                    return;
                                }
                                if (!NextAction("UNLOAD", "ROBOT01", ULD.Name, slotNo.ToString(), useArm, ""))
                                {
                                    return;
                                }
                                TransCount--;
                                RunningUpdate.UpdateRunningInfo("TransCount", TransCount.ToString());
                                LapsedWfCount++;
                                RunningUpdate.UpdateRunningInfo("LapsedWfCount", LapsedWfCount.ToString());
                                if (CycleStop)
                                {
                                    break;
                                }
                            }
                            else
                            {//ALIGNER not use
                                if (!NextAction("LOAD", "ROBOT01", LD.Name, slotNo.ToString(), useArm, ""))
                                {
                                    return;
                                }
                                if (!NextAction("UNLOAD", "ROBOT01", ULD.Name, slotNo.ToString(), useArm, ""))
                                {
                                    return;
                                }

                                TransCount--;
                                RunningUpdate.UpdateRunningInfo("TransCount", TransCount.ToString());
                                LapsedWfCount++;
                                RunningUpdate.UpdateRunningInfo("LapsedWfCount", LapsedWfCount.ToString());
                                if (CycleStop)
                                {
                                    break;
                                }
                            }
                        }
                    }
                }
                if (CycleStop)
                {
                    break;
                }
                LapsedLotCount++;
                RunningUpdate.UpdateRunningInfo("LapsedLotCount", LapsedLotCount.ToString());

                if (!NextAction("LOADPORT_CLOSE_NOMAP", LD.Name, "", "", "", ""))
                {
                    return;
                }

                if (!NextAction("LOADPORT_CLOSE_NOMAP", ULD.Name, "", "", "", ""))
                {
                    return;
                }


                if (LotEnd)
                {
                    break;
                }
            }
            ThreadEnd = true;
        }