InOutDevice_IN.cs 14.3 KB
using CodeLibrary;
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace DeviceLibrary
{
    partial class InOutDevice
    {

        /// <summary>
        /// InMoveInfo.MoveStep == MoveStep.InWaitServerCallback
        /// </summary>
        public bool IsInStoreReady
        {
            get => MoveInfo.MoveStep == MoveStep.InWaitServerCallback;
        }
        public bool InWaitBoxLeave
        {
            get => MoveInfo.MoveStep == MoveStep.InWaitBoxLeave;
        }
        public void OpenDoor(MoveInfo moveInfo)
        {
            LogUtil.info($"OpenDoor:low:{DO_Door_Down},up:{DO_Door_Up}");
            MainMachine.CylinderMove(moveInfo, DO_Door_Down, DO_Door_Up, IO_VALUE.HIGH);

        }
        public void CloseDoor(MoveInfo moveInfo)
        {
            MainMachine.CylinderMove(moveInfo, DO_Door_Down, DO_Door_Up, IO_VALUE.LOW);
        }
        /// <summary>
        /// if (InMoveInfo.MoveStep == MoveStep.InWaitServerCallback)
        /// </summary>
        /// <param name="jobInfo"></param>
        /// <returns></returns>
        public bool StartInStore(JobInfo jobInfo)
        {
            if (IsInStoreReady)
            {
                MoveInfo.MoveParam.WareCode = jobInfo.WareNum;
                MoveInfo.MoveParam.PosID = jobInfo.PosId;
                MoveInfo.MoveParam.hSerial = jobInfo.hSerial;
                MoveInfo.NextMoveStep(MoveStep.StartInStore);
                return true;
            }
            return false;
        }
        public void Rescan()
        {
            MoveInfo.NextMoveStep(MoveStep.In03);
            MoveInfo.log("扫码失败重新扫码");
        }
        bool isScanError = false;
        void InProcess()
        {
            if (mainMachine.CheckWait(MoveInfo))
                return;

            switch (MoveInfo.MoveStep)
            {
                case MoveStep.Wait:
                    break;
                case MoveStep.In01:
                    MoveInfo.NextMoveStep(MoveStep.In03);
                    Line.LineRun("work", false, 999);
                    MiddleStop(MoveInfo, IO_VALUE.HIGH);
                    FrontStop(MoveInfo, IO_VALUE.LOW);
                    MoveInfo.log("线体正转,放下前阻挡");
                    break;
                case MoveStep.AgvIn01:
                    MoveInfo.NextMoveStep(MoveStep.In02);
                    Line.LineRun("work", false, 10);
                    MiddleStop(MoveInfo, IO_VALUE.HIGH);
                    FrontStop(MoveInfo, IO_VALUE.LOW);
                    IOMove(DO_Agv_Rsp, IO_VALUE.HIGH);
                    MoveInfo.log("线体正转,放下前阻挡");
                    break;
                case MoveStep.In02:
                    if (IOValue(IO_F_Stop_Out).Equals(IO_VALUE.HIGH))
                    {
                        MoveInfo.NextMoveStep(MoveStep.In03);
                        Lift.LiftDown(null);
                        MoveInfo.log("检测到周转箱2,升降台下降,前往中间阻挡");
                        IOMove(DO_Agv_Rsp, IO_VALUE.LOW);
                    }
                    else if (MoveInfo.IsTimeOut(3))
                    {
                        MoveInfo.log("没有检测到周转箱,结束入库");
                        IOMove(DO_Agv_Rsp, IO_VALUE.LOW);
                        Line.LineStop("work");
                        MoveInfo.EndMove();
                    }
                    break;
                case MoveStep.In03:
                    if (IOValue(IO_M_Stop_In).Equals(IO_VALUE.HIGH))
                    {
                        Line.LineStop("work");
                        MoveInfo.NextMoveStep(MoveStep.In04);
                        Lift.LiftDown(MoveInfo);
                        FrontStop(MoveInfo, IO_VALUE.HIGH);
                        ScanCode(100);
                        isScanError = false;
                        MoveInfo.log("开始扫码,入口阻挡上升, 线体停止");
                    }
                    else if (MoveInfo.IsTimeOut(10))
                    {
                        MoveInfo.log("没有检测到周转箱2,结束入库");
                        //MoveInfo.log("没有检测到周转箱,需要报警");
                        Line.LineStop("work");
                        //Msg.add("X26没有感应到周转箱", MsgLevel.alarm);
                        //RobotManage.UserPause("X26没有感应到周转箱", true);
                        MoveInfo.EndMove();
                    }
                    break;
                case MoveStep.In04:
                    if (InScanTask.IsCompleted)
                    {
                        var x = InScanTask.Result;
                        if (x.Count == 0)
                        {
                            //MoveInfo.NextMoveStep(MoveStep.InWaitServerCallback);
                            MoveInfo.NextMoveStep(MoveStep.In03);
                            MoveInfo.log($"未识别到有效二维码,重新拍照");
                            return;
                        }
                        else
                        {
                            MoveInfo.NextMoveStep(MoveStep.In05);
                            Lift.LiftDown(MoveInfo);
                            MoveInfo.log($"放下入料阻挡");
                        }

                    }
                    else if (MoveInfo.IsTimeOut(10))
                    {
                        MoveInfo.NextMoveStep(MoveStep.In01);
                        MoveInfo.log($"等待扫码超时,重新扫码");
                    }
                    break;
                case MoveStep.In05:
                    Line.LineRun("work", false, 999);
                    MoveInfo.NextMoveStep(MoveStep.In06);
                    MiddleStop(MoveInfo, IO_VALUE.LOW);
                    MoveInfo.log("检测到周转箱3,中间阻挡下降");
                    break;
                case MoveStep.In06:
                    if (IOValue(IO_OverHead_Check).Equals(IO_VALUE.LOW))
                    {
                        Line.LineStop("work");
                        MoveInfo.log($"X18检测到物料超高,停止滚筒");
                        MoveInfo.NextMoveStep(MoveStep.InOverHead);
                        mainMachine.ServerCM.cancelPutInTask("", MoveInfo.MoveParam.WareCode);
                        return;
                    }
                    //IOValue(IO_Type.InEndMaterialTop_Check).Equals(IO_VALUE.HIGH) && 
                    if (IOValue(IO_EndMaterialBottom_Check).Equals(IO_VALUE.HIGH))
                    {
                        MoveInfo.NextMoveStep(MoveStep.In09);
                        MiddleStop(MoveInfo, IO_VALUE.HIGH);
                        Line.LineRun("work", false, 2);
                        MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(2000));
                    }
                    else if (MoveInfo.IsTimeOut(15))
                    {
                        Msg.add("出口未感应到存储机构有料箱", MsgLevel.warning);//周转箱进入等待X31信号超时
                        MoveInfo.log($"周转箱进入超时");
                    }
                    break;
                case MoveStep.In09:
                    MoveInfo.NextMoveStep(MoveStep.In10);
                    Lift.LiftUp(MoveInfo);
                    MoveInfo.log("顶升上升,等待周转箱到位");
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_EndMaterialTop_Check, IO_VALUE.HIGH));
                    break;
                case MoveStep.In10:
                    MoveInfo.NextMoveStep(MoveStep.In11);
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(2000));
                    break;
                case MoveStep.In11:
                    //读取称重
                    bool res = BSQController.queryData(Config.WeightSensorPort, out double weight);
                    if (res)
                    {
                        if (weight > 0 && weight <= Config.StoreWeightLimited)
                        {
                            var x = InScanTask.Result;
                            {
                                MoveInfo.NextMoveStep(MoveStep.InWaitServerCallback);
                                MoveInfo.log($"已完成扫码,并称重完成 {weight}kg,等待服务器反馈库位 Count={x.Count}");
                                MoveInfo.MoveParam.IsNg = false;
                                MoveInfo.MoveParam.codeInfos = x;
                                MoveInfo.MoveParam.weight = weight;
                                //var cc = x.Select((a) => a.CodeStr);
                                //mainMachine.ServerCM.GetPosId(cc.ToArray(), this,weight);
                            }
                        }
                        else//超重
                        {
                            MoveInfo.NextMoveStep(MoveStep.InNG1);
                            Lift.LiftDown(MoveInfo);
                            Msg.add("周转箱超重,退出", MsgLevel.alarm);
                            MoveInfo.log($"周转箱当前重量{weight},超重。顶升下降,出库该周转箱");
                        }

                    }
                    else
                    {
                        MoveInfo.NextMoveStep(MoveStep.In10);
                        MoveInfo.log($"{Config.WeightSensorPort}获取周转箱重量{weight}失败,重新读取");
                    }
                    break;

                case MoveStep.InWaitServerCallback:
                    if (RobotManage.InoutDebugMode)
                    {
                        //Msg.add("等待手动选择入库库位", MsgLevel.info);
                        MoveInfo.NextMoveStep(MoveStep.StartInStore);
                        return;
                    }
                    var cc = MoveInfo.MoveParam.codeInfos.Select((a) => a.CodeStr);
                    mainMachine.ServerCM.GetPosId(cc.ToArray(), this, MoveInfo.MoveParam.weight);
                    if (MoveInfo.IsTimeOut(5))
                        Msg.add("等待服务器返回库位", MsgLevel.info);
                    else if (MoveInfo.IsTimeOut(15))
                    {
                        isScanError = true;
                        MoveInfo.NextMoveStep(MoveStep.InNG1);
                        Lift.LiftDown(MoveInfo);
                        MoveInfo.log($"等待服务器返回库位超时");
                    }
                    break;
                case MoveStep.StartInStore:
                    MoveInfo.NextMoveStep(MoveStep.InWaitBoxLeave);
                    break;
                case MoveStep.InWaitBoxLeave:
                    Msg.add("周转箱等待入库", MsgLevel.info);
                    mainMachine.ServerCM.storeStatus = StoreStatus.InStoreExecute;
                    break;
                case MoveStep.InBoxLeaved:
                    MoveInfo.NextMoveStep(MoveStep.Wait);
                    Lift.LiftDown(MoveInfo);
                    FrontStop(MoveInfo, IO_VALUE.HIGH);
                    MiddleStop(MoveInfo, IO_VALUE.HIGH);
                    MoveInfo.log("周转箱已取走,顶升下降");
                    break;
                case MoveStep.InOverHead:
                    Msg.add("料箱存储超高", MsgLevel.warning);//X19检测到物料超高,请取出周转箱
                    if (IOMonitor.IODebound(IO_M_Stop_In, Config, IO_VALUE.LOW))
                    {
                        MiddleStop(MoveInfo, IO_VALUE.HIGH);
                        MoveInfo.NewMove(MoveStep.Wait);
                    }
                    break;
                case MoveStep.InReset:
                    FrontStop(MoveInfo, IO_VALUE.HIGH);
                    MiddleStop(MoveInfo, IO_VALUE.HIGH);
                    //Lift.LiftDown(MoveInfo);
                    Line.LineStop("work");
                    MoveInfo.NewMove(MoveStep.Wait);
                    MoveInfo.log("入库线体状态重置");
                    break;

                case MoveStep.InNG1:
                    MoveInfo.NextMoveStep(MoveStep.InNG2);
                    Line.LineRun("work", true, 999);
                    MiddleStop(MoveInfo, IO_VALUE.LOW);
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_F_Stop_Out, IO_VALUE.HIGH));
                    MoveInfo.log($"线体转动");
                    break;
                case MoveStep.InNG2:
                    MoveInfo.NextMoveStep(MoveStep.InNG3);
                    Line.LineStop("work");
                    MoveInfo.log($"料箱抵达出口");
                    if (isScanError)
                        Msg.add("入库周转箱扫码失败,请确认料箱方向后重试", MsgLevel.alarm);
                    else
                        Msg.add("入库周转箱超重,已退出,请处理", MsgLevel.alarm);
                    RobotManage.UserPause("入库周转箱超重,退出线体");
                    break;
                case MoveStep.InNG3:
                    MoveInfo.NewMove(MoveStep.Wait);
                    MoveInfo.log("入库线体状态重置");
                    break;
            }
        }

        public bool IsScanRunning()
        {
            if (InScanTask == null)
                return false;

            return !InScanTask.IsCompleted;
        }
        /// <summary>
        /// 扫码线程
        /// </summary>
        Task<List<CodeInfo>> InScanTask;
        void ScanCode(int delay = 0)
        {
            MoveInfo.log("开始扫码");
            //RightMoveInfo.OneWaitCanEndStep = true;
            //RightMoveInfo.WaitList.Add(WaitResultInfo.WaitScanCode());
            //RightMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
            try
            {
                InScanTask = Task.Run(new Func<List<CodeInfo>>(() =>
                {
                    IOMove(IO_Type.Camera_Led, IO_VALUE.HIGH);
                    Task.Delay(delay).Wait();
                    List<CodeInfo> LastCodeList;
                    CodeManager.CloseCamera(InOutSide == InOutSideE.Left ? Config.CameraName_Left : Config.CameraName_Right);
                    LastCodeList = CodeManager.CameraScan(new List<string> { InOutSide == InOutSideE.Left ? Config.CameraName_Left : Config.CameraName_Right });

                    return LastCodeList;
                }));
            }
            catch (Exception ex)
            {
                LogUtil.error("FI_13_ScanCode扫码出错:", ex);
            }
        }
    }
}