InOutDevice_OUT.cs 6.6 KB
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DeviceLibrary
{
    partial class InOutDevice
    {
        public bool IsOutLiftEmpty
        {
            get
            {
                return IOValue(IO_EndMaterialTop_Check).Equals(IO_VALUE.LOW) && Lift.isAtTOP && MoveInfo.MoveStep == MoveStep.WaitOutBox;
            }
        }
        public bool TurnToOut(JobInfo jobInfo)
        {
            if (MoveInfo.MoveStep != MoveStep.Wait)
                return false;
            MoveInfo.NewMove(MoveStep.Out01);
            CurrnetDirection = InOutDirectionE.OUT;
            MoveInfo.MoveParam.PosID = jobInfo.PosId;
            MoveInfo.MoveParam.hSerial = jobInfo.hSerial;
            MoveInfo.log("开始出库任务");
            return true;
        }
        /// <summary>
        /// 提升机末端上方物料检测
        /// </summary>
        public bool EndMaterialTop_Check
        {
            get { return IOValue(IO_EndMaterialTop_Check).Equals(IO_VALUE.HIGH); }
        }

        void OutProcess()
        {
            if (mainMachine.CheckWait(MoveInfo))
                return;

            switch (MoveInfo.MoveStep)
            {
                case MoveStep.Wait:
                    break;
                case MoveStep.Out01:
                    MoveInfo.NextMoveStep(MoveStep.Out02);
                    Lift.LiftUp(MoveInfo);
                    FrontStop(MoveInfo, IO_VALUE.HIGH);
                    MiddleStop(MoveInfo, IO_VALUE.HIGH);
                    MoveInfo.log("准备开始接料,顶升上升");
                    break;
                case MoveStep.Out02:
                    if (IOValue(IO_EndMaterialTop_Check).Equals(IO_VALUE.LOW))
                    {
                        MoveInfo.NextMoveStep(MoveStep.WaitOutBox);
                        MoveInfo.log("可以继续出库");
                    }
                    else
                    {
                        Msg.add("周转箱顶升感应到有物料,无法继续出库", MsgLevel.warning);
                        MoveInfo.log("周转箱顶升感应到有物料,无法继续出库");
                    }
                    break;
                case MoveStep.WaitOutBox:
                    Msg.add("等待出库周转箱", MsgLevel.info);
                    break;
                case MoveStep.OutBoxPutOn:
                    if (IOValue(IO_EndMaterialTop_Check).Equals(IO_VALUE.LOW))
                    {
                        Msg.add("出口末端为检测到料箱", MsgLevel.alarm);//出口X39没有检测到周转箱
                    }
                    else
                    {
                        MoveInfo.NextMoveStep(MoveStep.Out05);
                        Lift.LiftDown(MoveInfo);
                        MoveInfo.log($"顶升机构下降");
                    }
                    break;
                case MoveStep.Out05:
                    if (IOValue(IO_F_Stop_Out).Equals(IO_VALUE.HIGH))
                    {
                        Msg.add("有出库料箱,请拿走出口有周转箱", MsgLevel.warning);
                        MoveInfo.log("有出库料箱,请拿走出口有周转箱");
                    }
                    else
                    {
                        MoveInfo.NextMoveStep(MoveStep.Out06);
                        Line.LineRun("work", true, 999);
                        MiddleStop(MoveInfo, IO_VALUE.LOW);
                        MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_EndMaterialTop_Check, IO_VALUE.LOW));
                        MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_F_Stop_Out, IO_VALUE.HIGH));
                        MoveInfo.log($"线体转动");
                    }

                    break;
                case MoveStep.Out06:
                    MoveInfo.NextMoveStep(MoveStep.Out07);
                    Line.LineStop("work");
                    MoveInfo.log($"料箱抵达出口");
                    break;
                case MoveStep.Out07:
                    MoveInfo.NextMoveStep(MoveStep.OutWaitAgv);
                    mainMachine.ServerCM.SendStoreState(MoveInfo.MoveParam.PosID, StoreStatus.OutStoreEnd);
                    //IOMove(DO_Agv_Rsp, IO_VALUE.HIGH);
                    MoveInfo.log($"等待取走周转箱");
                    break;
                case MoveStep.OutWaitAgv:
                    Msg.add("等待取走周转箱" + MoveInfo.MoveParam.WareCode, MsgLevel.info);
                    if (IOValue(IO_AgvOut_Req).Equals(IO_VALUE.HIGH))
                    {
                        MoveInfo.NextMoveStep(MoveStep.Out08);
                        IOMove(DO_Agv_Rsp, IO_VALUE.HIGH);
                        FrontStop(MoveInfo, IO_VALUE.LOW);
                        Line.LineRun("work", true, 999);
                        MoveInfo.log($"收到agv抵达信号, 开始送出周转箱");
                    }
                    if (IOMonitor.IODebound(IO_F_Stop_Out, Config, IO_VALUE.LOW, 2000))
                    {
                        MoveInfo.log($"检测到周转箱已离开,结束出库");
                        RobotManage.mainMachine.IsClearWarnMsg = true;
                        MoveInfo.EndMove();
                    }
                    //else if (MoveInfo.IsTimeOut(60 * ConfigHelper.Config.Get("OutWaitAgvLeaveTimeout", 5)))
                    //{
                    //    Msg.add($"等待取走周转箱", MsgLevel.warning);//等待周转箱[{MoveInfo.MoveParam.WareCode}]离开超时
                    //    RobotManage.mainMachine.IsClearWarnMsg = false;
                    //}
                    break;
                case MoveStep.Out08:
                    if (IOValue(IO_F_Stop_Out).Equals(IO_VALUE.LOW)
                        && IOValue(IO_F_Stop_In).Equals(IO_VALUE.LOW))
                    {
                        MoveInfo.NextMoveStep(MoveStep.Out09);
                        Line.LineRun("work", true, 3);
                        MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(3000));
                    }
                    else if (MoveInfo.IsTimeOut(15))
                    {
                        Msg.add("周转箱转出至AGV超时", MsgLevel.alarm);
                        MoveInfo.log($"周转箱转出超时");
                    }
                    break;
                case MoveStep.Out09:
                    IOMove(DO_Agv_Rsp, IO_VALUE.LOW);
                    FrontStop(MoveInfo, IO_VALUE.HIGH);
                    MiddleStop(MoveInfo, IO_VALUE.HIGH);
                    MoveInfo.EndMove();
                    break;
            }
        }
    }
}