MainMachine_Store.cs 9.4 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 MainMachine
    {
        StoreJobList OutStoreJobList = new StoreJobList("批量");
        StoreJobList OutSingleJobList = 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}");
        }
        public void AddSingleStoreTask(string posId, int plateW, int plateH)
        {
            JobInfo jobInfo = new JobInfo("", posId, plateW, plateH);
            OutSingleJobList.Enqueue(jobInfo);
            LogUtil.info($"添加单盘出库任务队列: {posId},当前任务数量: {OutStoreJobList.Count}");
        }
        void StoreProcess()
        {
            if (CheckWait(StoreMoveInfo))
                return;
            //常规上料扫码流程
            switch (StoreMoveInfo.MoveStep)
            {
                case MoveStep.Wait:
                    //IOValue(IO_Type.TrayCheck_Fixture).Equals(IO_VALUE.HIGH)
                    if (StoreMoveInfo.IsTimeOut(5) && IOMonitor.IODebound(IO_Type.TrayCheck_Fixture,Config,IO_VALUE.HIGH,5000)  && boxTransport.IsComplateOrFree && ClampMoveInfo.MoveStep == MoveStep.Wait) {
                        StoreMoveInfo.NewMove(MoveStep.StoreOut_NGPre);
                        StoreMoveInfo.MoveParam.PosID = "NG";
                        StoreMoveInfo.MoveParam.PlateH = 56;
                        StoreMoveInfo.MoveParam.PlateW = 7;
                        StoreMoveInfo.MoveParam.IsNg = true;
                        StoreMoveInfo.MoveParam.NgMsg = crc.GetString(L.tray_detect_reel_01, "料叉传感器X30感应到有料,请人工确认");
                        StoreMoveInfo.log($"开始无信息料盘出库");
                        ServerCM.storeStatus = StoreStatus.OutStoreExecute;
                        CloseFlipDoor(StoreMoveInfo);
                    }
                    //判断有没有料盘等待入库
                    else if (IsWaitInStore)
                    {
                        StoreMoveInfo.NextMoveStep(MoveStep.StoreIn01);
                        StoreMoveInfo.MoveParam = ClampMoveInfo.MoveParam.clone();
                        StoreMoveInfo.log($"入库料盘已准备好");
                    }
                    //判断有没有单盘出库任务, 需要入库空闲, 出口空闲
                    else if (OutSingleJobList.Count > 0 && boxTransport.IsComplateOrFree && ClampMoveInfo.MoveStep == MoveStep.Wait)
                    {
                        if (OutSingleJobList.Dequeue(out JobInfo jobInfo))
                        {
                            StoreMoveInfo.NewMove(MoveStep.StoreOut10);
                            StoreMoveInfo.MoveParam.PosID = jobInfo.PosId;
                            StoreMoveInfo.MoveParam.PlateH = jobInfo.plateH;
                            StoreMoveInfo.MoveParam.PlateW = jobInfo.plateW;
                            StoreMoveInfo.MoveParam.IsNg = true;
                            StoreMoveInfo.MoveParam.NgMsg = crc.GetString(L.ngdoor_reel_out, "单盘出库");
                            StoreMoveInfo.log($"开始单盘出库任务:" + jobInfo.ToStr());
                            ServerCM.storeStatus = StoreStatus.OutStoreExecute;
                            CloseFlipDoor(StoreMoveInfo);
                        }
                    }
                    //判断有没有出库任务, 需要入库空闲, 出口空闲
                    else if (IsPutReelReady && boxTransport.IsComplateOrFree)
                    {
                        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;
                        }
                    }
                    break;
                case MoveStep.StoreIn01:
                    StoreMoveInfo.NextMoveStep(MoveStep.StoreIn03);
                    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($"开始转运料盘");
                    ServerCM.SendStoreState(StoreMoveInfo.MoveParam.PosID, StoreStatus.InStoreExecute);
                    break;
                case MoveStep.StoreIn02:
                    break;
                case MoveStep.StoreIn03:
                    if (boxTransport.IsTakedReel)
                    {
                        ReelTaked();
                        StoreMoveInfo.NextMoveStep(MoveStep.StoreIn04);
                        StoreMoveInfo.log($"料盘已取走");
                    }
                    else
                    {
                        Msg.add(crc.GetString(L.wait_reel_transfer, "单料口等待料盘离开."), MsgLevel.info);
                    }
                    break;
                case MoveStep.StoreIn04:
                    if (boxTransport.IsComplateOrFree)
                    {
                        StoreMoveInfo.log($"料盘已到达目的地");
                        ServerCM.SendStoreState(StoreMoveInfo.MoveParam.PosID, StoreStatus.InStoreEnd);
                        StoreMoveInfo.EndMove();
                    }
                    break;
                case MoveStep.StoreOut_NGPre:
                    StoreMoveInfo.NextMoveStep(MoveStep.StoreOut10);
                    break;
                case MoveStep.StoreOut10:
                    StoreMoveInfo.NextMoveStep(MoveStep.StoreOut11);
                    var outFrom = CSVPositionReader<ACStorePosition>.GetPositon(StoreMoveInfo.MoveParam.PosID);
                    BoxStorePosition outTo;
                    if (StoreMoveInfo.MoveParam.IsNg)
                        outTo = new BoxStorePosition(Config,  StoreSide.NGDoor, StoreMoveInfo.MoveParam);
                    else
                        outTo = new BoxStorePosition(Config,  StoreSide.String, StoreMoveInfo.MoveParam);
                    boxTransport.Start(outFrom==null?null:new BoxStorePosition(Config, outFrom, StoreMoveInfo.MoveParam), outTo, StoreMoveType.OutStore);
                    StoreMoveInfo.log($"开始转运料盘{(StoreMoveInfo.MoveParam.IsNg?"单料口":"料串")}");
                    ServerCM.SendStoreState(StoreMoveInfo.MoveParam.PosID, StoreStatus.OutStoreExecute);
                    break;
                case MoveStep.StoreOut11:
                    if (boxTransport.IsTakedReel)
                    {
                        ServerCM.SendStoreState(StoreMoveInfo.MoveParam.PosID, StoreStatus.OutStoreBoxEnd);
                        StoreMoveInfo.NextMoveStep(MoveStep.StoreOut12);
                        StoreMoveInfo.log($"料盘已取走");
                    }
                    else
                    {
                        Msg.add(crc.GetString(L.wait_reel_transfer, "等待料盘到达."), MsgLevel.info);
                    }
                    break;
                case MoveStep.StoreOut12:
                    if (boxTransport.IsPutOnOut)
                    {

                        StoreMoveInfo.log($"料盘已到达目的地");
                        ServerCM.SendStoreState(StoreMoveInfo.MoveParam.PosID, StoreStatus.OutStoreEnd);
                        if (StoreMoveInfo.MoveParam.IsNg)
                        {
                            
                            NGPuted(StoreMoveInfo.MoveParam.NgMsg);
                            OutSingleJobList.ClearLastPosid(StoreMoveInfo.MoveParam.PosID);
                        }
                        else
                        {
                            ReelPutted(StoreMoveInfo.MoveParam.PlateH);
                            OutStoreJobList.ClearLastPosid(StoreMoveInfo.MoveParam.PosID);
                        }
                        
                        StoreMoveInfo.EndMove();
                    }
                    break;
                default:
                    StoreMoveInfo.log($"未找到对应步骤:{StoreMoveInfo.MoveStep}");
                    break;
            }
        }
        string StoreState() {
            string state = crc.GetString(L.free,"空闲中");
            if (StoreMoveInfo.MoveStep >= MoveStep.StoreOut10)
            {
                state = $"{crc.GetString(L.reel_outting, "出库中")},{crc.GetString(L.posnum, "出库中")}:{StoreMoveInfo.MoveParam.PosID}";
            }
            else if (StoreMoveInfo.MoveStep >= MoveStep.StoreIn01)
            {
                state = $"{crc.GetString(L.reel_ining, "入库中")},{crc.GetString(L.posnum, "出库中")}:{StoreMoveInfo.MoveParam.PosID}";
            }

            return state;
        }
    }
}