StoreMachine_Store.cs 16.3 KB
using CodeLibrary;
using Newtonsoft.Json;
using OnlineStore;
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using RemoteSheardObject;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DeviceLibrary
{
    partial class StoreMachine
    {
        public bool IsInStoreReady { get => IOValue(SIO_Type.Door_Tray_Check, Config).Equals(IO_VALUE.HIGH) 
                || StoreMoveInfo.MoveStep== MoveStep.Wait || StoreMoveInfo.MoveStep == MoveStep.InWaitServerCallback; }

        StoreJobList OutStoreJobList = new StoreJobList("");

        public void AddOutStoreTask(string warecode,string posId,int plateW,int plateH) {
            JobInfo jobInfo = new JobInfo(warecode, posId,plateW,plateH);
            OutStoreJobList.Enqueue(jobInfo);
            LogUtil.info($"添加出库任务队列: {posId},当前任务数量: {OutStoreJobList.Count}");
        }
        public bool DoorRelease(RequestLoadInfo requestLoadInfo) {
            if (requestLoadInfo.IsEmpty)
            {
                var s = IOValue(SIO_Type.Door_Tray_Check,Config);
                StoreMoveInfo.log("释放舱门时 TrayCheck_Door=" + s);
                return s.Equals(IO_VALUE.LOW);
            }
            else {
                StoreMoveInfo.NextMoveStep(MoveStep.StoreIn01);
                StoreMoveInfo.MoveParam = requestLoadInfo.LoadParam.clone();
                StoreMoveInfo.MoveParam.IsInStore = true;
                ConfigHelper.Config.Set($"Runtime_{MachineSide}_DoorInfo", JsonConvert.SerializeObject(StoreMoveInfo.MoveParam));
                ConfigHelper.Config.Set($"Runtime_{MachineSide}_IsInStore", true);
                ConfigHelper.Config.Set($"Runtime_{MachineSide}_PosID", StoreMoveInfo.MoveParam.PosID);
                ConfigHelper.Config.Set($"Runtime_{MachineSide}_PlateH", StoreMoveInfo.MoveParam.PlateH);
                ConfigHelper.Config.Set($"Runtime_{MachineSide}_PlateW", StoreMoveInfo.MoveParam.PlateW);
                ConfigHelper.Config.Set($"Runtime_{MachineSide}_WareCode", StoreMoveInfo.MoveParam.WareCode);
                StoreMoveInfo.log("写入舱门口信息:" + StoreMoveInfo.MoveParam.ToStr());
            }
            return true;
        }
        public bool DoorLock(RequestLoadInfo requestLoadInfo) {
            if (runStatus== RunStatus.Running && StoreMoveInfo.MoveStep == MoveStep.Wait && !requestLoadInfo.IsEmpty)
            {
                var s = IOValue(SIO_Type.Door_Tray_Check,Config);
                if (s.Equals(IO_VALUE.LOW))
                {
                    StoreMoveInfo.NextMoveStep(MoveStep.WaitInStore);
                    StoreMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                    LogUtil.info("锁定料仓等待入库");
                    return true;
                }
                else
                {
                    LogUtil.info("料仓口有料无法锁定");
                    return false;
                }
            }
            else if (StoreMoveInfo.MoveStep == MoveStep.StoreOut_WaitMT && requestLoadInfo.IsEmpty)
            {
                StoreMoveInfo.NextMoveStep(MoveStep.StoreOut14);
                StoreMoveInfo.log("出库等待中.允许取走料盘");
                return true;
            }
            else {
                StoreMoveInfo.log("料仓忙碌中,不可锁定");
                return false;
            }
        }
        void StoreProcess()
        {
            if (CheckWait(StoreMoveInfo))
                return;
            //常规上料扫码流程
            switch (StoreMoveInfo.MoveStep)
            {
                case MoveStep.WaitInStore:
                    StoreMoveInfo.NextMoveStep(MoveStep.WaitInStore);
                    StoreMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                    if (IsLineFree() == RemoteResult.True)
                    {
                        StoreMoveInfo.log($"MT已经不在入库模式");
                        StoreMoveInfo.EndMove();
                    }
                    else
                        Msg.add(crc.GetString("Res0020","等待入库物料"), MsgLevel.info);
                    break;
                case MoveStep.Wait:
                    
                    //判断有没有出库任务, 需要入库空闲, 出口空闲
                    if (IOMonitor.IODebound(SIO_Type.Door_Tray_Check, Config, IO_VALUE.LOW, 2000) && OutStoreJobList.Count > 0 && boxTransport.IsComplateOrFree)
                    {
                        if (!boxTransport.IgnoreX09 && IOValue(SIO_Type.TrayCheck_Fixture, Config).Equals(IO_VALUE.HIGH))
                        {
                            if (!boxTransport.IgnoreX09 && IOMonitor.IODebound(SIO_Type.TrayCheck_Fixture, Config, IO_VALUE.HIGH, 5000))
                            {
                                Msg.add(crc.GetString("Res0152","收到出库任务,但料叉上有料,无法启动,请检查"), MsgLevel.alarm, ErrInfo.X09_BoxNotDetect);
                            }
                            else
                                Msg.add(crc.GetString("Res0152","收到出库任务,但料叉上有料,无法启动,请检查"), MsgLevel.warning);
                            return;
                        }
                        else
                            boxTransport.IgnoreX09 = false;
                        if (OutStoreJobList.Dequeue(out JobInfo jobInfo))
                        {
                            StoreMoveInfo.NewMove(MoveStep.StoreOut10);
                            StoreMoveInfo.MoveParam.WareCode = jobInfo.WareNum;
                            StoreMoveInfo.MoveParam.PosID = jobInfo.PosId;
                            StoreMoveInfo.MoveParam.PlateH = jobInfo.plateH;
                            StoreMoveInfo.MoveParam.PlateW = jobInfo.plateW;
                            StoreMoveInfo.log($"开始出库任务:" + jobInfo.ToStr());

                            ConfigHelper.Config.Set($"Runtime_{MachineSide}_IsInStore", false);
                            ConfigHelper.Config.Set($"Runtime_{MachineSide}_PosID", StoreMoveInfo.MoveParam.PosID);
                            ConfigHelper.Config.Set($"Runtime_{MachineSide}_PlateH", StoreMoveInfo.MoveParam.PlateH);
                            ConfigHelper.Config.Set($"Runtime_{MachineSide}_PlateW", StoreMoveInfo.MoveParam.PlateW);
                            ConfigHelper.Config.Set($"Runtime_{MachineSide}_WareCode", StoreMoveInfo.MoveParam.WareCode);
                            ServerCM.storeStatus = StoreStatus.OutStoreExecute;
                            return;
                        }
                    }
                    if (!AutoInOutTest && IOMonitor.IODebound(SIO_Type.Door_Tray_Check, Config, IO_VALUE.HIGH, 1000) )
                    {
                        StoreMoveInfo.log("有料盘在入口,请求服务器获取库位");
                        StoreMoveInfo.NextMoveStep(MoveStep.InWaitServerCallback);
                        ServerCM.SendInStoreRequest(new string[] { "Server" }, new ReelParam());
                    }
                    break;
                case MoveStep.InWaitServerCallback:
                    if (StoreMoveInfo.IsTimeOut(10))
                    {
                        StoreMoveInfo.log("入口料盘,获取库位失败");
                        StoreMoveInfo.MoveParam.IsNg = true;
                        StoreMoveInfo.MoveParam.NgMsg = $"[{CID}]" + crc.GetString("Res0009","无信息物料");
                        StoreMoveInfo.NextMoveStep(MoveStep.StoreOut_WaitMT);
                    }
                    break;
                case MoveStep.StoreIn01:
                    if (!ServerCM.SendStoreState(StoreMoveInfo.MoveParam.PosID, StoreStatus.InStoreExecute))
                    {
                        Msg.add(crc.GetString("Res0156","服务器连接异常"), MsgLevel.warning);
                        return;
                    }
                    SRec.info(CID, MachineSide == MachineSideE.Left ? crc.GetString("Res0010","A侧") : crc.GetString("Res0011","B侧"), crc.GetString("Res0012","开始入库"), StoreMoveInfo.MoveParam.PosID);

                    StoreMoveInfo.NextMoveStep(MoveStep.StoreIn02);
                    break;
                case MoveStep.StoreIn02:
                    StoreMoveInfo.NextMoveStep(MoveStep.StoreIn03);
                    var ac = CSVPositionReader<ACStorePosition>.GetPositon(StoreMoveInfo.MoveParam.PosID);
                    if (ac == null) {
                        StoreMoveInfo.log($"找不到库位:"+ StoreMoveInfo.MoveParam.PosID);
                    }
                    boxTransport.Start(new BoxStorePosition(Config, StoreSide.NGDoor, StoreMoveInfo.MoveParam), new BoxStorePosition(Config, ac, StoreMoveInfo.MoveParam), StoreMoveType.InStore, true);
                    StoreMoveInfo.log($"开始转运料盘");
                    break;
                case MoveStep.StoreIn03:
                    if (boxTransport.IsTakedReel)
                    {
                        StoreMoveInfo.NextMoveStep(MoveStep.StoreIn04);
                        StoreMoveInfo.log($"料盘已取走");
                    }
                    else
                    {
                        Msg.add(crc.GetString("Res0154","单料口等待料盘离开."), MsgLevel.info);
                    }
                    break;
                case MoveStep.StoreIn04:
                    if (boxTransport.IsPutIn)
                    {
                        if (!ServerCM.SendStoreState(StoreMoveInfo.MoveParam.PosID, StoreStatus.InStoreEnd))
                        {
                            Msg.add(crc.GetString("Res0156","服务器连接异常"), MsgLevel.warning);
                            return;
                        }
                        StoreMoveInfo.log($"料盘已到达目的地");
                        StoreMoveInfo.NextMoveStep(MoveStep.StoreIn05);
                        OutStoreJobList.ClearLastPosid(StoreMoveInfo.MoveParam.PosID);
                    }
                    else
                    {
                        Msg.add(crc.GetString("Res0157","等待料盘送到指定位置."), MsgLevel.info);
                    }
                    break;
                case MoveStep.StoreIn05:
                    if (boxTransport.IsComplateOrFree)
                    {
                        SRec.info(CID, MachineSide == MachineSideE.Left ? crc.GetString("Res0010","A侧") : crc.GetString("Res0011","B侧"), crc.GetString("Res0013","完成入库"), StoreMoveInfo.MoveParam.PosID);

                        StoreMoveInfo.log($"料盘已到达目的地");
                        StoreMoveInfo.EndMove();
                        OutStoreJobList.ClearLastPosid(StoreMoveInfo.MoveParam.PosID);
                    }
                    break;
                case MoveStep.StoreOut10:
                    if (!ServerCM.SendStoreState(StoreMoveInfo.MoveParam.PosID, StoreStatus.OutStoreExecute))
                    {
                        Msg.add(crc.GetString("Res0156","服务器连接异常"), MsgLevel.warning);
                        return;
                    }
                    StoreMoveInfo.NextMoveStep(MoveStep.StoreOut11);
                    var outFrom = CSVPositionReader<ACStorePosition>.GetPositon(StoreMoveInfo.MoveParam.PosID);
                    BoxStorePosition outTo = new BoxStorePosition(Config, StoreSide.NGDoor, StoreMoveInfo.MoveParam);
                    boxTransport.Start(outFrom == null ? null : new BoxStorePosition(Config, outFrom, StoreMoveInfo.MoveParam), outTo, StoreMoveType.OutStore);
                    StoreMoveInfo.log($"开始转运料盘");
                    SRec.info(CID, MachineSide == MachineSideE.Left ? crc.GetString("Res0010","A侧") : crc.GetString("Res0011","B侧"), crc.GetString("Res0014","开始出库"), StoreMoveInfo.MoveParam.PosID);

                    break;
                case MoveStep.StoreOut11:
                    if (boxTransport.IsTakedReel)
                    {
                        boxTransport.Pause();
                        if (!ServerCM.SendStoreState(StoreMoveInfo.MoveParam.PosID, StoreStatus.OutStoreBoxEnd))
                        {
                            Msg.add(crc.GetString("Res0156","服务器连接异常"), MsgLevel.warning);
                            return;
                        }
                        StoreMoveInfo.NextMoveStep(MoveStep.StoreOut12);
                        StoreMoveInfo.log($"料盘已取走");
                    }
                    else
                    {
                        Msg.add(crc.GetString("Res0158","等待料盘到达."), MsgLevel.info);
                    }
                    break;
                case MoveStep.StoreOut12:
                    boxTransport.Resume();
                    if (boxTransport.IsPutOnOut)
                    {
                        if (IOValue(SIO_Type.Door_Tray_Check, Config).Equals(IO_VALUE.LOW))
                        {
                            Msg.add(crc.GetString("Res0159","单料门口没有检测到出库料盘") + "," + crc.GetString("Res0160","出库库位号:") + StoreMoveInfo.MoveParam.PosID, MsgLevel.alarm);
                            UserPause = true;
                            return;
                        }
                        if (!ServerCM.SendStoreState(StoreMoveInfo.MoveParam.PosID, StoreStatus.OutStoreEnd))
                        {
                            Msg.add(crc.GetString("Res0156","服务器连接异常"), MsgLevel.warning);
                            return;
                        }
                        StoreMoveInfo.NextMoveStep(MoveStep.StoreOut_WaitMT);
                        StoreMoveInfo.log($"料盘已到达目的地");
                        TheLine.UpdateLocInfo("", StoreMoveInfo.MoveParam.WareCode, TheLine.LineStatusE.BOXDOOR, CID);
                        OutStoreJobList.ClearLastPosid(StoreMoveInfo.MoveParam.PosID);
                        
                    }
                    break;
                case MoveStep.StoreOut_WaitMT:
                    StoreMoveInfo.NextMoveStep(MoveStep.StoreOut_WaitMT);
                    var tt = TrayTypeE.MTP2.ToString();
                    if (StoreMoveInfo.MoveParam.PlateW<=15)
                        tt = TrayTypeE.MTP1.ToString();
                    if (SendTrayRequest(tt, StoreMoveInfo.MoveParam) >RemoteResult.Timeout) {
                        SRec.info(CID, MachineSide == MachineSideE.Left ? crc.GetString("Res0010","A侧") : crc.GetString("Res0011","B侧"), crc.GetString("Res0015","完成出库"), StoreMoveInfo.MoveParam.PosID);

                        StoreMoveInfo.WaitList.Add(WaitResultInfo.WaitMsg(crc.GetString("Res0161", "等聊单料门料盘被取走"), MsgLevel.warning));
                    }
                    else
                    {                        
                        StoreMoveInfo.WaitList.Add(WaitResultInfo.WaitMsg(crc.GetString("Res0016","请求环形线空托盘失败"), MsgLevel.warning));
                        
                    }
                    StoreMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(10000));
                    break;
                case MoveStep.StoreOut14:
                    Msg.add(crc.GetString("Res0017","等待环形线取走料盘"), MsgLevel.warning);
                    if (IOValue(SIO_Type.Door_Tray_Check, Config).Equals(IO_VALUE.LOW))
                    {
                        if (IsLineFree() == RemoteResult.True)
                        {
                            StoreMoveInfo.log($"料盘已被取走");
                            StoreMoveInfo.EndMove();
                        }
                    }
                    break;
                default:
                    StoreMoveInfo.log($"未找到对应步骤:{StoreMoveInfo.MoveStep}");
                    break;
            }
        }
        string StoreState() {
            string state = crc.GetString("Res0162","空闲中");
            if (StoreMoveInfo.MoveStep == MoveStep.WaitInStore)
            {
                state = crc.GetString("Res0020","等待入库物料") + ":" + StoreMoveInfo.MoveParam.PosID;
            }
            else if (StoreMoveInfo.MoveStep >= MoveStep.StoreOut10)
            {
                state = crc.GetString("Res0163","出库中")+":"+StoreMoveInfo.MoveParam.PosID;
            }
            else if (StoreMoveInfo.MoveStep >= MoveStep.StoreIn01)
            {
                state = crc.GetString("Res0164","入库中")+":"+StoreMoveInfo.MoveParam.PosID;
            }

            return state;
        }
    }
}