AgvProcess.cs 10.1 KB

using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OnlineStore.DeviceLibrary
{
    partial class PackageLine
    {
        /// <summary>
        /// AGV进入A3点
        /// </summary>
        public enum AGV_ENTER_A3_STEP
        {
            NONE,
            /// <summary>
            /// 开始进入
            /// </summary>
            START_ENTER,
            /// <summary>
            /// 等待进入
            /// </summary>
            WAIT_ENTER_FINISH,
            /// <summary>
            /// 进入完成
            /// </summary>
            FINISH_ENTER
        }

        /// <summary>
        /// AGV离开A4
        /// </summary>
        public enum AGV_LEAVE_A4_STEP
        {
            NONE,
            /// <summary>
            /// 等待料架到达出料口
            /// </summary>
            WAIT_TO_EXIT,
            /// <summary>
            /// 开始送出
            /// </summary>
            START_LEAVE,
            /// <summary>
            /// 等待送出完成
            /// </summary>
            WAIT_LEAVE_FINISH,
            /// <summary>
            /// 送出完成
            /// </summary>
            FINISH_LEAVE
        }

        public StepInfo<AGV_ENTER_A3_STEP> agvA3Step = new StepInfo<AGV_ENTER_A3_STEP>(AGV_ENTER_A3_STEP.NONE);
        public StepInfo<AGV_LEAVE_A4_STEP> agvA4Step = new StepInfo<AGV_LEAVE_A4_STEP>(AGV_LEAVE_A4_STEP.NONE);
        /// <summary>
        /// A4料架情况
        /// </summary>
        public bool A4_Shelf_Exist = true;
        /// <summary>
        /// AGV进入处理
        /// </summary>
        private void ProcessA3Agv()
        {
            if (agvA3Step.IsStep(AGV_ENTER_A3_STEP.NONE))
            {
                //检测左侧入口IO,是否可继续进入料架
                if (IOValue(IO_Type.Pkg_Stop_Check1).Equals(IO_VALUE.LOW))
                {
                    agvA3Step.Msg = "料架未满,可以进入";
                    agvClient.SetStatus("A3", "", "", Asa.ClientAction.NeedEnter);
                }
                else
                {
                    //已经满了
                    agvA3Step.Msg = "料架已满,不允许进入";
                    agvA3Step.ToNextStep(AGV_ENTER_A3_STEP.NONE);
                    agvClient.SetStatus("A3", "", "", Asa.ClientAction.None);
                }
            }
            else if (agvA3Step.IsStep(AGV_ENTER_A3_STEP.START_ENTER))
            {
                if (IOValue(IO_Type.Pkg_Stop_Check1).Equals(IO_VALUE.LOW))
                {
                    agvA3Step.Msg = "收到 Agv 到达包装线A3点, 线体未满,开启链条1和2 ";
                    IOMove(IO_Type.Pkg_Line1_Forward, IO_VALUE.HIGH);
                    IOMove(IO_Type.Pkg_Line2_Forward, IO_VALUE.HIGH);
                    agvA3Step.ToNextStep(AGV_ENTER_A3_STEP.WAIT_ENTER_FINISH);
                }
            }
            else if (agvA3Step.IsStep(AGV_ENTER_A3_STEP.WAIT_ENTER_FINISH))
            {
                bool enterFinished = IOValue(IO_Type.Pkg_In_Check).Equals(IO_VALUE.HIGH);
                if (enterFinished)
                {
                    agvA3Step.Msg = "Agv 料架进入包装线A3点完成, 3秒后允许继续进入 ";
                    agvClient.SetStatus("A3", "", "", Asa.ClientAction.FinishEnter);
                    agvA3Step.ToNextStep(AGV_ENTER_A3_STEP.FINISH_ENTER);
                    agvA3Step.AddTimeWait(3000);
                }
                else
                {
                    bool timeOut = agvA3Step.IsTimeOut(20000);
                    if (timeOut)
                    {
                        agvA3Step.Msg = "Agv 料架进入包装线A3点20秒内未检测到入口信号,超时结束 ";
                        agvClient.SetStatus("A3", "", "", Asa.ClientAction.FinishEnter);
                        agvA3Step.ToNextStep(AGV_ENTER_A3_STEP.FINISH_ENTER);
                        agvA3Step.AddTimeWait(3000);
                    }

                }
            }
            else if (agvA3Step.IsStep(AGV_ENTER_A3_STEP.FINISH_ENTER))
            {
                if (agvA3Step.IsFinished())
                {
                    agvA3Step.ToNextStep(AGV_ENTER_A3_STEP.NONE);
                }
            }
        }

        /// <summary>
        /// AGV送出处理
        /// </summary>
        private void ProcessA4Agv()
        {
            if (agvA4Step.IsStep(AGV_LEAVE_A4_STEP.NONE))
            {
                //检测右侧IO,是否有料架要出/入(需要保留2个料架)
                bool hasEmptyShelf = IOValue(IO_Type.Pkg_Out_Stop_Check).Equals(IO_VALUE.HIGH);
                bool has3EmptyShelf = IOValue(IO_Type.Pkg_Empty_Shelf_Check).Equals(IO_VALUE.HIGH);
                bool hasMoreThan3Shelf = IOValue(IO_Type.Pkg_Rotot_Forbidden_Check).Equals(IO_VALUE.HIGH);
                if (hasEmptyShelf)
                {
                    A4_Shelf_Exist = true;
                    if (has3EmptyShelf && hasMoreThan3Shelf)
                    {
                        //出口已经满了,影响机器人工作了,优先级变高
                        agvA4Step.Msg = "包装线出口料架大于等于3个,必须尽快拉走一个";
                        agvClient.SetStatus("A4", "", "00", Asa.ClientAction.NeedLeave, Asa.ClientLevel.High);
                    }else if (has3EmptyShelf)
                    {
                        agvA4Step.Msg = "包装线出口料架大于2个,需要拉走一个";
                        agvClient.SetStatus("A4", "", "00", Asa.ClientAction.NeedLeave, Asa.ClientLevel.Middle);
                    }
                    else
                    {
                        agvA4Step.Msg = "包装线出口料架小于2个,低优先级";
                        agvClient.SetStatus("A4", "", "00", Asa.ClientAction.NeedLeave, Asa.ClientLevel.Low);
                    }
                }
                else
                {
                    if (has3EmptyShelf || hasMoreThan3Shelf)
                    {
                        agvA4Step.Msg = "包装线出口料架信号未检测到,但已有2料架信号,转动链条2, 3";
                        IOMove(IO_Type.Pkg_Line3_Forward, IO_VALUE.HIGH);
                        IOMove(IO_Type.Pkg_Line2_Forward, IO_VALUE.HIGH);
                        agvA4Step.ToNextStep(AGV_LEAVE_A4_STEP.WAIT_TO_EXIT);
                        agvA4Step.AddIoWait(IO_Type.Pkg_Rotot_Forbidden_Check, IO_VALUE.LOW);
                        agvA4Step.AddIoWait(IO_Type.Pkg_Out_Stop_Check, IO_VALUE.HIGH);
                    }
                    else
                    {
                        //已经没料架了
                        agvA4Step.Msg = "包装线出口无料架,需要尽快补充";
                        A4_Shelf_Exist = false;
                        agvClient.SetStatus("A4", "", "00", Asa.ClientAction.None, Asa.ClientLevel.Low);
                        agvA4Step.ToNextStep(AGV_LEAVE_A4_STEP.NONE);
                    }
                   
                }
            }else if (agvA4Step.IsStep(AGV_LEAVE_A4_STEP.WAIT_TO_EXIT))
            {
                if (agvA4Step.IsFinished())
                {
                    agvA4Step.Msg = "料架已到包装线出口,停止链条3";
                    agvA4Step.ToNextStep(AGV_LEAVE_A4_STEP.NONE);
                    IOMove(IO_Type.Pkg_Line3_Forward, IO_VALUE.LOW);
                    IOMove(IO_Type.Pkg_Line2_Forward, IO_VALUE.LOW);
                }
                else if (agvA4Step.IsTimeOut(20000))
                {
                    agvA4Step.Msg = "料架到包装线出口超时,停止链条3";
                    agvA4Step.ToNextStep(AGV_LEAVE_A4_STEP.NONE);
                    IOMove(IO_Type.Pkg_Line3_Forward, IO_VALUE.LOW);
                    IOMove(IO_Type.Pkg_Line2_Forward, IO_VALUE.LOW);
                }
                else
                {
                    KeepLineRun(IO_Type.Pkg_Line3_Forward);
                    KeepLineRun(IO_Type.Pkg_Line2_Forward);
                }

            }
            else if (agvA4Step.IsStep(AGV_LEAVE_A4_STEP.START_LEAVE))
            {
                agvA4Step.Msg = "收到 Agv 到达包装线A4点, 开启链条,准备送出料架 ";
                IOMove(IO_Type.Pkg_Line3_Forward, IO_VALUE.HIGH);
                IOMove(IO_Type.Pkg_Out_Stop_Down, IO_VALUE.HIGH, 2000);
                agvA4Step.ToNextStep(AGV_LEAVE_A4_STEP.WAIT_LEAVE_FINISH);
                agvA4Step.AddTimeWait(30000);
            }
            else if (agvA4Step.IsStep(AGV_LEAVE_A4_STEP.WAIT_LEAVE_FINISH))
            {
                if (agvA4Step.IsFinished())
                {
                    agvA4Step.Msg = "Agv 料架离开包装线A4点超时完成, 停止链条 ";
                    agvA4Step.ToNextStep(AGV_LEAVE_A4_STEP.FINISH_LEAVE);
                    agvA4Step.AddTimeWait(5000);

                }
            }
            else if (agvA4Step.IsStep(AGV_LEAVE_A4_STEP.FINISH_LEAVE))
            {
                if (agvA4Step.IsFinished())
                {
                    agvClient.SetStatus("A4", "", "00", Asa.ClientAction.FinishLeave);
                    IOMove(IO_Type.Pkg_Line3_Forward, IO_VALUE.LOW);
                    agvA4Step.ToNextStep(AGV_LEAVE_A4_STEP.NONE);
                }
            }
        }

        private void AgvClient_Ready(string name, string content)
        {
            LogUtil.info("收到 AgvClient_Ready [" + name + "] ");
            if (name.Equals("A3"))
            {
                agvA3Step.ToNextStep(AGV_ENTER_A3_STEP.START_ENTER);
            }else if (name.Equals("A4"))
            {
                agvA4Step.ToNextStep(AGV_LEAVE_A4_STEP.START_LEAVE);
            }
        }

        private void AgvClient_CloseDoor(string name, string rfid)
        {
            if (name.Equals("A4"))
            {
                agvA4Step.Msg = "Agv 料架离开包装线A4点,收到AGV反馈完成, 停止链条 ";
                agvA4Step.ToNextStep(AGV_LEAVE_A4_STEP.FINISH_LEAVE);
            }
        }

        private void AgvClient_Log(string s)
        {
            LogUtil.debug("AGV: " + s);
        }

    }
}