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")); } }
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); } } }
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); }
public void On_Job_Location_Changed(Job Job) { logger.Debug("On_Job_Location_Changed"); MonitoringUpdate.UpdateJobMove(Job.Job_Id); RunningUpdate.UpdateJobMove(Job.Job_Id); }
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; } }
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; }
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; } } } }
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; }