MainMachine _AutoInOutTest.cs 9.4 KB
using CodeLibrary;
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DeviceLibrary
{
    partial class MainMachine
    {
        InOutSideE AutoTestInSide;
        InOutSideE AutoTestOutSide;
        InOutDevice AutoTestInDevice;
        InOutDevice AutoTestOutDevice;

        bool Singlein = false;
        public bool StartAutoInOutTest(int posindex,bool singlein, out string errmsg)
        {
            errmsg = "";
            if (!boxTransport.IsComplateOrFree)
            {
                errmsg = "料仓忙碌中,无法启动";
                return false;
            }
            
            if(!InOutDevice.GetInStoreWaitSide(out InOutSideE AutoTestInSide, out InOutDevice AutoTestInDevice,true))
            {
                errmsg = "入库周转箱没有准备好,无法启动";
                return false;
            }
            if (!InOutDevice.GetOutStoreFreeSide(out InOutSideE AutoTestOutSide, out InOutDevice AutoTestOutDevice))
            {
                errmsg = "出库口有周转箱,无法启动";
                return false;
            }
            poslist =CSVPositionReader<ACStorePosition>.getPositionList();
            AutoInOutTest = true;
            StopAutoInOut = singlein;
            CurrentPosIndex = posindex;
            Singlein = singlein;
            //AIOTMoveInfo.NewMove(MoveStep.Wait);
            return true;
        }
        public bool StartManualOutTest(int posindex, out string errmsg)
        {
            errmsg = "";
            if (!boxTransport.IsComplateOrFree)
            {
                errmsg = "料仓忙碌中,无法启动";
                return false;
            }
            if (!InOutDevice.GetOutStoreFreeSide(out InOutSideE AutoTestOutSide, out InOutDevice AutoTestOutDevice))
            {
                errmsg = "出库口有周转箱,无法启动";
                return false;
            }
            poslist = CSVPositionReader<ACStorePosition>.getPositionList();
            AutoInOutTest = true;
            StopAutoInOut = true;
            CurrentPosIndex = posindex;
            Singlein = false;
            AIOTMoveInfo.NewMove(MoveStep.StoreOut10);
            return true;
        }
        public void StopAutoInOutTest()
        {
            StopAutoInOut = true;
        }
        List<ACStorePosition> poslist;
        int CurrentPosIndex = 0;
        /// <summary>
        /// 自动出入库状态
        /// </summary>
        public bool AutoInOutTest { get; set; } = false;
        bool StopAutoInOut = false;
        //InOutSideE CurrentSide;
        void AutoInOutTestProcess()
        {
            if (CheckWait(AIOTMoveInfo))
                return;
            //常规上料扫码流程
            switch (AIOTMoveInfo.MoveStep)
            {
                case MoveStep.Wait:
                    if (AutoInOutTest && InOutDevice.GetInStoreWaitSide(out InOutSideE inOutSide, out InOutDevice iod,true))
                    {
                        InMoveInfo = iod.MoveInfo;
                        CurrentSide = inOutSide;
                        AIOTMoveInfo.NextMoveStep(MoveStep.StoreIn01);
                        AIOTMoveInfo.log($"入库周转箱已准备好");
                    }else if (InOutDevice.GetInStoreWaitSide(out inOutSide, out iod))
                    {
                        InMoveInfo = iod.MoveInfo;
                        CurrentSide = inOutSide;
                        AIOTMoveInfo.NextMoveStep(MoveStep.StoreIn01);
                        AIOTMoveInfo.log($"入库周转箱已准备好1");
                        StopAutoInOut = true;
                    }
                    else if (boxTransport.IsComplateOrFree)
                    {
                        if (InOutDevice.GetOutStoreFreeSide(out  inOutSide, out  iod) && OutStoreJobList.Dequeue(out JobInfo jobInfo1))
                        {
                            StoreMoveInfo.log("检测到出库空闲侧:" + inOutSide);
                            if (iod.TurnToOut(jobInfo1))
                            {
                                CurrentSide = inOutSide;
                                CurrentInOut = iod;
                                AIOTMoveInfo.NewMove(MoveStep.StoreOut10);
                                AIOTMoveInfo.MoveParam.PosID = jobInfo1.PosId;
                                StoreMoveInfo.log($"{CurrentSide}:开始出库任务");
                            }
                        }
                    }
                    break;
                case MoveStep.StoreIn01:
                    AIOTMoveInfo.NextMoveStep(MoveStep.StoreIn02);
                    var ac = poslist[CurrentPosIndex];
                    if (!boxTransport.Start(new BoxStorePosition(Config, CurrentSide), new BoxStorePosition(ac), StoreMoveType.InStore,"auto")) {
                        AIOTMoveInfo.log($"料仓周转启动失败");
                        AutoInOutTest = false;
                        StopAutoInOut = true;
                        return;
                    }
                    AIOTMoveInfo.log($"开始转运周转箱");                    
                    break;
                case MoveStep.StoreIn02:
                    if (boxTransport.IsTakedBox)
                    {
                        AIOTMoveInfo.NextMoveStep(MoveStep.StoreIn03);
                        InMoveInfo.NextMoveStep(MoveStep.InBoxLeaved);
                        AIOTMoveInfo.log($"周转箱已取走");
                    }                  
                    else
                    {
                            Msg.add("入料线等待周转箱离开", MsgLevel.info);
                    }
                    break;
                case MoveStep.StoreIn03:
                    if (boxTransport.IsComplateOrFree)
                    {
                        AIOTMoveInfo.log($"周转箱已到达目的地");
                        ac = poslist[CurrentPosIndex];
                        CurrentPosIndex--;
                        if (CurrentPosIndex < 0 || StopAutoInOut)
                        {
                            if (Singlein) {
                                AIOTMoveInfo.NextMoveStep(MoveStep.Wait);
                                AutoInOutTest = false;
                                return;
                            }
                            AIOTMoveInfo.log($"已达到最后一个库位{CurrentPosIndex},或手动停止{StopAutoInOut},自动出入库停止,将周转箱送至出口");
                            AIOTMoveInfo.NextMoveStep(MoveStep.StoreOut10);
                            return;
                        }
                        var bc = poslist[CurrentPosIndex];
                        if (!boxTransport.Start(new BoxStorePosition(ac), new BoxStorePosition(bc), StoreMoveType.InStore, "auto"))
                        {
                            AIOTMoveInfo.log($"料仓周转启动失败");
                            AutoInOutTest = false;
                            StopAutoInOut = true;
                            return;
                        }
                    }
                    break;
                case MoveStep.StoreOut10:
                    if (!InOutDevice.GetOutStoreFreeSide(out InOutSideE inOutSide2, out InOutDevice iod2))
                    {
                        Msg.add("出口料箱排队", MsgLevel.warning);//出口位置被占用无法送出料箱
                        return;
                    }
                    ac = poslist[CurrentPosIndex];
                    JobInfo jobInfo = new JobInfo();
                    jobInfo.PosId = ac.PositionNum;
                    if (!iod2.TurnToOut(jobInfo))
                    {
                        return;
                    }
                    CurrentSide = inOutSide2;
                    CurrentInOut = iod2;
                    AIOTMoveInfo.NextMoveStep(MoveStep.StoreOut11);
                    
                    if (!boxTransport.Start(new BoxStorePosition(ac), new BoxStorePosition(Config, CurrentSide), StoreMoveType.OutStore, "auto"))
                    {
                        AIOTMoveInfo.log($"料仓周转启动失败");
                        AutoInOutTest = false;
                        StopAutoInOut = true;
                        return;
                    }
                    AIOTMoveInfo.log($"开始转运周转箱");
                    break;
                case MoveStep.StoreOut11:
                    if (boxTransport.IsTakedBox)
                    {
                        AIOTMoveInfo.NextMoveStep(MoveStep.StoreOut12);
                        AIOTMoveInfo.log($"周转箱已取走");
                    }
                    else
                    {
                        Msg.add("出料线等待周转箱到达", MsgLevel.info);
                    }
                    break;
                case MoveStep.StoreOut12:
                    if (boxTransport.IsComplateOrFree)
                    {
                        CurrentInOut.MoveInfo.NextMoveStep(MoveStep.OutBoxPutOn);
                        AIOTMoveInfo.log($"周转箱已到达目的地");
                        AIOTMoveInfo.EndMove();
                        AutoInOutTest = false;
                    }
                    break;
                default:
                    AIOTMoveInfo.log($"未找到对应步骤:{AIOTMoveInfo.MoveStep}");
                    break;
            }
        }
    }
}