BoxEquip_OutExecute.cs 16.8 KB
using CodeLibrary;
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms.VisualStyles;

namespace OnlineStore.DeviceLibrary
{
    partial class BoxEquip
    {
        /// <summary>
        /// 料盘放到出料口成功,并将料盘信息写入该口
        /// </summary>
        private void SetReelInfoToBuff()
        {
            if (CheckASide())
            {
                BufferDataManager.AOutStoreInfo = MoveInfo.MoveParam.PosInfo.ToCopy();
            }
            else
            {
                BufferDataManager.BOutStoreInfo = MoveInfo.MoveParam.PosInfo.ToCopy();
            }
        }
        #region 出库
        private void OutstoreExecute()
        {
            switch (MoveInfo.MoveStep)
            {
                case StepEnum.SO_00_StartOutstore:
                    PullAxisToP1("出库");
                    break;

                case StepEnum.SO_01_PullAxis_Ready:
                    SetBoxStatus(DeviceStatus.OutStoreExecute, RunStatus.Busy, MoveInfo.MoveParam.PosInfo.PosId);
                    MoveInfo.NextMoveStep(StepEnum.SO_01_MoveAxis_Ready);
                    if(!IsMoveAxisInSafePos())
                    {
                        MoveAxisToP1();
                        LogInfo($"出库 行走机构不在安全位置,先到安全位置={Config.MoveAxis_SafePos}。当前位置{MoveAxis.GetAclPosition()}");
                    }
                    break;
                case StepEnum.SO_01_MoveAxis_Ready:
                    MoveInfo.NextMoveStep(StepEnum.SO_02_ToPosition);
                    startTime = DateTime.Now;
                    LogInfo($"出库 {MoveInfo.SLog}:到库位,行走机构到存储库位取放点位P3,移栽升降轴到料屉上方过渡点P6/P12," +
                        $"料斗拉取升降轴到料屉提取低点P4,移栽压紧轴到压紧前点P2,移栽X轴到库位取放点P3,移栽旋转轴到料屉库位垂直取放料点P3[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    PullAxis_Inout_To_Cam();//料屉拉取进出轴到拍照点
                    MoveAxisToP3();
                    UpdownAxisTo_P6_P12();
                    PullAxis_UpdownToLowP4();
                    ComAxis_To_P2();
                    XAxis_To_P3();
                    MiddleAxis_To_P3();
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(3000));
                    break;
                case StepEnum.SO_02_ToPosition:
                    if(CamCheckReelPosition())
                    {
                        MoveInfo.NextMoveStep(StepEnum.SO_03_ToTray);
                        LogInfo($"出库 {MoveInfo.SLog}:到抽屉提取点,料斗拉取进出轴到料屉提取点P2/P4[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                        ToTray();
                        CamDetectError = false;
                        IgnoreCamDect = false;
                    }
                    break;
                case StepEnum.SO_03_ToTray:
                    MoveInfo.NextMoveStep(StepEnum.SO_04_LiftTray);
                    LogInfo($"出库 {MoveInfo.SLog}:提升抽屉,料斗拉取升降轴到料屉提取高点P3[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    PullAxis_UpdownToHighP3();
                    break;
                case StepEnum.SO_04_LiftTray:
                    MoveInfo.NextMoveStep(StepEnum.SO_05_PullTray);
                    LogInfo($"出库 {MoveInfo.SLog}:拉抽屉到库位点,料斗拉取进出轴到料屉库位点P3/P5[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    PullAxis_Inout_To_P3_P5();
                    break;
                case StepEnum.SO_05_PullTray:
                    MoveInfo.NextMoveStep(StepEnum.SO_06_DropTrayToPos);
                    LogInfo($"出库 {MoveInfo.SLog}:将抽屉降到库位提取点,料斗拉取升降轴到P2料屉提取水平点P2,到位后检测{trayRows[GetPosRow()]}=1[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    PullAxis_UpdownToMiddleP2();
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(trayRows[GetPosRow()], IO_VALUE.HIGH));
                    break;
                case StepEnum.SO_06_DropTrayToPos:
                    MoveInfo.NextMoveStep(StepEnum.SO_07_GetReel);
                    LogInfo($"出库 {MoveInfo.SLog}:进入库位中,移栽升降轴到料屉取放点P7/P13[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    UpdownAxisToP7_P13();
                    SaveSpecifiedImage();
                    break;
                case StepEnum.SO_07_GetReel:
                    MoveInfo.NextMoveStep(StepEnum.SO_08_StartCompress);
                    LogInfo($"出库 {MoveInfo.SLog}:压紧轴开始缓慢夹取,移栽压紧轴到压紧点P3[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    ComAxis_To_P3();
                    break;
                case StepEnum.SO_08_StartCompress:
                    MoveInfo.NextMoveStep(StepEnum.SO_09_UpDownBack);
                    LogInfo($"出库 {MoveInfo.SLog}:叉子从库位返回,移栽升降轴到料屉上方过度点P6/P12[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    UpdownAxisTo_P6_P12();
                    break;
                case StepEnum.SO_09_UpDownBack:
                    MoveInfo.NextMoveStep(StepEnum.SO_10_LiftTray);
                    LogInfo($"出库 {MoveInfo.SLog}:提升抽屉,料斗拉取升降轴到料屉提取高点P3[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    PullAxis_UpdownToHighP3();
                    break;
                case StepEnum.SO_10_LiftTray:
                    //MoveInfo.NextMoveStep(StepEnum.SO_11_PushTray);
                    MoveInfo.NextMoveStep(StepEnum.SO_12_PutTrayMiddle);
                    LogInfo($"出库 {MoveInfo.SLog}:推到抽屉提取点,料斗拉取进出轴到料屉提取点P2/P4,移栽旋转轴到取放料水平点P2,移栽X到P1[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    PullAxis_Inout_To_P2_P4();
                    MiddleAxis_To_P2();
                    XAxis_To_P1();
                    break;
                //case StepEnum.SO_11_PushTray:
                //    MoveInfo.NextMoveStep(StepEnum.SO_12_PutTrayMiddle);
                //    PullAxis_UpdownToMiddleP2();
                //    if (CheckASide())
                //    {
                //        LogInfo($"出库 {MoveInfo.SLog}:料斗拉取升降轴到料屉水平点P2,同时检测{trayAColumns[GetPosColumn()]}=1[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                //        if (!GetShieldState(sheidAColmns[GetPosColumn()]))
                //            MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(trayAColumns[GetPosColumn()], IO_VALUE.HIGH));
                //    }
                //    else
                //    {
                //        LogInfo($"出库 {MoveInfo.SLog}:料斗拉取升降轴到料屉水平点P2,同时检测{trayBColumns[GetPosColumn()]} = 1[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                //        if (!GetShieldState(sheidBColmns[GetPosColumn()]))
                //            MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(trayBColumns[GetPosColumn()], IO_VALUE.HIGH));
                //    }
                //    break;
                case StepEnum.SO_12_PutTrayMiddle:
                    MoveInfo.NextMoveStep(StepEnum.SO_12_PutTrayDown);
                    //LogInfo($"出库 {MoveInfo.SLog}:放下料屉,料斗拉取升降轴到料屉提取低点P4[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    PullAxis_UpdownToLowP4();
                    if (CheckASide())
                    {
                        LogInfo($"出库 {MoveInfo.SLog}:放下料屉,料斗拉取升降轴到料屉提取低点P4,同时检测{trayAColumns[GetPosColumn()]}=1[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                        if (!GetShieldState(sheidAColmns[GetPosColumn()]))
                            MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(trayAColumns[GetPosColumn()], IO_VALUE.HIGH));
                    }
                    else
                    {
                        LogInfo($"出库 {MoveInfo.SLog}:放下料屉,料斗拉取升降轴到料屉提取低点P4,同时检测{trayBColumns[GetPosColumn()]} = 1[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                        if (!GetShieldState(sheidBColmns[GetPosColumn()]))
                            MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(trayBColumns[GetPosColumn()], IO_VALUE.HIGH));
                    }
                    break;
                case StepEnum.SO_12_PutTrayDown:
                    MoveInfo.NextMoveStep(StepEnum.SO_13_InoutBack);
                    LogInfo($"出库 {MoveInfo.SLog}:料斗拉取进出轴到拍照点[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    PullAxis_Inout_To_Cam();
                    break;
                case StepEnum.SO_13_InoutBack:
                    //检查另一面是否有出库任务
                    if (MoveInfo.MoveParam.PosInfoBack == null)
                    {
                        if (CheckASide(MoveInfo.MoveParam))
                        {
                            if (waitBOutStoreList.Count > 0 && CheckBOutDoor())
                            {
                                if (waitBOutStoreList.TryDequeue(out InOutParam inOutParam))//B面料叉空且B面出料口无料,有出库任务
                                {
                                    MoveInfo.NextMoveStep(StepEnum.SO_01_PullAxis_Ready);
                                    LogInfo($"存储机构-出库 {MoveInfo.SLog}:A面切换到B面,B面取料[{inOutParam.PosInfo.barcode}]");
                                    MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                                    MoveInfo.MoveParam.PosInfoBack = MoveInfo.MoveParam.PosInfo.ToCopy();
                                    MoveInfo.MoveParam.PosInfo = inOutParam.PosInfo.ToCopy();
                                    MoveInfo.MoveParam.MoveP = new LineMoveP(Config, inOutParam.PosInfo.PosId);
                                    PullAxis_Inout_To_Cam();
                                    return;
                                }
                            }
                        }
                        else
                        {
                            if (waitAOutStoreList.Count > 0 && CheckAOutDoor())
                            {
                                if (waitAOutStoreList.TryDequeue(out InOutParam inOutParam))
                                {
                                    MoveInfo.NextMoveStep(StepEnum.SO_01_PullAxis_Ready);
                                    LogInfo($"存储机构-出库 {MoveInfo.SLog}:B面切换到A面,A面取料[{inOutParam.PosInfo.barcode}]");
                                    MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                                    MoveInfo.MoveParam.PosInfoBack = MoveInfo.MoveParam.PosInfo.ToCopy();
                                    MoveInfo.MoveParam.PosInfo = inOutParam.PosInfo.ToCopy();
                                    MoveInfo.MoveParam.MoveP = new LineMoveP(Config, inOutParam.PosInfo.PosId);
                                    PullAxis_Inout_To_Cam();
                                    return;
                                }
                            }
                        }
                    }
                    //直接出库,执行该步骤的情况:1.另一个料叉有料;2.另一面有出库任务但出料口有料;3.另一面没有出库任务;
                    MoveInfo.NextMoveStep(StepEnum.SO_14_GetReels_Ready);
                    MoveAxisToP1();
                    PullAxis_UpdownToP1();
                    UpdownAxisTo_P4_P10();
                    if (MoveInfo.MoveParam.PosInfoBack == null)
                        LogInfo($"出库 {MoveInfo.SLog}:[{MoveInfo.MoveParam.PosInfo.barcode}]取料完成,准备送往出料口。行走机构到待机点P1,料屉升降轴到P1点,移栽升降轴到下暂存区放料高点P4/P10");
                    else
                        LogInfo($"出库 {MoveInfo.SLog}:[{MoveInfo.MoveParam.PosInfo.ToStr()}][{MoveInfo.MoveParam.PosInfoBack.ToStr()}]取料完成,准备送往出料口。行走机构到待机点P1,料屉升降轴到P1点,移栽升降轴到下暂存区放料高点P4/P10");
                    break;
                case StepEnum.SO_14_GetReels_Ready:
                    //已出一边的料,切换到另一边
                    MoveInfo.NextMoveStep(StepEnum.SO_15_ToBufferArea);
                    //LogInfo($"出库 {MoveInfo.SLog}:到暂存区出料口," +
                    //    $"行走机构到进出料机构取放点P2[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    break;
                case StepEnum.SO_15_ToBufferArea:
                    if (!OutDoorCheck(MoveInfo.MoveParam))
                    {
                        SetWarnMsg($"出库 {MoveInfo.SLog}:出料口有其他料盘,无法放置该料盘[barcode={MoveInfo.MoveParam.PosInfo.barcode},PosSide={MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    }
                    else
                    {
                        MoveInfo.NextMoveStep(StepEnum.SO_16_VerifyBufferState);
                        LogInfo($"出库 {MoveInfo.SLog}:出料口无料盘确认,开始放料[barcode={MoveInfo.MoveParam.PosInfo.barcode}][{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    }
                    break;
                case StepEnum.SO_16_VerifyBufferState:
                    if(!CheckInputMiddleAxisInBuff())
                    {
                        MoveInfo.NextMoveStep(StepEnum.SO_17_InOutToBuff);
                        LogInfo($"出库 {MoveInfo.SLog}:移栽X轴到进出料暂存区取放点P2,行走机构到进出料机构取放点P2[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                        XAxis_To_P2();
                        MoveAxisToP2();
                    }
                    else if (MoveInfo.IsTimeOut())
                    {
                        SetWarnMsg($"等待上料机构旋转轴离开{MoveInfo.MoveParam.PosInfo.GetPosSide()}面暂存区超时");
                    }
                    break;
                case StepEnum.SO_17_InOutToBuff:
                    MoveInfo.NextMoveStep(StepEnum.SO_18_PutReel);
                    LogInfo($"出库 {MoveInfo.SLog}:放料盘,移栽升降轴到下暂存区放料低点P5/P11,移栽压紧轴到压紧前点P2");
                    executeTime = (DateTime.Now - startTime).TotalSeconds.ToString("f2");
                    SetBoxStatus(DeviceStatus.OutStoreBoxEnd, RunStatus.Busy, MoveInfo.MoveParam.PosInfo.PosId);
                    UpdownAxisTo_P5_P11();
                    ComAxis_To_P2();
                    break;
                case StepEnum.SO_18_PutReel:
                    MoveInfo.NextMoveStep(StepEnum.SO_19_InOutBackFromBuff);
                    LogInfo($"出库 {MoveInfo.SLog}:[{MoveInfo.MoveParam.PosInfo.ToStr()}]出库完成[耗时:{(DateTime.Now-startTime).TotalSeconds.ToString("f2")}秒],移栽X轴到待机点P1[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    XAxis_To_P1();
                    break;
                case StepEnum.SO_19_InOutBackFromBuff:
                    //出库料盘放置成功,将料盘信息写入对应出料口
                    SetReelInfoToBuff();
                    if (MoveInfo.MoveParam.PosInfoBack == null)
                    {
                        MoveInfo.NextMoveStep(StepEnum.SO_20_Finish);
                        LogInfo($"出库 {MoveInfo.SLog}:另一面料叉无料,出库结束[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    }
                    else
                    {
                        MoveInfo.NextMoveStep(StepEnum.SO_14_GetReels_Ready);
                        LogInfo($"出库 {MoveInfo.SLog}:另一面料叉有料,开始出库[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                        MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                        MoveInfo.MoveParam.PosInfo = MoveInfo.MoveParam.PosInfoBack.ToCopy();
                        MoveInfo.MoveParam.MoveP = new LineMoveP(Config, MoveInfo.MoveParam.PosInfoBack.PosId);
                        MoveInfo.MoveParam.PosInfoBack = null;
                    }
                    break;
                case StepEnum.SO_20_Finish:
                    SetBoxStatus(DeviceStatus.StoreOnline, RunStatus.Runing);
                    MoveInfo.EndMove();
                    AutoInout.InOutEndProcess(this, MoveType.OutStore);
                    break;
            }
        }
        #endregion

    }
}