PackageLine_BenQInShelf.cs 12.1 KB
 using OnlineStore.LoadCSVLibrary;

namespace OnlineStore.DeviceLibrary
{
    partial class PackageLine
    {

        /// <summary>
        /// 出口料架进入步骤
        /// </summary>
        public enum BenQ_IN_FROM_OUT_STEP
        {
            NONE,
            /// <summary>
            /// 料架手动拉出
            /// </summary>
            MANNUAL_SHELF_LEAVE,
            /// <summary>
            /// 料架手动拉出,到达提升机
            /// </summary>
            MANNUAL_SHELF_TO_UPDOWN,
            /// <summary>
            /// 料架手动拉出,离开提升机
            /// </summary>
            MANNUAL_SHELF_LEAVE_SUCCESS,
            /// <summary>
            /// 等待到达提升机
            /// </summary>
            SHELF_TO_UPDOWN,

            /// <summary>
            /// 提升机上升
            /// </summary>
            SHELF_UP,
            /// <summary>
            ///料盘在上层送入
            /// </summary>
            SHELF_ENTER,

            /// <summary>
            /// 提升机下降
            /// </summary>
            SHELF_DOWN,

            /// <summary>
            /// 等待料盘运行到中间提升机右侧的开始位置
            /// </summary>
            WAIT_SHELF_TO_READY_POS,
        }

        public StepInfo<BenQ_IN_FROM_OUT_STEP> benQInFromOutStep = new StepInfo<BenQ_IN_FROM_OUT_STEP>(BenQ_IN_FROM_OUT_STEP.NONE);



        /// <summary>
        /// 出口料架进入处理
        /// </summary>
        private void ProcessBenQEnterFromOut()
        {
            if (benQInFromOutStep.IsStep(BenQ_IN_FROM_OUT_STEP.NONE))
            {
                bool hasShelfRight = IOValue(IO_Type.R_RightStopCheck).Equals(IO_VALUE.HIGH);
                bool noShelfLeft = IOValue(IO_Type.R_LeftStopCheck).Equals(IO_VALUE.LOW);
                //上层料满
                bool full = IOValue(IO_Type.RHigh_FullCheck).Equals(IO_VALUE.HIGH);
                bool chainNoRun = IOValue(IO_Type.R_OutLineRun).Equals(IO_VALUE.LOW);
                //判断是否是手动拉料架
                if (!hasShelfRight && !noShelfLeft && chainNoRun)
                {
                    benQInFromOutStep.Msg = "检测到正在出料架";
                    benQInFromOutStep.ToNextStep(BenQ_IN_FROM_OUT_STEP.MANNUAL_SHELF_LEAVE);
                    benQInFromOutStep.AddIoWait(IO_Type.R_LeftStopCheck, IO_VALUE.HIGH);
                    benQInFromOutStep.AddIoWait(IO_Type.R_RightStopCheck, IO_VALUE.HIGH);

                }
                else if (!full)
                {
                    if (hasShelfRight && noShelfLeft && chainNoRun)//有料盘从右侧准备进入
                    {
                        CheckAndMove(IO_Type.R_RightStopCylinder, IO_VALUE.HIGH);
                        CheckAndMove(IO_Type.R_LeftStopCylinder, IO_VALUE.LOW);
                        benQInFromOutStep.ToNextStep(BenQ_IN_FROM_OUT_STEP.SHELF_TO_UPDOWN);
                        benQInFromOutStep.Msg = "检测到BenQ AGV向右侧提升机送入料架,提升机链条反转";
                        benQInFromOutStep.AddIoWait(IO_Type.R_LeftStopCheck, IO_VALUE.HIGH,5000);
                        benQInFromOutStep.AddIoWait(IO_Type.R_RightStopCheck, IO_VALUE.HIGH,5000);
                        IOMove(IO_Type.R_OutLineBackRun, IO_VALUE.HIGH);
                    }
                    else if (hasShelfRight && !noShelfLeft && benQOutStep.GetCurStep() <= BenQ_OUT_STEP.WAIT_AGV && chainNoRun)//准备送满料,但提升机上有架子
                    {
                        CheckAndMove(IO_Type.R_RightStopCylinder, IO_VALUE.HIGH);
                        CheckAndMove(IO_Type.R_LeftStopCylinder, IO_VALUE.LOW);
                        benQInFromOutStep.ToNextStep(BenQ_IN_FROM_OUT_STEP.SHELF_TO_UPDOWN);
                        benQInFromOutStep.Msg = "检测到右侧提升机有料架[准备送满料],提升机上升";
                        benQInFromOutStep.AddIoWait(IO_Type.R_LeftStopCheck, IO_VALUE.HIGH,5000);
                        benQInFromOutStep.AddIoWait(IO_Type.R_RightStopCheck, IO_VALUE.HIGH,5000);
                    }
                    else if (hasShelfRight && !noShelfLeft && chainNoRun)
                    {
                        CheckAndMove(IO_Type.R_RightStopCylinder, IO_VALUE.HIGH);
                        CheckAndMove(IO_Type.R_LeftStopCylinder, IO_VALUE.LOW);
                        benQInFromOutStep.ToNextStep(BenQ_IN_FROM_OUT_STEP.SHELF_TO_UPDOWN);
                        benQInFromOutStep.Msg = "检测到右侧提升机有料架[无满料出],提升机上升";
                        benQInFromOutStep.AddIoWait(IO_Type.R_LeftStopCheck, IO_VALUE.HIGH,5000);
                        benQInFromOutStep.AddIoWait(IO_Type.R_RightStopCheck, IO_VALUE.HIGH,5000);
                    }
                }
                else
                {
                    benQInFromOutStep.ToNextStep(BenQ_IN_FROM_OUT_STEP.NONE);
                    benQInFromOutStep.Msg = "上层料架满,无法入料架";
                }

            }

            else if (benQInFromOutStep.IsStep(BenQ_IN_FROM_OUT_STEP.MANNUAL_SHELF_LEAVE))
            {
                if (benQInFromOutStep.IsFinished())//进入提升机完成
                {
                    benQInFromOutStep.Msg = "出料架,到达右侧提升机";
                    benQInFromOutStep.ToNextStep(BenQ_IN_FROM_OUT_STEP.MANNUAL_SHELF_LEAVE_SUCCESS);
                    //CheckAndMove(IO_Type.R_LeftStopCylinder, IO_VALUE.HIGH);
                    benQInFromOutStep.AddIoWait(IO_Type.R_LeftStopCheck, IO_VALUE.LOW);
                    benQInFromOutStep.AddIoWait(IO_Type.R_RightStopCheck, IO_VALUE.LOW);
                }

            }
            else if (benQInFromOutStep.IsStep(BenQ_IN_FROM_OUT_STEP.MANNUAL_SHELF_LEAVE_SUCCESS))
            {
                if (benQInFromOutStep.IsFinished())//离开提升机完成
                {
                    benQInFromOutStep.Msg = "出料架完成";
                    benQInFromOutStep.ToNextStep(BenQ_IN_FROM_OUT_STEP.NONE);
                    CheckAndMove(IO_Type.R_LeftStopCylinder, IO_VALUE.LOW);
                }
                else
                {
                    bool timeOut = benQInFromOutStep.IsTimeOut(60000);
                    if (timeOut)
                    {
                        benQInFromOutStep.ToNextStep(BenQ_IN_FROM_OUT_STEP.NONE);
                    }
                }
            }

            else if (benQInFromOutStep.IsStep(BenQ_IN_FROM_OUT_STEP.SHELF_TO_UPDOWN))
            {
                bool noShelfRight = IOValue(IO_Type.R_RightStopCheck).Equals(IO_VALUE.LOW);
                bool noShelfLeft = IOValue(IO_Type.R_LeftStopCheck).Equals(IO_VALUE.LOW);
                if (noShelfRight && noShelfLeft)//员工手动从出口出料架,重置出口处的入料流程
                {
                    benQInFromOutStep.Msg = "从右侧出口出料架,重置BenQ AGV 出口入料流程";
                    IOMove(IO_Type.R_OutLineBackRun, IO_VALUE.LOW);
                    CheckAndMove(IO_Type.R_RightStopCylinder, IO_VALUE.LOW);
                    CheckAndMove(IO_Type.R_LeftStopCylinder, IO_VALUE.LOW);
                    benQInFromOutStep.ToNextStep(BenQ_IN_FROM_OUT_STEP.NONE);
                }

                if (benQInFromOutStep.IsFinished())//进入提升机完成
                {
                    bool hasShelfRight = IOValue(IO_Type.R_RightStopCheck).Equals(IO_VALUE.HIGH);
                    bool hasShelfLeft = IOValue(IO_Type.R_LeftStopCheck).Equals(IO_VALUE.HIGH);
                    if (hasShelfLeft && hasShelfRight)
                    {
                        benQInFromOutStep.ToNextStep(BenQ_IN_FROM_OUT_STEP.SHELF_UP);
                        benQInFromOutStep.AddTimeWait(3000);
                        IOMove(IO_Type.R_OutLineBackRun, IO_VALUE.LOW);
                        benQInFromOutStep.Msg = "料架到达右侧提升机,提升机上升";
                        benQInFromOutStep.AddIoWait(IO_Type.R_Updown_Up, IO_VALUE.HIGH,2000);
                        CylinderMove(MoveInfo, IO_Type.R_Updown_Down, IO_Type.R_Updown_Up);
                    }
                    else
                    {
                        benQInFromOutStep.Msg = "提升机内料盘在5秒内被搬走,重置AGV 出口入料流程";
                        benQInFromOutStep.ToNextStep(BenQ_IN_FROM_OUT_STEP.NONE);
                    }
                }

            }
            else if (benQInFromOutStep.IsStep(BenQ_IN_FROM_OUT_STEP.SHELF_UP))
            {
                bool shelfUp = IOValue(IO_Type.R_Updown_Up).Equals(IO_VALUE.HIGH);
                if (!shelfUp)
                    return;
                if (benQInFromOutStep.IsFinished())//提升机到达上层
                {
                    benQInFromOutStep.ToNextStep(BenQ_IN_FROM_OUT_STEP.SHELF_ENTER);
                    benQInFromOutStep.Msg = "料架到达右侧提升机上层,准备送出料架";
                    benQInFromOutStep.AddIoWait(IO_Type.R_LeftStopCheck, IO_VALUE.LOW, 5000);
                    benQInFromOutStep.AddIoWait(IO_Type.R_RightStopCheck, IO_VALUE.LOW, 5000);
                    benQInFromOutStep.AddIoWait(IO_Type.RHigh_FullCheck, IO_VALUE.HIGH);
                    CheckAndMove(IO_Type.RHigh_LineRun, IO_VALUE.HIGH);//右侧上层链条运行
                    CheckAndMove(IO_Type.R_OutLineBackRun, IO_VALUE.HIGH);
                    IOMove(IO_Type.R_RightStopCylinder, IO_VALUE.HIGH, 5000);
                    IOMove(IO_Type.R_LeftStopCylinder, IO_VALUE.HIGH,5000);

                }
            }
            else if (benQInFromOutStep.IsStep(BenQ_IN_FROM_OUT_STEP.SHELF_ENTER))
            {
                bool noShelf = IOManager.IOValue(IO_Type.R_LeftStopCheck).Equals(IO_VALUE.LOW) && 
                    IOManager.IOValue(IO_Type.R_RightStopCheck).Equals(IO_VALUE.LOW);
                if (noShelf && benQInFromOutStep.IsFinished())//料盘进入完成
                {
                    IOMove(IO_Type.R_RightStopCylinder, IO_VALUE.LOW);
                    IOMove(IO_Type.R_LeftStopCylinder, IO_VALUE.LOW);
                    benQInFromOutStep.ToNextStep(BenQ_IN_FROM_OUT_STEP.SHELF_DOWN);
                    CheckAndMove(IO_Type.R_LeftStopCylinder, IO_VALUE.LOW);
                    IOMove(IO_Type.R_OutLineBackRun, IO_VALUE.LOW);
                    benQInFromOutStep.Msg = "料架到达右侧上层,5秒后允许继续进入";
                    benQInFromOutStep.AddIoWait(IO_Type.R_Updown_Down, IO_VALUE.HIGH);
                    CylinderMove(MoveInfo, IO_Type.R_Updown_Up, IO_Type.R_Updown_Down);
                    benQInFromOutStep.AddTimeWait(5000);
                }
                else if(benQInFromOutStep.IsTimeOut(10000))
                {
                    KeepLineRun(IO_Type.RHigh_LineRun);
                    CheckAndMove(IO_Type.R_OutLineBackRun, IO_VALUE.HIGH);
                    IOMove(IO_Type.R_RightStopCylinder, IO_VALUE.HIGH,5000);
                    IOMove(IO_Type.R_LeftStopCylinder, IO_VALUE.HIGH,5000);
                }
            }
            else if (benQInFromOutStep.IsStep(BenQ_IN_FROM_OUT_STEP.SHELF_DOWN))
            {
                if (benQInFromOutStep.IsFinished())
                {
                    benQInFromOutStep.ToNextStep(BenQ_IN_FROM_OUT_STEP.WAIT_SHELF_TO_READY_POS);
                    benQInFromOutStep.Msg = "BenQ AGV 在右侧提升机将料架送入上层平台完成";                   
                    benQInFromOutStep.AddIoWait(IO_Type.RHigh_StopCheck1, IO_VALUE.HIGH);
                    benQInFromOutStep.AddTimeWait(60000);
                }
            }
            else if (benQInFromOutStep.IsStep(BenQ_IN_FROM_OUT_STEP.WAIT_SHELF_TO_READY_POS))
            {
                if (benQInFromOutStep.IsFinished())
                {
                    benQInFromOutStep.ToNextStep(BenQ_IN_FROM_OUT_STEP.NONE);
                    benQInFromOutStep.Msg = "料架已到中间提升机右侧入口,停止链条";
                    //agvClient_Dbline.FinishEnter("A6");
                    IOMove(IO_Type.RHigh_LineRun, IO_VALUE.LOW);//上层链条停止
                }
                else
                {
                    KeepLineRun(IO_Type.RHigh_LineRun);
                }


            }

        }
    }
}