StoreMachine_Store.cs 10.0 KB
using CodeLibrary;
using OnlineStore;
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 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 posId,int plateW,int plateH) {
            JobInfo jobInfo = new JobInfo("", posId,plateW,plateH);
            OutStoreJobList.Enqueue(jobInfo);
            LogUtil.info($"添加出库任务队列: {posId},当前任务数量: {OutStoreJobList.Count}");
        }
        void StoreProcess()
        {
            if (CheckWait(StoreMoveInfo))
                return;
            //常规上料扫码流程
            switch (StoreMoveInfo.MoveStep)
            {
                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.PosID = jobInfo.PosId;
                            StoreMoveInfo.MoveParam.PlateH = jobInfo.plateH;
                            StoreMoveInfo.MoveParam.PlateW = jobInfo.plateW;
                            StoreMoveInfo.log($"开始出库任务:" + jobInfo.ToStr());
                            ServerCM.storeStatus = StoreStatus.OutStoreExecute;
                        }
                    }
                    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.NewMove(MoveStep.Wait);
                    }
                    break;
                case MoveStep.StoreIn01:
                    if (!ServerCM.SendStoreState(StoreMoveInfo.MoveParam.PosID, StoreStatus.InStoreExecute))
                    {
                        Msg.add(crc.GetString("Res0156","服务器连接异常"), MsgLevel.warning);
                        return;
                    }
                    StoreMoveInfo.NextMoveStep(MoveStep.StoreIn02);
                    break;
                case MoveStep.StoreIn02:
                    var ac = CSVPositionReader<ACStorePosition>.GetPositon(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.IsPutOnOut)
                    {
                        if (!ServerCM.SendStoreState(StoreMoveInfo.MoveParam.PosID, StoreStatus.InStoreEnd))
                        {
                            Msg.add(crc.GetString("Res0156","服务器连接异常"), MsgLevel.warning);
                            return;
                        }
                        StoreMoveInfo.log($"料盘已到达目的地");
                        StoreMoveInfo.NextMoveStep(MoveStep.StoreIn05);
                    }
                    else
                    {
                        Msg.add(crc.GetString("Res0157","等待料盘送到指定位置."), MsgLevel.info);
                    }
                    break;
                case MoveStep.StoreIn05:
                    if (boxTransport.IsComplateOrFree)
                    {
                        StoreMoveInfo.log($"料盘已到达目的地");
                        StoreMoveInfo.EndMove();
                    }
                    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($"开始转运料盘");

                    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.StoreOut13);
                        StoreMoveInfo.log($"料盘已到达目的地");
                        OutStoreJobList.ClearLastPosid(StoreMoveInfo.MoveParam.PosID);
                    }
                    break;
                case MoveStep.StoreOut13:
                    if (IOMonitor.IODebound(SIO_Type.Door_Tray_Check, Config, IO_VALUE.LOW, 1000))
                    {
                        StoreMoveInfo.log($"料盘已被取走");
                        StoreMoveInfo.EndMove();
                    }
                    else if (StoreMoveInfo.IsTimeOut(30))
                    {
                        Msg.add(crc.GetString("Res0161","等聊单料门料盘被取走"), MsgLevel.alarm);
                    }
                    else
                        Msg.add(crc.GetString("Res0161","等聊单料门料盘被取走"), MsgLevel.info);
                    break;
                default:
                    StoreMoveInfo.log($"未找到对应步骤:{StoreMoveInfo.MoveStep}");
                    break;
            }
        }
        string StoreState() {
            string state = crc.GetString("Res0162","空闲中");
            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;
        }
    }
}