LineBean_T3-C1.cs 13.8 KB
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace OnlineStore.DeviceLibrary
{

    partial class LineBean
    {  
        private bool T3C1_Pro = false;
        private DateTime T3C1_ProTime = DateTime.Now;
        private static LineMoveInfo T3C1__MoveInfo = null; 
        internal int T3C1_TrayNum = 0;

        
        private void Update_T3C1_TrayNum()
        {
            T3C1_TrayNum = RFIDManager.GetTrayNum(300); 
        }
        public void T3C1_Stop(LineMoveInfo moveInfo = null)
        { 
            T3C1__MoveInfo.EndMove(); 
            IOMove(IO_Type.HY_FrontStopDown, IO_VALUE.LOW);
            IOMove(IO_Type.HY_StopDown, IO_VALUE.LOW);
            CylinderMove(moveInfo, IO_Type.HY_TopCylinder_UP, IO_Type.HY_TopCylinder_Down);
        }

        private void T3C1_TimerProcess()
        { 
            TimeSpan span = DateTime.Now - T3C1_ProTime;
            if (T3C1_Pro && span.TotalSeconds < 5)
            {
                return;
            }
            try
            {
                T3C1_Pro = true;
                T3C1_ProTime = DateTime.Now;
                if (!CanProcessLine())
                {
                    T3C1_Pro = false;
                    return;
                }

                if (T3C1__MoveInfo.MoveType.Equals(LineMoveType.None))
                { 
                       T3C1_CheckFixture(); 
                }
                else
                {
                    T3C1_BusyProcess(); 
                } 
            }
            catch (Exception ex)
            {
                LogUtil.error(Name + "T3C1_TimerProcess 出错:", ex);
            }
            T3C1_Pro = false;
        }
     
        private Stopwatch trayCheckWait = new Stopwatch();
        private Stopwatch trayCheck2LowWait = new Stopwatch();
        private object lockObj = "";
        private void T3C1_CheckFixture()
        {
            if (Monitor.TryEnter(lockObj, 100))
            {
                try
                {
                    if (T3C1__MoveInfo.MoveType.Equals(LineMoveType.None).Equals(false))
                    {
                        if (IOValue(IO_Type.HY_TrayCheck).Equals(IO_VALUE.HIGH))
                        {
                            trayCheck2LowWait.Stop();
                        }
                        else
                        {
                            TrayManager.checkWatch(trayCheck2LowWait, 30000, false);
                        }
                        LogUtil.error(Name + "  T3C1_CheckFixture " + " 不在空闲中,直接返回 ");
                        return;
                    }
                    if (T3C1__MoveInfo.MoveType.Equals(LineMoveType.None))
                    { 
                        if (IOValue(IO_Type.HY_TrayCheck).Equals(IO_VALUE.HIGH))
                        {
                            trayCheck2LowWait.Stop();
                            if (  TrayManager.checkWatch(trayCheckWait, TrayManager.SwTrayWaitTime, true))
                            {
                                T3C1__MoveInfo.NewMove(LineMoveType.CheckFixture);
                                T3C1__MoveInfo.NextMoveStep(LineMoveStep.MIO_03_StopUp);

                                T3C1_Log("检测到阻挡托盘," + T3C1__MoveInfo.SLog + "  ,前阻挡上升,阻挡上升");
                                Update_T3C1_TrayNum();
                                IOMove(IO_Type.HY_FrontStopDown, IO_VALUE.LOW);
                                T3C1__MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.HY_FrontStopCheck, IO_VALUE.LOW));
                                IOMove(IO_Type.HY_StopDown, IO_VALUE.LOW);
                                T3C1__MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.HY_StopDown, IO_VALUE.LOW));
                            }
                        }
                        else
                        {
                            bool check2IsOk = TrayManager.checkWatch(trayCheck2LowWait, TrayManager.SwTrayWaitTime, false);
                            if (IOValue(IO_Type.HY_FrontStopCheck).Equals(IO_VALUE.HIGH))
                            {
                                if (TrayManager.checkWatch(trayCheckWait, TrayManager.SwTrayWaitTime, false) && check2IsOk  )
                                {
                                    trayCheckWait.Stop();
                                    trayCheck2LowWait.Stop();
                                    //托盘在第一个阻挡处
                                    T3C1__MoveInfo.NewMove(LineMoveType.CheckFixture);
                                    T3C1__MoveInfo.NextMoveStep(LineMoveStep.MIO_00_Stop1Down);
                                    T3C1_Log(" 托盘检测:" + T3C1__MoveInfo.SLog + ",检测到HY_FrontStopCheck,前阻挡下降 , 等待  HY_FrontStopCheck=0,清理托盘RFID");
                                    T3C1_TrayNum = 0;
                                    IOMove(IO_Type.HY_FrontStopCheck, IO_VALUE.HIGH, 1200);
                                    T3C1__MoveInfo.OneWaitCanEndStep = true;
                                    T3C1__MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.HY_FrontStopCheck, IO_VALUE.LOW));
                                    T3C1__MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.HY_TrayCheck, IO_VALUE.HIGH));
                                }
                            }
                            else
                            {
                                trayCheckWait.Stop();
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    LogUtil.error(Name + "  StartCheckFixture " + " 出错:" + ex.ToString());
                }
                finally
                {
                    Monitor.Exit(lockObj);
                }
            }
            else
            {
                LogUtil.error(Name + "  StartCheckFixture " + "失败,未得到锁");
            }
        }

        private void T3C1_BusyProcess()
        {
            if (T3C1__MoveInfo.IsInWait)
            {
                CheckWait(T3C1__MoveInfo);
            }
            if (T3C1__MoveInfo.IsInWait)
            {
                return;
            }
            #region 托盘检测
            if (T3C1__MoveInfo.MoveStep.Equals(LineMoveStep.MIO_00_Stop1Down))
            {
                T3C1__MoveInfo.NextMoveStep(LineMoveStep.MIO_01_TrayCheck);
                T3C1_Log("托盘阻挡" + T3C1__MoveInfo.SLog + "   前阻挡上升,等待 阻挡托盘检测=1");
                T3C1__MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.HY_TrayCheck, IO_VALUE.HIGH));
            }
            else if (T3C1__MoveInfo.MoveStep.Equals(LineMoveStep.MIO_01_TrayCheck))
            {
                T3C1__MoveInfo.NextMoveStep(LineMoveStep.MIO_03_StopUp);
                T3C1_Log("托盘阻挡" + T3C1__MoveInfo.SLog + "  再次等待托盘信号");
                T3C1__MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.HY_TrayCheck, IO_VALUE.HIGH));
            }
            else if (T3C1__MoveInfo.MoveStep.Equals(LineMoveStep.MIO_03_StopUp))
            {
                T3C1__MoveInfo.NextMoveStep(LineMoveStep.MIO_04_Wait);
                T3C1_Log("托盘阻挡" + T3C1__MoveInfo.SLog + "  ,等待编码信号稳定 HY_TrayCheck=1");
                CheckAndMove(IO_Type.HY_FrontStopDown, IO_VALUE.LOW);
                T3C1__MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.HY_TrayCheck, IO_VALUE.HIGH));
            }
            else if (T3C1__MoveInfo.MoveStep.Equals(LineMoveStep.MIO_04_Wait))
            {
                try
                {
                    Update_T3C1_TrayNum();

                    if (TrayNeedT3C1(T3C1_TrayNum))
                    {
                        T3C1__MoveInfo.NextMoveStep(LineMoveStep.MIO_05_WaitTime);
                        T3C1_Log("托盘阻挡" + T3C1__MoveInfo.SLog + " 入库中需要空托盘,等待200");
                        T3C1__MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(200));
                    }
                    else
                    {
                        LogUtil.debug(Name + T3C1__MoveInfo.MoveNum + "*************** ,当前托盘【" + T3C1_TrayNum + "】放盘通过~");
                        T3C1__MoveInfo.NextMoveStep(LineMoveStep.MO_15_WaitCanGo);
                        T3C1__MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(100));
                    }
                }
                catch (Exception ex)
                {
                    LogUtil.error("判断托盘是否需要顶升出错:", ex);
                }
            }
            else if (T3C1__MoveInfo.MoveStep.Equals(LineMoveStep.MIO_05_WaitTime))
            {
                //如果是出库,且盘高大于30,暂不顶升
                T3C1__MoveInfo.NextMoveStep(LineMoveStep.MIO_06_TopUp);
                T3C1_Log("托盘阻挡" + T3C1__MoveInfo.SLog + "  顶升气缸上 升 )");
                CylinderMove(T3C1__MoveInfo, IO_Type.TopCylinder_Down, IO_Type.TopCylinder_UP);
            }
            else if (T3C1__MoveInfo.MoveStep.Equals(LineMoveStep.MIO_06_TopUp))
            {
                T3C1_Log("托盘阻挡*************** 托盘号【" + T3C1_TrayNum + "】");
                T3C1__MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(10000));
                //托盘号正确 
                //判断盘是空盘,空盘并且编号正确才需要放料盘过去
                if (TrayNeedT3C1(T3C1_TrayNum))
                {
                    T3C1__MoveInfo.MoveParam = new InOutParam(T3C1_TrayNum); 
                    LogInfo(T3C1__MoveInfo.MoveNum + "*************** 空托盘【" + T3C1_TrayNum + "】,正在入库中,移栽料盘");
                    T3C1__MoveInfo.NextMoveStep(LineMoveStep.MO_11_CodeRember);
                } 
                else
                {
                    T3C1__MoveInfo.NextMoveStep(LineMoveStep.MO_14_TopDown);
                    T3C1_Log("托盘检测" + T3C1__MoveInfo.SLog + " ,托盘号【" + T3C1_TrayNum + "】,直接放盘通过,顶升气缸下降 ");
                    CylinderMove(T3C1__MoveInfo, IO_Type.TopCylinder_UP, IO_Type.TopCylinder_Down);
                }
            }

            #endregion

            #region 不需要出入库,直接放行
            else if (T3C1__MoveInfo.MoveStep.Equals(LineMoveStep.MO_14_TopDown))
            {
                MO_16_Stop2Down();
            }
            else if (T3C1__MoveInfo.MoveStep.Equals(LineMoveStep.MO_15_WaitCanGo))
            {
                MO_16_Stop2Down();
            }
            else if (T3C1__MoveInfo.MoveStep.Equals(LineMoveStep.MO_16_Stop2Down))
            {
                T3C1__MoveInfo.NextMoveStep(LineMoveStep.MO_17_Stop2Check);
                T3C1_Log("托盘放行" + T3C1__MoveInfo.SLog + " , 等待StopCylinder_Check2=0");
                T3C1__MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.HY_TrayCheck, IO_VALUE.LOW));
            }
            else if (T3C1__MoveInfo.MoveStep.Equals(LineMoveStep.MO_17_Stop2Check))
            {
                T3C1__MoveInfo.NextMoveStep(LineMoveStep.MO_18_WaitTime);
                T3C1_Log("托盘放行  " + T3C1__MoveInfo.SLog + " , 等待300ms后阻挡2上升");
                T3C1__MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(300));
            }
            else if (T3C1__MoveInfo.MoveStep.Equals(LineMoveStep.MO_18_WaitTime))
            {
                T3C1__MoveInfo.NextMoveStep(LineMoveStep.MO_19_StopUp);
                T3C1_Log("托盘放行" + T3C1__MoveInfo.SLog + " , 阻挡气缸1-2上升 )");
                IOMove(IO_Type.StopDown2, IO_VALUE.LOW);
                T3C1__MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(100));
                T3C1__MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.StopDown2, IO_VALUE.LOW));
            }
            else if (T3C1__MoveInfo.MoveStep.Equals(LineMoveStep.MO_19_StopUp))
            {
                T3C1_Log("托盘放行  SecondMove:(托盘放行结束) ");
                T3C1__MoveInfo.EndMove();
            }
            #endregion
        }

        private void MO_16_Stop2Down()
        {
            T3C1__MoveInfo.NextMoveStep(LineMoveStep.MO_16_Stop2Down);
            T3C1_Log("托盘放行" + T3C1__MoveInfo.SLog + " ,阻挡气缸2下降 ");
            IOMove(IO_Type.HY_StopDown, IO_VALUE.HIGH);
            T3C1__MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.HY_StopDown, IO_VALUE.HIGH));
        }
        private bool TrayNeedT3C1(int trayNum)
        {
            try
            {
                TrayInfo trayInfo = TrayManager.GetTrayInfo(trayNum);
                if (trayInfo.IsFull)
                {
                    return false;
                }
                //判断T3是否在入库等待托盘
                FeedingEquip feedT3 = FeedingEquipMap[103]; 
                if (feedT3.CurrTrayIsNeed(T3C1_TrayNum, false))
                {
                    LogInfo("T3C1: T3在入库托盘等待中,拦截托盘【" + T3C1_TrayNum + "】");
                    return true; 
                } 
            }
            catch (Exception ex)
            {
                LogUtil.error("TrayNeedT3C1_出错:" + ex.ToString());
            }
            return false;
        }

        private void T3C1_Log(string msg)
        {
            LogUtil.debug(Name + "[" + T3C1_TrayNum + "]" + msg);
        } 

        internal bool T3C1TrayIsReady()
        {
            if (T3C1__MoveInfo.MoveType.Equals(LineMoveType.CheckFixture) && T3C1__MoveInfo.MoveStep.Equals(LineMoveStep.MO_11_CodeRember))
            {
                return true;
            }
            return false;
        }

        internal void T3C1TrayCanLeave()
        { 
            MO_16_Stop2Down();
        }
    }
}