using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Windows.Forms; namespace SHARP_CLAS_UI.Screen { public partial class Form_Maintenance_Laser : Form { #region Enum enum En_Manual_Measure { S0000_WAIT, S1000_MANUAL_POWER_START, S1100_POWER_METER_STATUS_CHECK, S1110_MEASURE_MODE_SET_W, S1120_MEASURE_MODE_SET_CHECK, S1130_ZERO_SET, S1210_SCANNER_POSITION_MOVE, S1220_SCANNER_MOVE_WAIT, S1300_SCANNER_INIT, S1310_POWER_SET, S1320_LASER_ON, S1330_LASER_ON_CHECK, S1340_POWER_MEASUREMENT_START, S1350_POWER_MEASUREMENT, S1360_POWER_MEASUREMENT_END, S1370_LASER_OFF, S1380_LASER_OFF_CHECK, S1999_MANUAL_POWER_END, } #endregion #region Field delegate void UI_Update_Delegate(); Form_Frame _Parent; Thread UI_Update_Th; Thread Measurement_Th; bool update_check; Parameter_Power power; En_Manual_Measure Measure_Seq; Time_Checker Measurement_Tact = new Time_Checker(); Time_Checker Measurement_Check = new Time_Checker(); Power_Meter power_meter; List lst_power = new List(); double Measure_Time_Sec; double Setting_Power; double Last_Power; #endregion public Form_Maintenance_Laser(Form_Frame _Parent) { InitializeComponent(); this._Parent = _Parent; power_meter = _Parent._equip.power_meter; power = Parameter_Power_Manager.Instance.Get_Power(); ThreadInit(); } #region Function private void ThreadInit() { UI_Update_Th = new Thread(UI_Update_Th_Set); UI_Update_Th.Start(); Measurement_Th = new Thread(Measurement_Th_Set); Measurement_Th.Start(); } private void UI_Update_Th_Set() { while (!this.IsDisposed) { Thread.Sleep(100); if (!update_check) { update_check = true; UI_Update(); } } } private void UI_Update() { if (InvokeRequired) { BeginInvoke(new UI_Update_Delegate(UI_Update)); return; } else { try { Update_Setting(); Update_UI(); } catch (Exception ex) { } finally { update_check = false; } } } private void Update_Setting() { if (power == null) return; Parameter_Power set = Parameter_Power_Manager.Instance.Get_Power(); //tb_Get_Taget_Power; //tb_Get_Measurement_Cycle; //tb_Get_Recipe_Margin_of_Error; //tb_Get_Measure_Time; //tb_Get_Target_Setting_Power; //tb_Get_Target_Margin_of_Error; //tb_Get_Power_Revision_Count; //tb_Get_Manual_Taget_Power; //tb_Get_Manual_Measure_Time; tb_Get_Taget_Power.Text = power.Target_Power.ToString(); tb_Get_Measurement_Cycle.Text = power.Measurement_Cycle_Hour.ToString(); tb_Get_Recipe_Margin_of_Error.Text = power.Recipe_Margin_of_Error.ToString(); tb_Get_Measure_Time.Text = power.Measurement_Time_Sec.ToString(); tb_Get_Target_Setting_Power.Text = power.Target_Setting_Power.ToString(); tb_Get_Target_Setting_Frequency.Text = power.Target_Setting_Frequency.ToString(); tb_Get_Target_Margin_of_Error.Text = power.Target_Margin_of_Error.ToString(); tb_Get_Power_Revision_Count.Text = power.Power_Revision_Count.ToString(); tb_Get_Taget_Power.BackColor = set.Target_Power == power.Target_Power ? System.Drawing.Color.White : System.Drawing.Color.Red; tb_Get_Measurement_Cycle.BackColor = set.Measurement_Cycle_Hour == power.Measurement_Cycle_Hour ? System.Drawing.Color.White : System.Drawing.Color.Red; tb_Get_Recipe_Margin_of_Error.BackColor = set.Recipe_Margin_of_Error == power.Recipe_Margin_of_Error ? System.Drawing.Color.White : System.Drawing.Color.Red; tb_Get_Measure_Time.BackColor = set.Measurement_Time_Sec == power.Measurement_Time_Sec ? System.Drawing.Color.White : System.Drawing.Color.Red; tb_Get_Target_Setting_Power.BackColor = set.Target_Setting_Power == power.Target_Setting_Power ? System.Drawing.Color.White : System.Drawing.Color.Red; tb_Get_Target_Setting_Frequency.BackColor = set.Target_Setting_Frequency == power.Target_Setting_Frequency ? System.Drawing.Color.White : System.Drawing.Color.Red; tb_Get_Target_Margin_of_Error.BackColor = set.Target_Margin_of_Error == power.Target_Margin_of_Error ? System.Drawing.Color.White : System.Drawing.Color.Red; tb_Get_Power_Revision_Count.BackColor = set.Power_Revision_Count == power.Power_Revision_Count ? System.Drawing.Color.White : System.Drawing.Color.Red; } private void Update_UI() { btn_Manual_Masure.Enabled = Measure_Seq == En_Manual_Measure.S0000_WAIT ? true : false; lb_Laser_Status.BackColor = _Parent.sm.Get_Bit(Input_Memory_Address.Laser_Active) ? System.Drawing.Color.Lime : System.Drawing.Color.Green; object value; tb_Measure_Total_Time.Text = Measurement_Tact.Seconds.ToString(); if (Measure_Time_Sec - Measurement_Check.Seconds < 0) { tb_Measure_Time.Text = "0"; } else { tb_Measure_Time.Text = (Measure_Time_Sec - Measurement_Check.Seconds).ToString(); } if(lst_power.Count > 0) { tb_Power.Text = Last_Power.ToString(); tb_Count.Text = lst_power.Count.ToString(); tb_Average.Text = lst_power.Average().ToString(); tb_Max.Text = lst_power.Max().ToString(); tb_Min.Text = lst_power.Min().ToString(); } else { tb_Power.Text = Last_Power.ToString(); tb_Count.Text = "0"; tb_Average.Text = "0"; tb_Max.Text = "0"; tb_Min.Text = "0"; } } private void Measurement_Th_Set() { while (!this.IsDisposed) { Thread.Sleep(100); if(Measure_Seq != En_Manual_Measure.S0000_WAIT) { if(!Check_Interlock()) { Seq_Manual_Power(); } } } } private void Seq_Manual_Power() { switch (Measure_Seq) { case En_Manual_Measure.S1000_MANUAL_POWER_START: { lb_Power_Meter_Init.BackColor = System.Drawing.Color.Lime; lb_Position_Move.BackColor = System.Drawing.Color.Green; lb_Scanner_Init.BackColor = System.Drawing.Color.Green; lb_Laser_On.BackColor = System.Drawing.Color.Green; lb_Power_Measure.BackColor = System.Drawing.Color.Green; lb_Laser_Off.BackColor = System.Drawing.Color.Green; lb_Measure_Complete.BackColor = System.Drawing.Color.Green; lb_Laser_Power_Set.BackColor = System.Drawing.Color.Green; Last_Power = 0; lst_power.Clear(); Measurement_Tact.Start(); Measure_Seq = En_Manual_Measure.S1100_POWER_METER_STATUS_CHECK; break; } case En_Manual_Measure.S1100_POWER_METER_STATUS_CHECK: { if (power_meter.Check_Power_Meter_Status()) { Measure_Seq = En_Manual_Measure.S1110_MEASURE_MODE_SET_W; } else { Measure_Seq = En_Manual_Measure.S0000_WAIT; } break; } case En_Manual_Measure.S1110_MEASURE_MODE_SET_W: { power_meter.Set_Measurement_Mode_W(); Measure_Seq = En_Manual_Measure.S1120_MEASURE_MODE_SET_CHECK; break; } case En_Manual_Measure.S1120_MEASURE_MODE_SET_CHECK: { if (power_meter.Check_Measurement_Mode_W()) { Measure_Seq = En_Manual_Measure.S1130_ZERO_SET; } break; } case En_Manual_Measure.S1130_ZERO_SET: { power_meter.Set_Zero(); Measure_Seq = En_Manual_Measure.S1210_SCANNER_POSITION_MOVE; break; } case En_Manual_Measure.S1210_SCANNER_POSITION_MOVE: { if (_Parent._equip.process.ablation.Move_X_Power_Meter_Position()) { if (_Parent._equip.process.ablation.Move_Z_Power_Meter_Position()) { lb_Position_Move.BackColor = System.Drawing.Color.Lime; Measure_Seq = En_Manual_Measure.S1220_SCANNER_MOVE_WAIT; } } break; } case En_Manual_Measure.S1220_SCANNER_MOVE_WAIT: { if (_Parent._equip.process.ablation.MotorX.MotionComplete && _Parent._equip.process.ablation.MotorZ.MotionComplete) { if (_Parent._equip.process.ablation.Get_Is_Position_X_Power_Meter() && _Parent._equip.process.ablation.Get_Is_Position_Z_Power_Meter()) { Measure_Seq = En_Manual_Measure.S1300_SCANNER_INIT; } } break; } case En_Manual_Measure.S1300_SCANNER_INIT: { if (_Parent._equip.Cur_Main_Recipe.process_info == null) return; lb_Scanner_Init.BackColor = System.Drawing.Color.Lime; if (_Parent._equip.scanner.Initialize(_Parent._equip.Cur_Main_Recipe.process_info.CTB_File_Path)) { lb_Laser_Power_Set.BackColor = System.Drawing.Color.Lime; Measure_Seq = En_Manual_Measure.S1310_POWER_SET; } else { //Interlock. } break; } case En_Manual_Measure.S1310_POWER_SET: { int frequency = _Parent._equip.Power_Parameter.Target_Setting_Frequency; double power = Setting_Power; if (_Parent._equip.scanner.Set_Power(frequency, power)) { Measure_Seq = En_Manual_Measure.S1320_LASER_ON; } break; } case En_Manual_Measure.S1320_LASER_ON: { if (_Parent._equip.scanner.Set_Laser_On()) { lb_Laser_On.BackColor = System.Drawing.Color.Lime; Measure_Seq = En_Manual_Measure.S1330_LASER_ON_CHECK; } break; } case En_Manual_Measure.S1330_LASER_ON_CHECK: { if (_Parent._equip.sm.Get_Bit(Input_Memory_Address.Laser_Active)) { Measurement_Check.Start(); Measure_Seq = En_Manual_Measure.S1340_POWER_MEASUREMENT_START; } break; } case En_Manual_Measure.S1340_POWER_MEASUREMENT_START: { if (Measurement_Check.Seconds < 5) return; Measurement_Check.Start(); lb_Power_Measure.BackColor = System.Drawing.Color.Lime; Measure_Seq = En_Manual_Measure.S1350_POWER_MEASUREMENT; break; } case En_Manual_Measure.S1350_POWER_MEASUREMENT: { if (Measurement_Check.Seconds < Measure_Time_Sec) { Last_Power = power_meter.Read_Power(); lst_power.Add(Last_Power); } else { Measure_Seq = En_Manual_Measure.S1360_POWER_MEASUREMENT_END; } break; } case En_Manual_Measure.S1360_POWER_MEASUREMENT_END: { if(lst_power.Count == 0) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0942_POWER_COUNT_IS_EMPTY); } Measurement_Check.Stop(); Measure_Seq = En_Manual_Measure.S1370_LASER_OFF; break; } case En_Manual_Measure.S1370_LASER_OFF: { if (_Parent._equip.scanner.Set_Laser_Off()) { lb_Laser_Off.BackColor = System.Drawing.Color.Lime; Measure_Seq = En_Manual_Measure.S1380_LASER_OFF_CHECK; } break; } case En_Manual_Measure.S1380_LASER_OFF_CHECK: { if (!_Parent._equip.sm.Get_Bit(Input_Memory_Address.Laser_Active)) { Measure_Seq = En_Manual_Measure.S1999_MANUAL_POWER_END; } break; } case En_Manual_Measure.S1999_MANUAL_POWER_END: { lb_Measure_Complete.BackColor = System.Drawing.Color.Lime; Measurement_Tact.Stop(); Measure_Seq = En_Manual_Measure.S0000_WAIT; break; } } } private bool Check_Interlock() { if (Measure_Seq < En_Manual_Measure.S1360_POWER_MEASUREMENT_END) { if (!power_meter.isOpen) { Measure_Seq = En_Manual_Measure.S1360_POWER_MEASUREMENT_END; return true; } } return false; } #endregion private void btn_Set_Power_Click(object sender, EventArgs e) { double double_data = 0; int int_data = 0; if (btn_Set_Taget_Power == (Button)sender) { if(double.TryParse(tb_Set_Taget_Power.Text, out double_data)) { power.Target_Power = double_data; } } else if(btn_Set_Target_Setting_Frequency == (Button)sender) { if(int.TryParse(tb_Set_Target_Setting_Frequency.Text, out int_data)) { power.Target_Setting_Frequency = int_data; } } else if (btn_Set_Measurement_Cycle == (Button)sender) { if (int.TryParse(tb_Set_Measurement_Cycle.Text, out int_data)) { power.Measurement_Cycle_Hour = int_data; } } else if (btn_Set_Recipe_Margin_of_Error == (Button)sender) { if (double.TryParse(tb_Set_Recipe_Margin_of_Error.Text, out double_data)) { power.Recipe_Margin_of_Error = double_data; } } else if (btn_Set_Measure_Time == (Button)sender) { if (double.TryParse(tb_Set_Measure_Time.Text, out double_data)) { power.Measurement_Time_Sec = double_data; } } else if (btn_Set_Target_Setting_Power == (Button)sender) { if (double.TryParse(tb_Set_Target_Setting_Power.Text, out double_data)) { power.Target_Setting_Power = double_data; } } else if (btn_Set_Target_Margin_of_Error == (Button)sender) { if (double.TryParse(tb_Set_Target_Margin_of_Error.Text, out double_data)) { power.Target_Margin_of_Error = double_data; } } else if (btn_Set_Power_Revision_Count == (Button)sender) { if (int.TryParse(tb_Set_Power_Revision_Count.Text, out int_data)) { power.Power_Revision_Count = int_data; } } else if (btn_Set_Manual_Setting_Power == (Button)sender) { if (double.TryParse(tb_Set_Manual_Setting_Power.Text, out double_data)) { if(double_data < 0) { double_data = 0; } tb_Get_Manual_Setting_Power.Text = double_data.ToString(); Setting_Power = double_data; } } else if (btn_Set_Manual_Measure_Time == (Button)sender) { if (double.TryParse(tb_Set_Manual_Measure_Time.Text, out double_data)) { if(double_data < 0) { double_data = 0; } tb_Get_Manual_Measure_Time.Text = double_data.ToString(); Measure_Time_Sec = double_data; } } } private void btn_Save_Click(object sender, EventArgs e) { Parameter_Power_Manager.Instance.Save_Parameter_Power(power); } private void btn_Reset_Click(object sender, EventArgs e) { power = Parameter_Power_Manager.Instance.Get_Power(); } private void btn_Manual_Masure_Click(object sender, EventArgs e) { if (_Parent._equip.equip_mode == En_Equipment_Mode.Auto || _Parent._equip.equip_mode == En_Equipment_Mode.Home) { return; } if (Measure_Seq == En_Manual_Measure.S0000_WAIT) { Measure_Seq = En_Manual_Measure.S1000_MANUAL_POWER_START; } } private void btn_Manual_Stop_Click(object sender, EventArgs e) { Measure_Seq = En_Manual_Measure.S1360_POWER_MEASUREMENT_END; } private void btn_Laser_Off_Click(object sender, EventArgs e) { _Parent._equip.scanner.Set_Laser_Off(); } private void btn_HandShakeOn_Click(object sender, EventArgs e) { _Parent._equip.power_meter.HandShakingOn(); } } }