1. Laser on 시 Stage position도 같이 확인 하도록 변경.
2. Auto power 측정, Manual power 측정 전후 Scanner Z 축 대기 위치 이동 하도록 수정
3. 프로그램 종료 시 Laser off 하도록 수정. 종료 대기시간 5sec
6개 파일 변경됨
310 ■■■■ 파일 변경됨
SHARP_CLAS_UI/100.Screen/Form_Maintenance_Laser.cs 71 ●●●● 패치 | 보기 | raw | blame | 히스토리
SHARP_CLAS_UI/300.Etc_Screen/Form_Scanner_View.cs 38 ●●●●● 패치 | 보기 | raw | blame | 히스토리
SHARP_CLAS_UI/500.Equipment/400.Module/200.Scanner/Scanner.cs 23 ●●●● 패치 | 보기 | raw | blame | 히스토리
SHARP_CLAS_UI/500.Equipment/700.Unit/200.Process/Ablation.cs 110 ●●●● 패치 | 보기 | raw | blame | 히스토리
SHARP_CLAS_UI/500.Equipment/700.Unit/Base/AblationUnit.cs 8 ●●●● 패치 | 보기 | raw | blame | 히스토리
SHARP_CLAS_UI/500.Equipment/Equipment.cs 60 ●●●● 패치 | 보기 | raw | blame | 히스토리
SHARP_CLAS_UI/100.Screen/Form_Maintenance_Laser.cs
@@ -18,9 +18,13 @@
            S1110_MEASURE_MODE_SET_W,
            S1120_MEASURE_MODE_SET_CHECK,
            S1130_ZERO_SET,
            S1150_STAY_POSITION_MOVE,
            S1160_POSITION_CHECK,
            S1210_SCANNER_POSITION_MOVE,
            S1210_SCANNER_POSITION_X_MOVE,
            S1220_SCANNER_MOVE_WAIT,
            S1230_SCANNER_POSITION_Z_MOVE,
            S1240_SCANNER_MOVE_WAIT,
            S1300_SCANNER_INIT,
            S1310_POWER_SET,
            S1320_LASER_ON,
@@ -254,29 +258,80 @@
                case En_Manual_Measure.S1130_ZERO_SET:
                    {
                        power_meter.Set_Zero();
                        Measure_Seq = En_Manual_Measure.S1210_SCANNER_POSITION_MOVE;
                        Measure_Seq = En_Manual_Measure.S1150_STAY_POSITION_MOVE;
                        break;
                    }
                case En_Manual_Measure.S1210_SCANNER_POSITION_MOVE:
                case En_Manual_Measure.S1150_STAY_POSITION_MOVE:
                    {
                        double position = _Parent._equip.process.ablation.Get_Scanner_Z_A1_Stay_Position();
                        if (_Parent._equip.process.ablation.MotorZ.Move_Absolute_Pos(position, 500))
                        {
                            Measure_Seq = En_Manual_Measure.S1160_POSITION_CHECK;
                        }
                        break;
                    }
                case En_Manual_Measure.S1160_POSITION_CHECK:
                    {
                        double position = _Parent._equip.process.ablation.Get_Scanner_Z_A1_Stay_Position();
                        if (_Parent._equip.process.ablation.MotorZ.MotionComplete)
                        {
                            if (_Parent._equip.process.ablation.MotorZ.Is_Inposition(position, _Parent._equip.Setting.Inposition_Offset))
                            {
                                Measure_Seq = En_Manual_Measure.S1210_SCANNER_POSITION_X_MOVE;
                            }
                            else
                            {
                                Measure_Seq = En_Manual_Measure.S1150_STAY_POSITION_MOVE;
                            }
                        }
                        break;
                    }
                case En_Manual_Measure.S1210_SCANNER_POSITION_X_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.MotorX.MotionComplete)
                        {
                            if (_Parent._equip.process.ablation.Get_Is_Position_X_Power_Meter() && _Parent._equip.process.ablation.Get_Is_Position_Z_Power_Meter())
                            if (_Parent._equip.process.ablation.Get_Is_Position_X_Power_Meter())
                            {
                                Measure_Seq = En_Manual_Measure.S1230_SCANNER_POSITION_Z_MOVE;
                            }
                            else
                            {
                                Measure_Seq = En_Manual_Measure.S1210_SCANNER_POSITION_X_MOVE;
                            }
                        }
                        break;
                    }
                case En_Manual_Measure.S1230_SCANNER_POSITION_Z_MOVE:
                    {
                        if (_Parent._equip.process.ablation.Move_X_Power_Meter_Position())
                        {
                            Measure_Seq = En_Manual_Measure.S1240_SCANNER_MOVE_WAIT;
                        }
                        break;
                    }
                case En_Manual_Measure.S1240_SCANNER_MOVE_WAIT:
                    {
                        if (_Parent._equip.process.ablation.MotorZ.MotionComplete)
                        {
                            if (_Parent._equip.process.ablation.Get_Is_Position_Z_Power_Meter())
                            {
                                Measure_Seq = En_Manual_Measure.S1300_SCANNER_INIT;
                            }
                            else
                            {
                                Measure_Seq = En_Manual_Measure.S1230_SCANNER_POSITION_Z_MOVE;
                            }
                        }
                        break;
                    }
SHARP_CLAS_UI/300.Etc_Screen/Form_Scanner_View.cs
@@ -127,6 +127,44 @@
                        tb_Waveform_Style.Text = ((Scanner_Recipe.Ablation_Style)_Parent._equip.Cur_Main_Recipe.process_info.Waveform).ToString();
                    }
                    bool isInPosition = false;
                    if (_Parent._equip.Cur_Main_Recipe != null && _Parent._equip.Cur_Main_Recipe.process_info != null && _Parent._equip.Cur_Main_Recipe.panel_type_info != null)
                    {
                        double scannerA1Position = _Parent._equip.Cur_Main_Recipe.process_info.Scanner_X_A1 + _Parent._equip.Cur_Main_Recipe.panel_type_info.Scanner_Offset_X_A1;
                        double scannerA2Position = _Parent._equip.Cur_Main_Recipe.process_info.Scanner_X_A2 + _Parent._equip.Cur_Main_Recipe.panel_type_info.Scanner_Offset_X_A2;
                        double scannerB1Position = _Parent._equip.Cur_Main_Recipe.process_info.Scanner_X_B1 + _Parent._equip.Cur_Main_Recipe.panel_type_info.Scanner_Offset_X_B1;
                        double scannerB2Position = _Parent._equip.Cur_Main_Recipe.process_info.Scanner_X_B2 + _Parent._equip.Cur_Main_Recipe.panel_type_info.Scanner_Offset_X_B2;
                        double stageA1Position = _Parent._equip.Cur_Main_Recipe.process_info.Scanner_Y_A1 + _Parent._equip.Cur_Main_Recipe.panel_type_info.Scanner_Offset_Y_A1;
                        double stageA2Position = _Parent._equip.Cur_Main_Recipe.process_info.Scanner_Y_A2 + _Parent._equip.Cur_Main_Recipe.panel_type_info.Scanner_Offset_Y_A2;
                        double stageB1Position = _Parent._equip.Cur_Main_Recipe.process_info.Scanner_Y_B1 + _Parent._equip.Cur_Main_Recipe.panel_type_info.Scanner_Offset_Y_B1;
                        double stageB2Position = _Parent._equip.Cur_Main_Recipe.process_info.Scanner_Y_B2 + _Parent._equip.Cur_Main_Recipe.panel_type_info.Scanner_Offset_Y_B2;
                        object value;
                        _Parent._equip.sm.Get_Value(RS_Automation_Motor_Address.Ablation_X_Actual_Position, out value);
                        double scannerPosition = double.Parse($"{value}");
                        _Parent._equip.sm.Get_Value(RS_Automation_Motor_Address.Ablation_Y_1_Actual_Position, out value);
                        double stageAPosition = double.Parse($"{value}");
                        _Parent._equip.sm.Get_Value(RS_Automation_Motor_Address.Ablation_Y_2_Actual_Position, out value);
                        double stageBPosition = double.Parse($"{value}");
                        isInPosition |= (scannerA1Position - 10 <= scannerPosition && scannerPosition <= scannerA1Position + 10) && (stageA1Position - 10 <= stageAPosition && stageAPosition <= stageA1Position + 10);
                        isInPosition |= (scannerA2Position - 10 <= scannerPosition && scannerPosition <= scannerA2Position + 10) && (stageA2Position - 10 <= stageAPosition && stageAPosition <= stageA2Position + 10);
                        isInPosition |= (scannerB1Position - 10 <= scannerPosition && scannerPosition <= scannerB1Position + 10) && (stageB1Position - 10 <= stageBPosition && stageBPosition <= stageB1Position + 10);
                        isInPosition |= (scannerB2Position - 10 <= scannerPosition && scannerPosition <= scannerB2Position + 10) && (stageB2Position - 10 <= stageBPosition && stageBPosition <= stageB2Position + 10);
                        isInPosition |= _Parent._equip.process.ablation.Get_Is_Position_X_Power_Meter() && _Parent._equip.process.ablation.Get_Is_Position_Z_Power_Meter();
                    }
                    else
                    {
                        isInPosition |= _Parent._equip.process.ablation.Get_Is_Position_X_Power_Meter() && _Parent._equip.process.ablation.Get_Is_Position_Z_Power_Meter();
                    }
                    foreach (Control control in Controls)
                    {
                        control.Enabled = isInPosition;
                    }
                    TimeSpan ts = DateTime.Now - dt;
                }
                catch (Exception ex)
SHARP_CLAS_UI/500.Equipment/400.Module/200.Scanner/Scanner.cs
@@ -169,18 +169,29 @@
                    double scannerB1Position = _equip.Cur_Main_Recipe.process_info.Scanner_X_B1 + _equip.Cur_Main_Recipe.panel_type_info.Scanner_Offset_X_B1;
                    double scannerB2Position = _equip.Cur_Main_Recipe.process_info.Scanner_X_B2 + _equip.Cur_Main_Recipe.panel_type_info.Scanner_Offset_X_B2;
                    double stageA1Position = _equip.Cur_Main_Recipe.process_info.Scanner_Y_A1 + _equip.Cur_Main_Recipe.panel_type_info.Scanner_Offset_Y_A1;
                    double stageA2Position = _equip.Cur_Main_Recipe.process_info.Scanner_Y_A2 + _equip.Cur_Main_Recipe.panel_type_info.Scanner_Offset_Y_A2;
                    double stageB1Position = _equip.Cur_Main_Recipe.process_info.Scanner_Y_B1 + _equip.Cur_Main_Recipe.panel_type_info.Scanner_Offset_Y_B1;
                    double stageB2Position = _equip.Cur_Main_Recipe.process_info.Scanner_Y_B2 + _equip.Cur_Main_Recipe.panel_type_info.Scanner_Offset_Y_B2;
                    object value;
                    _equip.sm.Get_Value(Position_Parameter_Address.Scanner_X_Power_Meter_Position, out value);
                    _equip.sm.Get_Value(RS_Automation_Motor_Address.Ablation_X_Actual_Position, out value);
                    double scannerPosition = double.Parse($"{value}");
                    _equip.sm.Get_Value(RS_Automation_Motor_Address.Ablation_Y_1_Actual_Position, out value);
                    double stageAPosition = double.Parse($"{value}");
                    _equip.sm.Get_Value(RS_Automation_Motor_Address.Ablation_Y_2_Actual_Position, out value);
                    double stageBPosition = double.Parse($"{value}");
                    isInPosition |= scannerA1Position - 10 <= scannerPosition && scannerPosition <= scannerA1Position + 10;
                    isInPosition |= scannerA2Position - 10 <= scannerPosition && scannerPosition <= scannerA2Position + 10;
                    isInPosition |= scannerB1Position - 10 <= scannerPosition && scannerPosition <= scannerB1Position + 10;
                    isInPosition |= scannerB2Position - 10 <= scannerPosition && scannerPosition <= scannerB2Position + 10;
                    isInPosition |= (scannerA1Position - 10 <= scannerPosition && scannerPosition <= scannerA1Position + 10) && (stageA1Position - 10 <= stageAPosition && stageAPosition <= stageA1Position + 10);
                    isInPosition |= (scannerA2Position - 10 <= scannerPosition && scannerPosition <= scannerA2Position + 10) && (stageA2Position - 10 <= stageAPosition && stageAPosition <= stageA2Position + 10);
                    isInPosition |= (scannerB1Position - 10 <= scannerPosition && scannerPosition <= scannerB1Position + 10) && (stageB1Position - 10 <= stageBPosition && stageBPosition <= stageB1Position + 10);
                    isInPosition |= (scannerB2Position - 10 <= scannerPosition && scannerPosition <= scannerB2Position + 10) && (stageB2Position - 10 <= stageBPosition && stageBPosition <= stageB2Position + 10);
                }
                else
                {
                isInPosition |= _equip.process.ablation.Get_Is_Position_X_Power_Meter() && _equip.process.ablation.Get_Is_Position_Z_Power_Meter();
                }
                if (isInPosition)
                {
SHARP_CLAS_UI/500.Equipment/700.Unit/200.Process/Ablation.cs
@@ -127,6 +127,7 @@
            pauseDisableList.Add(AblationSteps.S5460_POWER_MEASUREMENT_END);
            pauseDisableList.Add(AblationSteps.S5470_LASER_OFF);
            pauseDisableList.Add(AblationSteps.S5480_LASER_OFF_CHECK);
            pauseDisableList.Add(AblationSteps.S6100_MOVE_WAIT);
            MotorX.Check_Jog_Interlock = Jog_Interlock_MotorX;
            MotorX.Check_Move_Interlock = Move_Interlock_MotorX;
@@ -291,7 +292,7 @@
                if (equipment.equip_mode == En_Equipment_Mode.Pause)
                {
                    if (pauseDisableList.Contains(Step) != false)
                    if (pauseDisableList.Contains(Step) == false)
                    {
                        UnitMode = En_Equipment_Mode.Pause;
                        return;
@@ -1395,7 +1396,7 @@
                        else
                        {
                            auto_power_view.Add_Info($"Power Meter Status Fail");
                            Step = AblationSteps.S5999_AUTO_POWER_END;
                            Step = AblationSteps.S6000_MOVE_STAY_POSITION;
                        }
                        break;
                    }
@@ -1416,32 +1417,81 @@
                case AblationSteps.S5130_ZERO_SET:
                    {
                        equipment.power_meter.Set_Zero();
                        Step = AblationSteps.S5210_SCANNER_POSITION_MOVE;
                        Step = AblationSteps.S5150_MOVE_Z_STAY_POSITION;
                        break;
                    }
                case AblationSteps.S5210_SCANNER_POSITION_MOVE:
                case AblationSteps.S5150_MOVE_Z_STAY_POSITION:
                    {
                        double position = Get_Scanner_Z_A1_Stay_Position();
                        if (MotorZ.Move_Absolute_Pos(position, 500))
                        {
                            Step = AblationSteps.S5160_POSITION_CHECK;
                        }
                        break;
                    }
                case AblationSteps.S5160_POSITION_CHECK:
                    {
                        double position = Get_Scanner_Z_A1_Stay_Position();
                        if (MotorZ.MotionComplete)
                        {
                            if (MotorZ.Is_Inposition(position, equipment.Setting.Inposition_Offset))
                            {
                                auto_power_view.Add_Info($"Scanner Position Z WAIT MOVE");
                                Step = AblationSteps.S5210_SCANNER_POSITION_X_MOVE;
                            }
                            else
                            {
                                Step = AblationSteps.S5150_MOVE_Z_STAY_POSITION;
                            }
                        }
                        break;
                    }
                case AblationSteps.S5210_SCANNER_POSITION_X_MOVE:
                    {
                        if (equipment.process.ablation.Move_X_Power_Meter_Position())
                        {
                            if (equipment.process.ablation.Move_Z_Power_Meter_Position())
                            {
                                Step = AblationSteps.S5220_SCANNER_MOVE_WAIT;
                            }
                        }
                        break;
                    }
                case AblationSteps.S5220_SCANNER_MOVE_WAIT:
                    {
                        if (equipment.process.ablation.MotorX.MotionComplete && equipment.process.ablation.MotorZ.MotionComplete)
                        if (equipment.process.ablation.MotorX.MotionComplete)
                        {
                            if (equipment.process.ablation.Get_Is_Position_X_Power_Meter() && equipment.process.ablation.Get_Is_Position_Z_Power_Meter())
                            if (equipment.process.ablation.Get_Is_Position_X_Power_Meter())
                            {
                                auto_power_view.Add_Info($"Scanner Position Move");
                                auto_power_view.Add_Info($"Scanner Position X Power meter Move");
                                Step = AblationSteps.S5230_SCANNER_POSITION_Z_MOVE;
                            }
                            else
                            {
                                Step = AblationSteps.S5210_SCANNER_POSITION_X_MOVE;
                            }
                        }
                        break;
                    }
                case AblationSteps.S5230_SCANNER_POSITION_Z_MOVE:
                    {
                        if (equipment.process.ablation.Move_Z_Power_Meter_Position())
                        {
                            Step = AblationSteps.S5240_SCANNER_MOVE_WAIT;
                        }
                        break;
                    }
                case AblationSteps.S5240_SCANNER_MOVE_WAIT:
                    {
                        if (equipment.process.ablation.MotorZ.MotionComplete)
                        {
                            if (equipment.process.ablation.Get_Is_Position_Z_Power_Meter())
                            {
                                auto_power_view.Add_Info($"Scanner Position Z Power meter Move");
                                Step = AblationSteps.S5300_SCANNER_INIT;
                            }
                            else
                            {
                                Step = AblationSteps.S5210_SCANNER_POSITION_MOVE;
                                Step = AblationSteps.S5230_SCANNER_POSITION_Z_MOVE;
                            }
                        }
                        break;
@@ -1571,7 +1621,7 @@
                        {
                            //alarm.
                            Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0942_POWER_COUNT_IS_EMPTY);
                            Step = AblationSteps.S5999_AUTO_POWER_END;
                            Step = AblationSteps.S6000_MOVE_STAY_POSITION;
                        }
                        double averager = lst_power.Average();
@@ -1599,7 +1649,7 @@
                            auto_power_view.Add_Info($"Max : {lst_power.Max()}");
                            auto_power_view.Add_Info($"Min : {lst_power.Min()}");
                            Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0940_TARGET_POWER_ERROR);
                            Step = AblationSteps.S5999_AUTO_POWER_END;
                            Step = AblationSteps.S6000_MOVE_STAY_POSITION;
                        }
                        break;
                    }
@@ -1726,7 +1776,7 @@
                        {
                            //alarm.
                            Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0942_POWER_COUNT_IS_EMPTY);
                            Step = AblationSteps.S5999_AUTO_POWER_END;
                            Step = AblationSteps.S6000_MOVE_STAY_POSITION;
                        }
                        double averager = lst_power.Average();
@@ -1743,7 +1793,7 @@
                            auto_power_view.Add_Info($"Max : {lst_power.Max()}");
                            auto_power_view.Add_Info($"Min : {lst_power.Min()}");
                            Step = AblationSteps.S5999_AUTO_POWER_END;
                            Step = AblationSteps.S6000_MOVE_STAY_POSITION;
                        }
                        else
                        {
@@ -1769,7 +1819,7 @@
                                auto_power_view.Add_Info($"Max : {lst_power.Max()}");
                                auto_power_view.Add_Info($"Min : {lst_power.Min()}");
                                Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0941_RECIPE_POWER_ERROR);
                                Step = AblationSteps.S5999_AUTO_POWER_END;
                                Step = AblationSteps.S6000_MOVE_STAY_POSITION;
                            }
                        }
                        break;
@@ -1795,6 +1845,34 @@
                        Step = AblationSteps.S5410_RECIPE_POWER_SET;
                        break;
                    }
                case AblationSteps.S6000_MOVE_STAY_POSITION:
                    {
                        double position = Get_Scanner_Z_A1_Stay_Position();
                        if (MotorZ.Move_Absolute_Pos(position, 500))
                        {
                            Step = AblationSteps.S6100_MOVE_WAIT;
                        }
                        break;
                    }
                case AblationSteps.S6100_MOVE_WAIT:
                    {
                        double position = Get_Scanner_Z_A1_Stay_Position();
                        if (MotorZ.MotionComplete)
                        {
                            if (MotorZ.Is_Inposition(position, equipment.Setting.Inposition_Offset))
                            {
                                auto_power_view.Add_Info($"Scanner Stay Position Move");
                                Step = AblationSteps.S5999_AUTO_POWER_END;
                            }
                            else
                            {
                                Step = AblationSteps.S6000_MOVE_STAY_POSITION;
                            }
                        }
                        break;
                    }
                case AblationSteps.S5999_AUTO_POWER_END:
                    {
                        Parameter_Power parameter = equipment.Power_Parameter.Clone();
SHARP_CLAS_UI/500.Equipment/700.Unit/Base/AblationUnit.cs
@@ -69,8 +69,12 @@
        S5110_MEASURE_MODE_SET_W,
        S5120_MEASURE_MODE_SET_CHECK,
        S5130_ZERO_SET,
        S5210_SCANNER_POSITION_MOVE,
        S5150_MOVE_Z_STAY_POSITION,
        S5160_POSITION_CHECK,
        S5210_SCANNER_POSITION_X_MOVE,
        S5220_SCANNER_MOVE_WAIT,
        S5230_SCANNER_POSITION_Z_MOVE,
        S5240_SCANNER_MOVE_WAIT,
        S5300_SCANNER_INIT,
        S5310_TARGET_POWER_SET,
        S5320_LASER_ON,
@@ -92,6 +96,8 @@
        S5480_LASER_OFF_CHECK,
        S5490_ENERGEY_CHECK,
        S5510_RECIPE_POWER_CHANGE,
        S6000_MOVE_STAY_POSITION,
        S6100_MOVE_WAIT,
        S5999_AUTO_POWER_END,
    }
SHARP_CLAS_UI/500.Equipment/Equipment.cs
@@ -707,6 +707,29 @@
        public void Dispose()
        {
            DateTime dt = DateTime.Now;
            while(true)
            {
                Thread.Sleep(100);
                bool isLaserOn;
                if(scanner.Get_Laser_On(out isLaserOn) == false)
                {
                    isLaserOn = true;
                }
                if(isLaserOn)
                {
                    scanner.Set_Laser_Off();
                }
                if ((DateTime.Now - dt).TotalSeconds > 5)
                {
                    break;
                }
            }
            IsDisposed = true;
            Board_Control.Dispose();
            Align_vision.Dispose();
@@ -1012,6 +1035,9 @@
                // Laser On Interlock 
                // Power meter 위치 or 가공 위치가 아닐 때 Laser on시 Laser off 진행 후 Interlock.
                bool isInPosition = false;
                if (Cur_Main_Recipe != null && Cur_Main_Recipe.process_info != null && Cur_Main_Recipe.panel_type_info != null)
                {
                    double scannerA1Position = Cur_Main_Recipe.process_info.Scanner_X_A1 + Cur_Main_Recipe.panel_type_info.Scanner_Offset_X_A1;
@@ -1019,31 +1045,32 @@
                    double scannerB1Position = Cur_Main_Recipe.process_info.Scanner_X_B1 + Cur_Main_Recipe.panel_type_info.Scanner_Offset_X_B1;
                    double scannerB2Position = Cur_Main_Recipe.process_info.Scanner_X_B2 + Cur_Main_Recipe.panel_type_info.Scanner_Offset_X_B2;
                    double stageA1Position = Cur_Main_Recipe.process_info.Scanner_Y_A1 + Cur_Main_Recipe.panel_type_info.Scanner_Offset_Y_A1;
                    double stageA2Position = Cur_Main_Recipe.process_info.Scanner_Y_A2 + Cur_Main_Recipe.panel_type_info.Scanner_Offset_Y_A2;
                    double stageB1Position = Cur_Main_Recipe.process_info.Scanner_Y_B1 + Cur_Main_Recipe.panel_type_info.Scanner_Offset_Y_B1;
                    double stageB2Position = Cur_Main_Recipe.process_info.Scanner_Y_B2 + Cur_Main_Recipe.panel_type_info.Scanner_Offset_Y_B2;
                    object value;
                    sm.Get_Value(Position_Parameter_Address.Scanner_X_Power_Meter_Position, out value);
                    sm.Get_Value(RS_Automation_Motor_Address.Ablation_X_Actual_Position, out value);
                    double scannerPosition = double.Parse($"{value}");
                    bool isInPosition = false;
                    sm.Get_Value(RS_Automation_Motor_Address.Ablation_Y_1_Actual_Position, out value);
                    double stageAPosition = double.Parse($"{value}");
                    sm.Get_Value(RS_Automation_Motor_Address.Ablation_Y_2_Actual_Position, out value);
                    double stageBPosition = double.Parse($"{value}");
                    isInPosition |= scannerA1Position - 10 <= scannerPosition && scannerPosition <= scannerA1Position + 10;
                    isInPosition |= scannerA2Position - 10 <= scannerPosition && scannerPosition <= scannerA2Position + 10;
                    isInPosition |= scannerB1Position - 10 <= scannerPosition && scannerPosition <= scannerB1Position + 10;
                    isInPosition |= scannerB2Position - 10 <= scannerPosition && scannerPosition <= scannerB2Position + 10;
                    isInPosition |= (scannerA1Position - 10 <= scannerPosition && scannerPosition <= scannerA1Position + 10) && (stageA1Position - 10 <= stageAPosition && stageAPosition <= stageA1Position + 10);
                    isInPosition |= (scannerA2Position - 10 <= scannerPosition && scannerPosition <= scannerA2Position + 10) && (stageA2Position - 10 <= stageAPosition && stageAPosition <= stageA2Position + 10);
                    isInPosition |= (scannerB1Position - 10 <= scannerPosition && scannerPosition <= scannerB1Position + 10) && (stageB1Position - 10 <= stageBPosition && stageBPosition <= stageB1Position + 10);
                    isInPosition |= (scannerB2Position - 10 <= scannerPosition && scannerPosition <= scannerB2Position + 10) && (stageB2Position - 10 <= stageBPosition && stageBPosition <= stageB2Position + 10);
                    isInPosition |= process.ablation.Get_Is_Position_X_Power_Meter() && process.ablation.Get_Is_Position_Z_Power_Meter();
                    if(isInPosition == false)
                    {
                        if (sm.Get_Bit(Input_Memory_Address.Laser_Active))
                        {
                            scanner.Set_Laser_Off();
                            Interlock_Manager.Add_Interlock_Msg("Laser can't on.", "Please move power meter position.");
                        }
                    }
                }
                else
                {
                    bool isInPosition = false;
                    isInPosition |= process.ablation.Get_Is_Position_X_Power_Meter() && process.ablation.Get_Is_Position_Z_Power_Meter();
                }
                    if (isInPosition == false)
                    {
@@ -1051,7 +1078,6 @@
                        {
                            scanner.Set_Laser_Off();
                            Interlock_Manager.Add_Interlock_Msg("Laser can't on.", "Please move power meter position.");
                        }
                    }
                }