LineBean_Shunt.cs 15.3 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.Tasks;

namespace OnlineStore.DeviceLibrary
{
    partial class LineBean
    {
        public bool DisableShunt = false;
        private Stopwatch ShuntCheck1Watch = new Stopwatch();
        private Stopwatch shuntCheck4Watch = new Stopwatch();
        private bool shuntPro = false;
        private DateTime shuntProTime = DateTime.Now;
        private static LineMoveInfo Shunt_MoveInfo = null;
        public int ShuntWaitTrayNum = -1;
        internal int ShuntTrayNum = 0;

        /// <summary>
        /// 判断进仓9第二个阻挡是否可以下降
        /// </summary>
        /// <returns></returns>
        public bool Move9CanStop2Down(int deviceId, int trayNum)
        {
            if (DisableShunt)
            {
                return true;
            }
            if (!deviceId.Equals(9))
            {
                return true;
            }
            if (ShuntWaitTrayNum <= 0 &&
                IOValue(IO_Type.Shunt_Check1_Front).Equals(IO_VALUE.LOW) &&
                IOValue(IO_Type.Shunt_Check2_Middle).Equals(IO_VALUE.LOW))
            {
                if (Shunt_MoveInfo.MoveType.Equals(LineMoveType.None) ||
                    (Shunt_MoveInfo.MoveStep >= LineMoveStep.Shunt09_Top1Down))
                {
                    if (CylinderIsOk(IO_Type.Shunt_TopCylinder_Up1, IO_Type.Shunt_TopCylinder_Down1))
                    {
                        LogUtil.info("Move9CanStop2Down ,[" + deviceId + "][" + trayNum + "] ,return true ");
                        ShuntWaitTrayNum = trayNum;
                        return true;
                    }
                    else
                    {
                        CylinderMove(null, IO_Type.Shunt_TopCylinder_Up1, IO_Type.Shunt_TopCylinder_Down1);
                    }
                }
            }
            return false;
        }

        /// <summary>
        /// 判断分流阻挡2是否可以下降
        /// </summary>
        /// <returns></returns>
        public bool ShuntStop2CanDown()
        {
            if (DisableShunt)
            {
                return true;
            }
            if (IOValue(IO_Type.Shunt_Check3_Back).Equals(IO_VALUE.LOW) && IOValue(IO_Type.Shunt_StopDown2_Back).Equals(IO_VALUE.LOW))
            {
                if ((Shunt_MoveInfo.MoveType.Equals(LineMoveType.None) ||
                        Shunt_MoveInfo.MoveStep <= LineMoveStep.Shunt03_WaitCheck1Low))
                {
                    if (CylinderIsOk(IO_Type.Shunt_TopCylinder_Up2, IO_Type.Shunt_TopCylinder_Down2))
                    {
                        return true;
                    }
                    else
                    {
                        CylinderMove(null, IO_Type.Shunt_TopCylinder_Up2, IO_Type.Shunt_TopCylinder_Down2);
                    }
                }
            }
            return false;
        }
        /// <summary>
        /// 判断分流横移 升降2是否可上升
        /// </summary>
        /// <returns></returns>
        private bool Shunt_Updown2CanUp()
        {
            if (IOValue(IO_Type.Shunt_StopDown2_Back).Equals(IO_VALUE.LOW)
                && IOValue(IO_Type.Shunt_Check3_Back).Equals(IO_VALUE.LOW))
            {
                return true;
            }
            return false;
        }
        private void UpateShuntTrayNum()
        {
            ShuntTrayNum = ShuntWaitTrayNum;
            ShuntWaitTrayNum = -1;
        }
        public void ShuntStop()
        {
            ShuntWaitTrayNum = -1;
            ShuntCheck1Watch.Stop();
            shuntCheck4Watch.Stop();

            Shunt_MoveInfo.EndMove();
            if (DisableShunt)
            {
                IOMove(IO_Type.Shunt_StopDown1_Front, IO_VALUE.HIGH);
                IOMove(IO_Type.Shunt_StopDown2_Back, IO_VALUE.HIGH);
            }
            else
            {
                IOMove(IO_Type.Shunt_StopDown1_Front, IO_VALUE.LOW);
                IOMove(IO_Type.Shunt_StopDown2_Back, IO_VALUE.LOW);
            }
            CheckAndMove(IO_Type.Shunt_MotorRun1, IO_VALUE.LOW);
            CheckAndMove(IO_Type.Shunt_MotorRun2, IO_VALUE.LOW);
            CylinderMove(null, IO_Type.Shunt_TopCylinder_Up1, IO_Type.Shunt_TopCylinder_Down1);
            CylinderMove(null, IO_Type.Shunt_TopCylinder_Up2, IO_Type.Shunt_TopCylinder_Down2);
        }
         
        private void ShuntTimerProcess()
        {
            if (DisableShunt)
            {
                return;
            }
            TimeSpan span = DateTime.Now - shuntProTime;
            if (shuntPro && span.TotalSeconds < 5)
            {
                return;
            }
            try
            {
                shuntPro = true;
                shuntProTime = DateTime.Now;
                if (!CanProcessLine())
                {
                    shuntPro = false;
                    return;
                }

                if (Shunt_MoveInfo.MoveType.Equals(LineMoveType.None))
                {
                    if (IOValue(IO_Type.Shunt_Check1_Front).Equals(IO_VALUE.HIGH)&& IOValue(IO_Type.Shunt_Check2_Middle).Equals(IO_VALUE.HIGH))
                    {
                        if (TrayManager.checkWatch(ShuntCheck1Watch, 400, true))
                        {
                            Shunt_MoveInfo.NewMove(LineMoveType.InStore);
                            Shunt_MoveInfo.NextMoveStep(LineMoveStep.Shunt01_WaitTime);
                            UpateShuntTrayNum();
                            ShuntLog("分流横移:等待阻挡1亮,阻挡2亮,阻挡1上升,升降1下降   ");
                            CylinderMove(Shunt_MoveInfo, IO_Type.Shunt_TopCylinder_Up1, IO_Type.Shunt_TopCylinder_Down1,true);
                            CheckAndMove(IO_Type.Shunt_StopDown1_Front, IO_VALUE.LOW);
                            Shunt_MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Shunt_Check1_Front, IO_VALUE.HIGH));
                            Shunt_MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Shunt_Check2_Middle, IO_VALUE.HIGH));
                        }
                    }
                    else
                    {
                        ShuntCheck1Watch.Stop();
                    }

                }
                else
                {
                    ShuntCheck1Watch.Stop();
                    ShuntBusyProcess();
                }

                //升降2处过托盘
                if (IOValue(IO_Type.Shunt_Check4_BStop).Equals(IO_VALUE.HIGH)  )
                {
                    if (TrayManager.checkWatch(shuntCheck4Watch, 300, false))
                    {
                        if (ShuntStop2CanDown())
                        {
                            IOMove(IO_Type.Shunt_StopDown2_Back, IO_VALUE.HIGH, 1200);
                            shuntCheck4Watch.Stop();
                        }
                    } 
                }
                else
                {
                    shuntCheck4Watch.Stop();
                }

            }
            catch (Exception ex)
            {
                LogUtil.error(Name + "ShuntTimerProcess 出错:", ex);
            }
            shuntPro = false;
        }

        private void ShuntBusyProcess()
        {
            if (Shunt_MoveInfo.IsInWait)
            {
                CheckWait(Shunt_MoveInfo);
            }
            if (Shunt_MoveInfo.IsInWait)
            {
                return;
            }

            if (Shunt_MoveInfo.MoveStep.Equals(LineMoveStep.Shunt01_WaitTime))
            {
                string msg = "";
                if (TrayNeedShunt(ShuntTrayNum, out msg))
                {
                    Shunt_MoveInfo.NextMoveStep(LineMoveStep.Shunt05_Top1Up);
                    LogUtil.info(Name + "[" + ShuntTrayNum + "]" + "分流横移:" + msg + " 需要分流,阻挡1上升,升降1上升 ,等待升降2是否可上升 ");

                    CylinderMove(Shunt_MoveInfo, IO_Type.Shunt_TopCylinder_Down1, IO_Type.Shunt_TopCylinder_Up1);
                    if (Shunt_Updown2CanUp())
                    {
                        CylinderMove(null, IO_Type.Shunt_TopCylinder_Down2, IO_Type.Shunt_TopCylinder_Up2);
                        Shunt_MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Shunt_TopCylinder_Down2, IO_VALUE.LOW));
                    }
                }
                else
                {
                    Shunt_MoveInfo.NextMoveStep(LineMoveStep.Shunt02_Stop1Down);
                    LogUtil.info(Name + "[" + ShuntTrayNum + "]" + "分流横移: 不需要分流,直接放行,Shunt_StopDown1_Front 下降1200   ");
                    IOMove(IO_Type.Shunt_StopDown1_Front, IO_VALUE.HIGH, 1200);
                } 
            }
            else if (Shunt_MoveInfo.MoveStep.Equals(LineMoveStep.Shunt02_Stop1Down))
            {
                Shunt_MoveInfo.NextMoveStep(LineMoveStep.Shunt03_WaitCheck1Low);
                ShuntLog("分流横移: 不需要分流,等待检测1信号消失   ");
                Shunt_MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Shunt_Check1_Front, IO_VALUE.LOW));
            }
            else if (Shunt_MoveInfo.MoveStep.Equals(LineMoveStep.Shunt03_WaitCheck1Low))
            {
                Shunt_MoveInfo.EndMove();
                ShuntLog("分流横移:  已离开  ");
            }

            else if (Shunt_MoveInfo.MoveStep.Equals(LineMoveStep.Shunt05_Top1Up))
            {
                if (CylinderIsOk(IO_Type.Shunt_TopCylinder_Down1, IO_Type.Shunt_TopCylinder_Up1) &&
                    IOValue(IO_Type.Shunt_TopCylinder_Down2).Equals(IO_VALUE.LOW))
                {
                    Shunt08_DriveMotorMove();
                }
                else if (Shunt_Updown2CanUp())
                {
                    Shunt_MoveInfo.NextMoveStep(LineMoveStep.Shunt07_Top2Up);
                    ShuntLog("分流横移:升降2开始上升  ");
                    CylinderMove(null, IO_Type.Shunt_TopCylinder_Down2, IO_Type.Shunt_TopCylinder_Up2);
                    Shunt_MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Shunt_TopCylinder_Down2, IO_VALUE.LOW));
                }
                else if (Shunt_MoveInfo.IsTimeOut(120))
                {
                    WarnMsg = MoveInfo.Name + "[" + MoveInfo.MoveType + "][" + MoveInfo.SLog + "]等待分流横移2可以上升[" + Math.Round(MoveInfo.StepSpan().TotalSeconds, 1) + "]秒";
                    LogUtil.error(WarnMsg, DeviceID * 1000 + 12);
                    Alarm(LineAlarmType.IoSingleTimeOut);
                }
            }
            else if (Shunt_MoveInfo.MoveStep.Equals(LineMoveStep.Shunt07_Top2Up))
            {
                Shunt08_DriveMotorMove();
            }
            else if (Shunt_MoveInfo.MoveStep.Equals(LineMoveStep.Shunt08_DriveMotorMove))
            {
                if (IOValue(IO_Type.Shunt_Check2_Middle).Equals(IO_VALUE.LOW) && IOValue(IO_Type.Shunt_Check1_Front).Equals(IO_VALUE.LOW))
                {
                    Shunt_MoveInfo.NextMoveStep(LineMoveStep.Shunt09_Top1Down);
                    ShuntLog("分流横移:升降1先下降     ");
                    Shunt_MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(100));
                    CylinderMove(null, IO_Type.Shunt_TopCylinder_Up1, IO_Type.Shunt_TopCylinder_Down1);

                    Shunt_MoveInfo.NextMoveStep(LineMoveStep.Shunt10_WaitCheck);
                    ShuntLog("分流横移:再次等待检测2low,检测3high,停止皮带线1     ");
                    IOMove(IO_Type.Shunt_MotorRun1, IO_VALUE.LOW);
                    Shunt_MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Shunt_Check3_Back, IO_VALUE.HIGH));
                    Shunt_MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Shunt_Check2_Middle, IO_VALUE.LOW));
                }
            }
            else if (Shunt_MoveInfo.MoveStep.Equals(LineMoveStep.Shunt09_Top1Down))
            {
                Shunt_MoveInfo.NextMoveStep(LineMoveStep.Shunt10_WaitCheck);
                ShuntLog("分流横移:再次等待检测2low,检测3high,停止皮带线1     ");
                IOMove(IO_Type.Shunt_MotorRun1, IO_VALUE.LOW);
                Shunt_MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Shunt_Check3_Back, IO_VALUE.HIGH));
                Shunt_MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Shunt_Check2_Middle, IO_VALUE.LOW));
            }
            else if (Shunt_MoveInfo.MoveStep.Equals(LineMoveStep.Shunt10_WaitCheck))
            {
                if (IOValue(IO_Type.Shunt_Check3_Back).Equals(IO_VALUE.HIGH))
                {
                    Shunt_MoveInfo.NextMoveStep(LineMoveStep.Shunt11_TopDown);
                    ShuntLog("分流横移:升降2下降  ,皮带线2停止   ");
                    CylinderMove(Shunt_MoveInfo, IO_Type.Shunt_TopCylinder_Up1, IO_Type.Shunt_TopCylinder_Down1);
                    CylinderMove(Shunt_MoveInfo, IO_Type.Shunt_TopCylinder_Up2, IO_Type.Shunt_TopCylinder_Down2);
                    IOMove(IO_Type.Shunt_MotorRun2, IO_VALUE.LOW);
                }
            }
            else if (Shunt_MoveInfo.MoveStep.Equals(LineMoveStep.Shunt11_TopDown))
            {
                Shunt_MoveInfo.EndMove();
                ShuntLog("分流横移: 已离开  ");
            }
        }  
       
        private void Shunt08_DriveMotorMove()
        {
            Shunt_MoveInfo.NextMoveStep(LineMoveStep.Shunt08_DriveMotorMove);
            Shunt_MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1500));
            ShuntLog("分流横移:两边皮带线开始转动,等待检测2low,检测3high ");
            IOMove(IO_Type.Shunt_MotorRun1, IO_VALUE.HIGH);
            IOMove(IO_Type.Shunt_MotorRun2, IO_VALUE.HIGH);
            CylinderMove(Shunt_MoveInfo, IO_Type.Shunt_TopCylinder_Down2, IO_Type.Shunt_TopCylinder_Up2);
            Shunt_MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Shunt_Check1_Front, IO_VALUE.LOW));
            Shunt_MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Shunt_Check2_Middle, IO_VALUE.LOW));
        }
      

        private bool TrayNeedShunt(int trayNum, out string outMsg)
        {
            outMsg = "";
            int lineNum = DeviceID % 100;
            TrayInfo trayInfo = TrayManager.GetTrayInfo(trayNum);
            if (!trayInfo.IsFull)
            {
                return false;
            }
            if (trayInfo.IsFull)
            {
                InOutParam inoup = trayInfo.InoutPar;
                if (trayInfo.InOrOutStore.Equals(ReelType.InStore))
                {
                    if (inoup.InStoreNg)
                    {
                        outMsg = "入料NG料";
                        return true;
                    }
                    else if (inoup.GetStoreId().Equals(10).Equals(false))
                    {
                        outMsg = "非10号仓入库";
                        return true;
                    }
                }
                else if (trayInfo.InOrOutStore.Equals(ReelType.OutStore) && inoup.urgentReel.Equals(false) && inoup.cutReel.Equals(false))
                {
                    outMsg = "皮带线出料";
                    return true;
                }
            }
            return false;
        }

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