示例#1
0
        //---------------------------------------------------------------------------
        private void UserButton_Click_6(object sender, RoutedEventArgs e)
        {
            if (!m_bConnect || m_nAxis < 0)
            {
                return;
            }

            //mc_Acs.fn_SetBuffer(m_nAxis, true); //HOME

            int nHomeNo = MOTR.ManNoHome((EN_MOTR_ID)m_nAxis);

            if (!fn_UserMsg($"{STRING_MOTOR_ID[m_nAxis]} Motor Home?", EN_MSG_TYPE.Check))
            {
                return;
            }

            SEQ.fn_Reset();

            if (nHomeNo == 32) //Z-Axis
            {
                if (SEQ_SPIND.fn_IsExistTool() && !FM.fn_IsLvlMaster())
                {
                    fn_UserMsg("Please remove tool");
                    return;
                }
            }
            MAN.fn_ManProcOn(nHomeNo, true, false);
        }
        //-------------------------------------------------------------------------------------------------
        private void btWait_Click(object sender, RoutedEventArgs e)
        {
            //
            IO.fn_SetOpenLoopOff();

            //MOTR[(int)EN_MOTR_ID.miSPD_Z].
            SEQ_SPIND.fn_ReqMoveMotr(EN_MOTR_ID.miSPD_Z, EN_COMD_ID.Wait1);
        }
 private void bn_MoveVisn_Click(object sender, RoutedEventArgs e)
 {
     //Move Polishing Vision Position
     SEQ_SPIND.fn_ReqMoveMotr(EN_MOTR_ID.miSPD_X, EN_COMD_ID.User12);
     SEQ_POLIS.fn_ReqBathImagePos();
     //
     SEQ_SPIND.fn_MoveCylLensCvr(ccFwd);
     SEQ_SPIND.fn_MoveCylIR(tg_shutter.Button.IsChecked == true ? ccBwd : ccFwd);
 }
示例#4
0
        //---------------------------------------------------------------------------
        public void fn_CrntStateTrace(EN_SEQ_ID part, string title)
        {
            //Local Var.
            string sTemp     = string.Empty;
            string sMsg      = string.Empty;
            string sFileName = string.Format($"[{DateTime.Now:yyMMdd}]CRNT_STATE.log");
            string sPath     = m_sLogRoot + "CRNT_STATE\\" + sFileName;

            try
            {
                //File Open.
                using (Stream stream = new FileStream(sPath, FileMode.OpenOrCreate, FileAccess.Write))
                {
                    StreamWriter sw = new StreamWriter(stream, Encoding.Unicode);
                    sw.BaseStream.Seek(0, SeekOrigin.End);

                    sMsg += string.Format($">>> {DateTime.Now:yyyy-MM-dd HH:mm:dd:ss} <<< \r\n");
                    sMsg += title + "\r\n";

                    sMsg += "----------------------------------------------------------- \r\n";
                    if (part == EN_SEQ_ID.SPINDLE || part == EN_SEQ_ID.ALL)
                    {
                        SEQ_SPIND.fn_SaveLog(ref sTemp); sMsg += sTemp;
                    }
                    if (part == EN_SEQ_ID.POLISH || part == EN_SEQ_ID.ALL)
                    {
                        SEQ_POLIS.fn_SaveLog(ref sTemp); sMsg += sTemp;
                    }
                    if (part == EN_SEQ_ID.CLEAN || part == EN_SEQ_ID.ALL)
                    {
                        SEQ_CLEAN.fn_SaveLog(ref sTemp); sMsg += sTemp;
                    }
                    if (part == EN_SEQ_ID.STORAGE || part == EN_SEQ_ID.ALL)
                    {
                        SEQ_STORG.fn_SaveLog(ref sTemp); sMsg += sTemp;
                    }
                    if (part == EN_SEQ_ID.TRANSFER || part == EN_SEQ_ID.ALL)
                    {
                        SEQ_TRANS.fn_SaveLog(ref sTemp); sMsg += sTemp;
                    }
                    sMsg += "----------------------------------------------------------- \r\n\r\n";

                    sw.Write(sMsg);
                    sw.Flush();
                    sw.Close();
                }
            }

            catch (Exception ex)
            {
                System.Diagnostics.Trace.WriteLine(ex.Message);
                ExceptionTrace("<fn_CrntStateTrace>", ex);
            }
        }
        //---------------------------------------------------------------------------
        private void bn_MoveVisn_Click(object sender, RoutedEventArgs e)
        {
            //Move Pre-Align Position
            SEQ_SPIND.fn_ReqMoveMotr(EN_MOTR_ID.miSPD_X, EN_COMD_ID.User11);
            SEQ_TRANS.fn_ReqMoveVisnPos();


            //
            SEQ_SPIND.fn_MoveCylLensCvr(ccFwd);
            SEQ_SPIND.fn_MoveCylIR(tg_shutter.Button.IsChecked == true ? ccBwd : ccFwd);
        }
        //---------------------------------------------------------------------------
        private void btReset1_Click(object sender, RoutedEventArgs e)
        {
            //
            if (SEQ._bRun)
            {
                MessageBox.Show("Can not use during run.", "WARNING", MessageBoxButton.OK, MessageBoxImage.Warning);
            }

            m_OnShotTimer.IsEnabled = false;

            //Reset
            Button selbtn = sender as Button;
            int    nTag   = Convert.ToInt32(selbtn.Tag);

            if (nTag < 0)
            {
                return;
            }

            switch ((EN_SEQ_ID)nTag)
            {
            case EN_SEQ_ID.SPINDLE:     //Spindle
                SEQ_SPIND.fn_Reset();
                break;

            case EN_SEQ_ID.POLISH:
                SEQ_POLIS.fn_Reset();
                break;

            case EN_SEQ_ID.CLEAN:
                SEQ_CLEAN.fn_Reset();
                break;

            case EN_SEQ_ID.STORAGE:
                SEQ_STORG.fn_Reset();
                break;

            case EN_SEQ_ID.TRANSFER:
                SEQ_TRANS.fn_Reset();
                break;

            case EN_SEQ_ID.ALL:
                SEQ_SPIND.fn_Reset();
                SEQ_POLIS.fn_Reset();
                SEQ_CLEAN.fn_Reset();
                SEQ_STORG.fn_Reset();
                SEQ_TRANS.fn_Reset();
                break;

            default:
                break;
            }
        }
        private void fn_SetOpticCondition()
        {
            SEQ_SPIND.fn_MoveCylLensCvr(ccFwd);
            SEQ_SPIND.fn_MoveCylIR(tg_shutter.Button.IsChecked == true ? ccBwd : ccFwd);

            g_VisionManager._CamManager.fn_SetExposure(uis_Exposuretime.slider.Value);
            g_VisionManager._CamManager.fn_SetGain(uis_Gain.slider.Value);
            g_VisionManager._LightManger.Channel = 1;
            g_VisionManager._LightManger.Bright  = (int)us_LightW.USValue;
            g_VisionManager._LightManger.Channel = 2;
            g_VisionManager._LightManger.Bright  = (int)us_LightIR.USValue;
        }
        //---------------------------------------------------------------------------
        //Update Timer
        private void fn_tmUpdate(object sender, EventArgs e)
        {
            //
            m_UpdateTimer.Stop();

            SEQ_SPIND.fn_UpdateOneShot(ref gdOneShot01);
            SEQ_POLIS.fn_UpdateOneShot(ref gdOneShot02);
            SEQ_CLEAN.fn_UpdateOneShot(ref gdOneShot03);
            SEQ_STORG.fn_UpdateOneShot(ref gdOneShot04);
            SEQ_TRANS.fn_UpdateOneShot(ref gdOneShot05);

            //SEQ      .fn_UpdateOneShot(ref gdFlag06);

            //
            m_UpdateTimer.Start();
        }
示例#9
0
        //---------------------------------------------------------------------------
        //Update Timer
        private void fn_tmUpdate(object sender, EventArgs e)
        {
            //
            m_UpdateTimer.Stop();


            lbRun.Background   = IO.XV[(int)EN_INPUT_ID.xSPD_E3000_RUN] ? Brushes.LimeGreen : Brushes.LightGray;
            lbRunOk.Background = IO.XV[(int)EN_INPUT_ID.xSPD_E3000_SpeedOK] ? Brushes.LightGreen: Brushes.LightGray;
            lbWarn.Background  = IO.XV[(int)EN_INPUT_ID.xSPD_E3000_Warn] ? Brushes.Yellow    : Brushes.LightGray;
            lbError.Background = !IO.XV[(int)EN_INPUT_ID.xSPD_E3000_State] ? Brushes.Red       : Brushes.LightGray;


            lbRPM.Content    = "RPM : " + SEQ_SPIND.fn_GetSpindleSpeed().ToString();
            lbDir.Content    = SEQ_SPIND.fn_GetSpindleDir() ? "DIRECTION : FWD" : "DIRECTION : BWD";
            lbTorque.Content = "TORQUE : " + SEQ_SPIND.fn_GetSpindleTorque();



            //
            m_UpdateTimer.Start();
        }
示例#10
0
        //---------------------------------------------------------------------------
        private void bnStart_Click(object sender, RoutedEventArgs e)
        {
            //
            Button selBtn = sender as Button;
            string sName  = selBtn.Name;
            bool   bCCW   = rbDirCCW.IsChecked == true;
            int    nRPM   = 0;

            int.TryParse(tbRPMSet.Text, out nRPM);

            switch (sName)
            {
            case "bnStart":
                //SEQ_SPIND.fn_SetSpindleSpeed(nRPM);
                //SEQ_SPIND.fn_SetSpindleRun  (swOn, bCW);
                SEQ_SPIND.fn_SetSpindleRun(nRPM, bCCW);
                break;

            case "bnStop":
                SEQ_SPIND.fn_SetSpindleRun(swOff);
                break;

            case "bnClamp":
                SEQ_SPIND.fn_MoveToolClamp(ccFwd);
                break;

            case "bnUnclamp":
                SEQ_SPIND.fn_MoveToolClamp(ccBwd);
                break;

            case "bnReset":
                SEQ_SPIND.fn_SetSpindleReset();
                break;

            default:
                break;
            }

            fn_WriteLog($"Spindle Manual Button Click - [{sName}]");
        }
示例#11
0
        //---------------------------------------------------------------------------
        public bool fn_LotOpen(string recipe, string lotno = "") //Lot No = RFID No
        {
            //Vision Recipe Open
            if (g_VisionManager.fn_LoadRecipe(recipe))
            {
                m_sRecipeName   = recipe;
                FM._sRecipeName = recipe;

                m_bLotOpen = true;

                //
                SEQ_SPIND.fn_StepDataClear();


                if (lotno != "")
                {
                    m_sLotNo = string.Format($"[{DateTime.Now:yyMMdd}]LOT_{lotno}");
                }
                else
                {
                    m_sLotNo = string.Format($"[{DateTime.Now:yyMMdd}]LOT_{DateTime.Now:yyMMdd_HHmmss}");
                }

                m_tStartTime = DateTime.Now;

                fn_WriteLog(string.Format($"[Lot Open] Recipe : {m_sRecipeName} / LOT : {m_sLotNo}"));
                fn_WriteLog(string.Format($"[Lot Open] Recipe : {m_sRecipeName} / LOT : {m_sLotNo}"), EN_LOG_TYPE.ltLot);

                m_dLotStartTime = TICK._GetTickTime();

                return(true);
            }

            m_bLotOpen = false;
            m_sLotNo   = string.Empty;

            return(false);
        }
        //---------------------------------------------------------------------------
        private void fn_tmOnShot(object sender, EventArgs e)
        {
            //
            if (SEQ._bRun)
            {
                m_nOneShotTag           = -1;
                m_OnShotTimer.IsEnabled = false;
                return;
            }

            //
            switch ((EN_SEQ_ID)m_nOneShotTag)
            {
            case EN_SEQ_ID.SPINDLE:
                if (!FM.m_stMasterOpt.bAutoOff[(int)EN_SEQ_ID.SPINDLE])
                {
                    SEQ_SPIND.fn_AutoRun();
                }
                break;

            case EN_SEQ_ID.POLISH:
                if (!FM.m_stMasterOpt.bAutoOff[(int)EN_SEQ_ID.POLISH])
                {
                    SEQ_POLIS.fn_AutoRun();
                }
                break;

            case EN_SEQ_ID.CLEAN:
                if (!FM.m_stMasterOpt.bAutoOff[(int)EN_SEQ_ID.CLEAN])
                {
                    SEQ_CLEAN.fn_AutoRun();
                }
                break;

            case EN_SEQ_ID.STORAGE:
                if (!FM.m_stMasterOpt.bAutoOff[(int)EN_SEQ_ID.STORAGE])
                {
                    SEQ_STORG.fn_AutoRun();
                }
                break;

            case EN_SEQ_ID.TRANSFER:
                if (!FM.m_stMasterOpt.bAutoOff[(int)EN_SEQ_ID.TRANSFER])
                {
                    SEQ_TRANS.fn_AutoRun();
                }
                break;

            case EN_SEQ_ID.SYSTEM:
                break;

            case EN_SEQ_ID.ALL:
                if (!FM.m_stMasterOpt.bAutoOff[(int)EN_SEQ_ID.SPINDLE])
                {
                    SEQ_SPIND.fn_AutoRun();
                }
                if (!FM.m_stMasterOpt.bAutoOff[(int)EN_SEQ_ID.POLISH])
                {
                    SEQ_POLIS.fn_AutoRun();
                }
                if (!FM.m_stMasterOpt.bAutoOff[(int)EN_SEQ_ID.CLEAN])
                {
                    SEQ_CLEAN.fn_AutoRun();
                }
                if (!FM.m_stMasterOpt.bAutoOff[(int)EN_SEQ_ID.STORAGE])
                {
                    SEQ_STORG.fn_AutoRun();
                }
                if (!FM.m_stMasterOpt.bAutoOff[(int)EN_SEQ_ID.TRANSFER])
                {
                    SEQ_TRANS.fn_AutoRun();
                }

                break;

            default:
                break;
            }

            m_nOneShotTag           = -1;
            m_OnShotTimer.IsEnabled = false;
        }
        //---------------------------------------------------------------------------
        private void btOnShot1_Click(object sender, MouseButtonEventArgs e)
        {
            //
            if (SEQ._bRun)
            {
                MessageBox.Show("Can not use during run.", "WARNING", MessageBoxButton.OK, MessageBoxImage.Warning);
            }

            //One Shot
            Button selbtn = sender as Button;
            int    nTag   = Convert.ToInt32(selbtn.Tag);

            if (nTag < 0)
            {
                return;
            }

            //m_nOneShotTag = nTag;
            //m_OnShotTimer.IsEnabled = true;

            //
            switch ((EN_SEQ_ID)nTag)
            {
            case EN_SEQ_ID.SPINDLE:
                if (!FM.m_stMasterOpt.bAutoOff[(int)EN_SEQ_ID.SPINDLE])
                {
                    SEQ_SPIND.fn_AutoRun();
                }
                break;

            case EN_SEQ_ID.POLISH:
                if (!FM.m_stMasterOpt.bAutoOff[(int)EN_SEQ_ID.POLISH])
                {
                    SEQ_POLIS.fn_AutoRun();
                }
                break;

            case EN_SEQ_ID.CLEAN:
                if (!FM.m_stMasterOpt.bAutoOff[(int)EN_SEQ_ID.CLEAN])
                {
                    SEQ_CLEAN.fn_AutoRun();
                }
                break;

            case EN_SEQ_ID.STORAGE:
                if (!FM.m_stMasterOpt.bAutoOff[(int)EN_SEQ_ID.STORAGE])
                {
                    SEQ_STORG.fn_AutoRun();
                }
                break;

            case EN_SEQ_ID.TRANSFER:
                if (!FM.m_stMasterOpt.bAutoOff[(int)EN_SEQ_ID.TRANSFER])
                {
                    SEQ_TRANS.fn_AutoRun();
                }
                break;

            case EN_SEQ_ID.SYSTEM:
                SEQ.fn_CheckRunCon();
                break;

            case EN_SEQ_ID.ALL:
                if (!FM.m_stMasterOpt.bAutoOff[(int)EN_SEQ_ID.SPINDLE])
                {
                    SEQ_SPIND.fn_AutoRun();
                }
                if (!FM.m_stMasterOpt.bAutoOff[(int)EN_SEQ_ID.POLISH])
                {
                    SEQ_POLIS.fn_AutoRun();
                }
                if (!FM.m_stMasterOpt.bAutoOff[(int)EN_SEQ_ID.CLEAN])
                {
                    SEQ_CLEAN.fn_AutoRun();
                }
                if (!FM.m_stMasterOpt.bAutoOff[(int)EN_SEQ_ID.STORAGE])
                {
                    SEQ_STORG.fn_AutoRun();
                }
                if (!FM.m_stMasterOpt.bAutoOff[(int)EN_SEQ_ID.TRANSFER])
                {
                    SEQ_TRANS.fn_AutoRun();
                }
                break;

            default:
                break;
            }
        }
        //---------------------------------------------------------------------------

        void fn_ManualAlign(Rect rect)
        {
            // Manual align이라고 Log 표시 할 것. (Lot Log)
            // - Map 바꿔줘야함 => Align을 Polishing으로.
            // Inposition Check해야함.
            int step_result = 0;
            //bool bErr = false;
            double dTiltInterpolation = 0.0;
            Point  pntStart           = new Point();
            Point  pntEnd             = new Point();

            Point pntMillingStart = new Point();
            Point pntMillingEnd   = new Point();

            Point pntModelSpan = new Point();

            //ST_RESULT Result = new ST_RESULT();
            ST_VISION_RESULT stvisionResult = new ST_VISION_RESULT(0);

            double dPlateCenterX = MOTR[(int)EN_MOTR_ID.miSPD_X].GetPosToCmdId(EN_COMD_ID.User1);
            double dPlateCenterY = MOTR[(int)EN_MOTR_ID.miPOL_Y].GetPosToCmdId(EN_COMD_ID.User1);

            double dPlateInterpolationPosX = dPlateCenterX;
            double dPlateInterpolationPosY = 0.0;

            double dXOffset = 7;
            double dYOffset = 7;

            for (int step = 0; step < g_VisionManager.CurrentRecipe.Model[0].MillingCount; step++)
            {
                dTiltInterpolation = g_VisionManager.fn_GetTiltInterpolation(g_VisionManager.CurrentRecipe.Model[0].Milling[step].Tilt);
                fn_WriteLog(this.Title + $"Tilt Interpolation : {dTiltInterpolation.ToString("0.000")}", UserEnum.EN_LOG_TYPE.ltVision);

                pntStart.X = 0;
                pntStart.Y = 0;
                pntEnd.X   = 0;
                pntEnd.Y   = 0;

                SEQ_SPIND.vresult.stRecipeList[step_result].nUseMilling   = g_VisionManager.CurrentRecipe.Model[0].Milling[step].Enable;
                SEQ_SPIND.vresult.stRecipeList[step_result].dTilt         = g_VisionManager.CurrentRecipe.Model[0].Milling[step].Tilt;
                SEQ_SPIND.vresult.stRecipeList[step_result].dRPM          = g_VisionManager.CurrentRecipe.Model[0].Milling[step].RPM;
                SEQ_SPIND.vresult.stRecipeList[step_result].dForce        = g_VisionManager.CurrentRecipe.Model[0].Milling[step].Force;
                SEQ_SPIND.vresult.stRecipeList[step_result].dSpeed        = g_VisionManager.CurrentRecipe.Model[0].Milling[step].Speed;
                SEQ_SPIND.vresult.stRecipeList[step_result].dPitch        = g_VisionManager.CurrentRecipe.Model[0].Milling[step].Pitch;
                SEQ_SPIND.vresult.stRecipeList[step_result].nPathCnt      = g_VisionManager.CurrentRecipe.Model[0].Milling[step].PathCount;
                SEQ_SPIND.vresult.stRecipeList[step_result].nCycle        = g_VisionManager.CurrentRecipe.Model[0].Milling[step].Cycle;
                SEQ_SPIND.vresult.stRecipeList[step_result].nUtilType     = g_VisionManager.CurrentRecipe.Model[0].Milling[step].UtilType;
                SEQ_SPIND.vresult.stRecipeList[step_result].nUseUtilFill  = g_VisionManager.CurrentRecipe.Model[0].Milling[step].UtilFill;
                SEQ_SPIND.vresult.stRecipeList[step_result].nUseUtilDrain = g_VisionManager.CurrentRecipe.Model[0].Milling[step].UtilDrain;
                SEQ_SPIND.vresult.stRecipeList[step_result].nUseImage     = g_VisionManager.CurrentRecipe.Model[0].Milling[step].MillingImage;
                SEQ_SPIND.vresult.stRecipeList[step_result].nUseEPD       = g_VisionManager.CurrentRecipe.Model[0].Milling[step].EPD;
                SEQ_SPIND.vresult.stRecipeList[step_result].nUseToolChg   = g_VisionManager.CurrentRecipe.Model[0].Milling[step].ToolChange;
                SEQ_SPIND.vresult.stRecipeList[step_result].nToolType     = g_VisionManager.CurrentRecipe.Model[0].Milling[step].ToolType;

                SEQ_SPIND.vresult.stRecipeList[step_result].dTiltOffset = dTiltInterpolation;
                //vs.stRecipeList[step_result].nUtility = CurrentRecipe.Model[nModelNum].Milling[step].Util;
                // Milling Rect의 좌상단 좌표 1사분면으로 변환. (Start End Position 계산 때문에 Rect 중심계산 생략)
                pntMillingStart = fn_GetPositionFromImageCenter(
                    new Point(
                        g_VisionManager.CurrentRecipe.Model[0].Milling[step].MilRect.Left,
                        g_VisionManager.CurrentRecipe.Model[0].Milling[step].MilRect.Top)
                    , g_VisionManager._RecipeVision.CamWidth, g_VisionManager._RecipeVision.CamHeight);

                pntMillingEnd = fn_GetPositionFromImageCenter(
                    new Point(
                        g_VisionManager.CurrentRecipe.Model[0].Milling[step].MilRect.Right,
                        g_VisionManager.CurrentRecipe.Model[0].Milling[step].MilRect.Bottom)
                    , g_VisionManager._RecipeVision.CamWidth, g_VisionManager._RecipeVision.CamHeight);
                fn_WriteLog(this.Title + $"Manual Align Step : {step}, MilPx X: {g_VisionManager.CurrentRecipe.Model[0].Milling[step].MilRect.X.ToString("0.000")}, MilPx Y: {g_VisionManager.CurrentRecipe.Model[0].Milling[step].MilRect.Y.ToString("0.000")}, pntMilling : S({pntMillingStart.X.ToString("0.000")}, {pntMillingStart.Y.ToString("0.000")}), E({pntMillingEnd.X.ToString("0.000")}, {pntMillingEnd.Y.ToString("0.000")})", UserEnum.EN_LOG_TYPE.ltVision);
                //---------------------------------------------------------------------------
                // Tilt 보상 적용 할 것.
                //---------------------------------------------------------------------------
                // Position 계산.
                // Left
                pntStart.X  = pntMillingStart.X + pntModelSpan.X;
                pntStart.X *= (g_VisionManager._RecipeVision.ResolutionX / 1000.0); // um -> mm

                // Top
                pntStart.Y  = pntMillingStart.Y + pntModelSpan.Y;
                pntStart.Y *= (g_VisionManager._RecipeVision.ResolutionY / 1000.0); // um -> mm
                pntStart.Y += dTiltInterpolation;                                   // (mm Scale)

                // Right
                pntEnd.X  = pntMillingEnd.X + pntModelSpan.X;
                pntEnd.X *= (g_VisionManager._RecipeVision.ResolutionX / 1000.0); // um -> mm

                // Bottom
                pntEnd.Y  = pntMillingEnd.Y + pntModelSpan.Y;
                pntEnd.Y *= (g_VisionManager._RecipeVision.ResolutionY / 1000.0); // um -> mm
                pntEnd.Y += dTiltInterpolation;                                   // (mm Scale)

                fn_WriteLog(this.Title + $"pntStart : ({pntStart.X.ToString("0.000")}, {pntStart.Y.ToString("0.000")}), pntEnd : ({pntEnd.X.ToString("0.000")}, {pntEnd.Y.ToString("0.000")})", UserEnum.EN_LOG_TYPE.ltVision);

                // Start Position Direction Calculation.
                switch (g_VisionManager.CurrentRecipe.Model[0].Milling[step].StartPos)
                {
                // Left-Bottom
                case 0:
                    SEQ_SPIND.vresult.stRecipeList[step_result].pStartPos.X = pntStart.X;
                    SEQ_SPIND.vresult.stRecipeList[step_result].pStartPos.Y = pntEnd.Y;
                    SEQ_SPIND.vresult.stRecipeList[step_result].pEndPos.X   = pntEnd.X;
                    SEQ_SPIND.vresult.stRecipeList[step_result].pEndPos.Y   = pntStart.Y;
                    break;

                // Right-Bottom
                case 1:
                    SEQ_SPIND.vresult.stRecipeList[step_result].pStartPos.X = pntEnd.X;
                    SEQ_SPIND.vresult.stRecipeList[step_result].pStartPos.Y = pntEnd.Y;
                    SEQ_SPIND.vresult.stRecipeList[step_result].pEndPos.X   = pntStart.X;
                    SEQ_SPIND.vresult.stRecipeList[step_result].pEndPos.Y   = pntStart.Y;
                    break;
                }
                fn_WriteLog(this.Title + $"End Direction : ({SEQ_SPIND.vresult.stRecipeList[step_result].pStartPos.X}, {SEQ_SPIND.vresult.stRecipeList[step_result].pStartPos.Y}), pntEnd : ({SEQ_SPIND.vresult.stRecipeList[step_result].pEndPos.X}, {SEQ_SPIND.vresult.stRecipeList[step_result].pEndPos.Y})", UserEnum.EN_LOG_TYPE.ltVision);
                //---------------------------------------------------------------------------
                // Theta
                //---------------------------------------------------------------------------
                SEQ_SPIND.vresult.stRecipeList[step_result].dTheta = 0;
                //---------------------------------------------------------------------------
                step_result++;
            }
            //---------------------------------------------------------------------------
            // 좌표계 변환. => Cam 기준 상대좌표. (3사분면 좌표계)
            stvisionResult.pntModel.X *= g_VisionManager._RecipeVision.ResolutionX / 1000.0;
            stvisionResult.pntModel.Y *= g_VisionManager._RecipeVision.ResolutionY / 1000.0;
            //---------------------------------------------------------------------------
            int    nTotal = stvisionResult.nTotalStep;
            double dXpos  = MOTR.GetEncPos(EN_MOTR_ID.miSPD_X);
            double dYpos  = MOTR.GetEncPos(EN_MOTR_ID.miPOL_Y);
            double dTHpos = MOTR.GetEncPos(EN_MOTR_ID.miPOL_TH);

            //Save X,Y Value
            for (int n = 0; n < nTotal; n++)
            {
                //		+ (Spindle)
                //	□ (Cam)
                // Spindle X Pos Value > Cam X Pos Value
                // Spindle이 더가야하므로 Offset + 부호

                //	+ (Spindle)
                //		□ (Cam)
                // Spindle X Pos Value < Cam X Pos Value
                // Spindle이 덜가야하므로 Offset - 부호

                stvisionResult.stRecipeList[n].dStartX = dXpos - stvisionResult.stRecipeList[n].pStartPos.X + g_VisionManager._RecipeVision.SpindleOffsetX;
                stvisionResult.stRecipeList[n].dEndX   = dXpos - stvisionResult.stRecipeList[n].pEndPos.X + g_VisionManager._RecipeVision.SpindleOffsetX;

                stvisionResult.stRecipeList[n].dStartY = dYpos + stvisionResult.stRecipeList[n].pStartPos.Y - g_VisionManager._RecipeVision.SpindleOffsetY;
                stvisionResult.stRecipeList[n].dEndY   = dYpos + stvisionResult.stRecipeList[n].pEndPos.Y - g_VisionManager._RecipeVision.SpindleOffsetY;

                fn_WriteLog($"-----------------------------Result Process------------------------", EN_LOG_TYPE.ltVision);
                fn_WriteLog($"{n} - Start Pos : {stvisionResult.stRecipeList[n].dStartX}, {stvisionResult.stRecipeList[n].dStartY}", EN_LOG_TYPE.ltVision);
                fn_WriteLog($"{n} - End Pos   : {stvisionResult.stRecipeList[n].dEndX}, {stvisionResult.stRecipeList[n].dEndY}", EN_LOG_TYPE.ltVision);
                stvisionResult.stRecipeList[n].dPosTH = dTHpos;

                //---------------------------------------------------------------------------
                // System Offset
                //---------------------------------------------------------------------------
                stvisionResult.stRecipeList[n].dStartX += FM.m_stProjectBase.dPolishOffset_X;
                stvisionResult.stRecipeList[n].dEndX   += FM.m_stProjectBase.dPolishOffset_X;
                stvisionResult.stRecipeList[n].dStartY += FM.m_stProjectBase.dPolishOffset_Y;
                stvisionResult.stRecipeList[n].dEndX   += FM.m_stProjectBase.dPolishOffset_Y;
                stvisionResult.stRecipeList[n].dTilt   += FM.m_stProjectBase.dPolishOffset_TI;

                //---------------------------------------------------------------------------
                // Theta Offset 은 추가 스탭 작업 요함.
                // => Theta 가공은 Align 이후 특정 각도를 돌려서 가공을 하기위함 이므로.
                //stvisionResult.stRecipeList[n].dPosTH += FM.m_stProjectBase.dPolishOffset_TH;
                //---------------------------------------------------------------------------

                //---------------------------------------------------------------------------
                //	Vision Align InPosition Error
                //---------------------------------------------------------------------------
                // Interpolation Tilt.
                dPlateInterpolationPosY = dPlateCenterY + g_VisionManager.fn_GetTiltInterpolation(stvisionResult.stRecipeList[n].dTilt);

                //vresult.stRecipeList[n].dTiltOffset = g_VisionManager.fn_GetTiltInterpolation(stvisionResult.stRecipeList[n].dTilt);
                //Console.WriteLine($"TiltOffset- Offset - {n}:{stvisionResult.stRecipeList[n].dTiltOffset}, Tilt : {stvisionResult.stRecipeList[n].dTilt}");
                //fn_WriteLog($"TiltOffset- Offset - {n}:{stvisionResult.stRecipeList[n].dTiltOffset}, Tilt : {stvisionResult.stRecipeList[n].dTilt}");

                if (stvisionResult.stRecipeList[n].dStartX <dPlateInterpolationPosX - dXOffset || stvisionResult.stRecipeList[n].dStartX> dPlateInterpolationPosX + dXOffset)
                {
                    fn_WriteLog($"Start X InPosition Error.{n}", EN_LOG_TYPE.ltVision);
                    //bErr = true;
                }
                if (stvisionResult.stRecipeList[n].dEndX <dPlateInterpolationPosX - dXOffset || stvisionResult.stRecipeList[n].dEndX> dPlateInterpolationPosX + dXOffset)
                {
                    //bErr = true;
                }
                if (stvisionResult.stRecipeList[n].dStartY <dPlateInterpolationPosY - dYOffset || stvisionResult.stRecipeList[n].dStartY> dPlateInterpolationPosY + dYOffset)
                {
                    //bErr = true;
                }
                if (stvisionResult.stRecipeList[n].dEndY <dPlateInterpolationPosY - dYOffset || stvisionResult.stRecipeList[n].dEndY> dPlateInterpolationPosY + dYOffset)
                {
                    //bErr = true;
                }
            }


            //File Save
            SEQ_SPIND.fn_LoadVisnResult(false);
            DM.MAGA[(int)EN_MAGA_ID.POLISH].SetTo((int)EN_PLATE_STAT.ptsPolish);
        }
示例#15
0
        private void fn_tmUpdate(object sender, EventArgs e)
        {
            //Timer
            //m_UpdateTimer.Stop();
            m_UpdateTimer.IsEnabled = false;

            //Update Tool Info
            DM.STOR[(int)EN_STOR_ID.POLISH].fn_UpdateMap(ref lbStorg);
            DM.STOR[(int)EN_STOR_ID.CLEAN].fn_UpdateMap(ref lbStorg1);

            //Plate
            DM.MAGA[(int)EN_MAGA_ID.POLISH].fn_UpdateMap(ref lbPoliPlate);
            DM.MAGA[(int)EN_MAGA_ID.CLEAN].fn_UpdateMap(ref lbClenPlate);
            DM.MAGA[(int)EN_MAGA_ID.LOAD].fn_UpdateMap(ref lbLoadPlate);
            DM.MAGA[(int)EN_MAGA_ID.TRANS].fn_UpdateMap(ref lbTransPlate);

            //Magazine
            DM.MAGA[(int)EN_MAGA_ID.MAGA01].fn_UpdateMap(ref lbMagz01);
            DM.MAGA[(int)EN_MAGA_ID.MAGA02].fn_UpdateMap(ref lbMagz02);

            //
            DM.TOOL.fn_UpdateMap(ref lbSpdlPlate, ref lbSpdlTool, ref lbSpdlToolFce, ref lbNeedCheck);

            lbCrntRcpName.Text = string.Format("[{0}] {1}", LOT._bLotOpen ? "OPEN" : "", FM._sRecipeName);
            //lbCrntRcpName.Background  = LOT._bLotOpen? Brushes.Lime : Brushes.WhiteSmoke; //SEQ._bRecipeOpen
            lbRcp.Background = LOT._bLotOpen ? Brushes.LimeGreen : Brushes.WhiteSmoke;

            lbReqPoli.Background = SEQ_SPIND._bReqUtil_Polish ? Brushes.Lime : Brushes.LightGray;

            lbReqPoli.Visibility     = FM.fn_IsLvlMaster() ? Visibility.Visible : Visibility.Hidden; //JUNG/210113
            lbSpdlToolFce.Visibility = FM.fn_IsLvlMaster() ? Visibility.Visible : Visibility.Hidden;
            lbNeedCheck.Visibility   = FM.fn_IsLvlMaster() ? Visibility.Visible : Visibility.Hidden;

            //LDCBTM._dLoadCellValue * ONEGRAM_TO_NEWTON
            upLoadCell.UPValue = string.Format($"{LDCBTM.fn_GetBtmLoadCell(true)} N [{LDCBTM.fn_GetBtmLoadCell()} g]");

            lbRPM.Content = string.Format("SPINDLE RPM : {0} / {1}", SEQ_SPIND.fn_GetSpindleSpeed(), SEQ_SPIND.fn_GetSpindleDir() ? "DIR : FWD" : "DIR : BWD");

            //lbCrntFos.Content = string.Format($"[LOAD CELL] TOP : {IO.fn_GetTopLoadCell(true)} N");
            lbCrntFos.Content = string.Format($"[LOAD CELL] TOP : {IO.fn_GetTopLoadCellAsBTM(true)} N"); //JUNG/200910/

            lbUTLevel.Content = string.Format($"UTIL LEVEL : {IO.fn_GetUTAvgValue():F1}");               //JUNG/200423/Avg Value

            //JUNG/201119/Min,Max Reset
            if (SEQ_SPIND._bReqResetGraph)
            {
                SEQ_SPIND._bReqResetGraph = false;
                fn_SetGraphRange();
            }

            // AddGraph
            if (nGraphTick > ug_LoadCellTop.UGDataCount)
            {
                ug_LoadCellTop.RemoveFirst();
            }
            double dTopLoadCell = IO.fn_GetTopLoadCellAsBTM(true); //IO.fn_GetTopLoadCell(true);

            ug_LoadCellTop.UGValue = $"{dTopLoadCell} N";
            //ug_LoadCellTop.UGMaxValue = 10;
            ug_LoadCellTop.AddPoint(new Point(nGraphTick++, dTopLoadCell));
            ug_LoadCellTop.Refresh();

            lbDCOM.Content = string.Format($"[DCOM] SET: {SEQ_SPIND._dForceRatio:F2} / READ: {IO.fn_GetDCOMValue()}");

            if (SEQ_SPIND._bDrngPolishing)
            {
                lbPoliCnt.Content = string.Format($"POLISHING COUNT : {SEQ_SPIND.fn_GetCurrMillCnt(true)} / CYCLE: {SEQ_SPIND._nPolCycle+1} / STEP : {SEQ_SPIND._nPoliCnt+1}");
            }
            else if (SEQ_SPIND._bDrngCleaning)
            {
                lbPoliCnt.Content = string.Format($"CLEANING COUNT : {SEQ_SPIND.fn_GetCurrMillCnt(true)} / CYCLE : {SEQ_SPIND._nClnCycle+1} / STEP : {SEQ_SPIND._nPoliCnt+1}");
            }

            //lbFlowMT1.Content = string.Format($"[FLOW] POLISHING SLURY :  {IO.fn_GetFlowMeter(EN_AINPUT_ID.aiPOL_SlurryFlow ):F1}");
            //lbFlowMT2.Content = string.Format($"[FLOW] POLISHING DI    :  {IO.fn_GetFlowMeter(EN_AINPUT_ID.aiPOL_DIWaterFlow):F1}");
            //lbFlowMT3.Content = string.Format($"[FLOW] CLEANING  DI    :  {IO.fn_GetFlowMeter(EN_AINPUT_ID.aiCLN_DIWaterFlow):F1}");

            lbLotNo.Text = string.Format($"LOT No : {LOT._sLotNo}");

            lbStartTime.Content = string.Format($"[TOTAL] START TIME : {SEQ_TRANS._sStartTime}");
            lbEndTime.Content   = string.Format($"[TOTAL] END TIME : { SEQ_TRANS._sEndTime   }");

            lbMillStartTime.Content = (SEQ._bFlick3) ? string.Format($"[POL]START TIME : {SEQ_SPIND._sMillStartTime}") : string.Format($"[CLN]START TIME : {SEQ_SPIND._sCleanStartTime}");
            lbMillEndTime.Content   = (SEQ._bFlick3) ? string.Format($"[POL]END TIME : {SEQ_SPIND._sMillEndTime}")     : string.Format($"[CLN]END TIME : { SEQ_SPIND._sCleanEndTime   }");


            if (SEQ_SPIND._bDrngPolishing)
            {
                pbPoli.Visibility    = Visibility.Visible;
                tbPolibar.Visibility = Visibility.Visible;

                pbPoli.Value = SEQ_SPIND.fn_GetMillPercent();
            }
            else
            {
                pbPoli.Visibility    = Visibility.Hidden;
                tbPolibar.Visibility = Visibility.Hidden;
            }

            if (SEQ_SPIND._bDrngCleaning)
            {
                //pbClen   .Visibility = Visibility.Hidden; //삭제
                //tbClenbar.Visibility = Visibility.Hidden;
                //pbClen.Value = ((IO.DATA_ACS_TO_EQ[(int)EN_ACS_TO_EQ.ATE_Milling_Cnt] + (100 * SEQ_SPIND._nCleanCnt)) / 400.0) * 100.0;
            }
            else
            {
                pbClen.Visibility    = Visibility.Hidden;
                tbClenbar.Visibility = Visibility.Hidden;
            }

            //
            lbSpdlState.Content = SEQ_SPIND.fn_GetSeqMsg();
            lbPoliState.Content = SEQ_POLIS.fn_GetSeqMsg();
            lbClenState.Content = SEQ_CLEAN.fn_GetSeqMsg();
            lbTranState.Content = SEQ_TRANS.fn_GetSeqMsg();

            //
            //m_UpdateTimer.Start();
            m_UpdateTimer.IsEnabled = true;
        }