BoxEquip_OutExecute.cs 21.3 KB
using OnlineStore.DeviceLibrary.deviceLibrary;
using OnlineStore.LoadCSVLibrary;
using System;

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.MoveParam.PosInfo.barcode);
                    MoveInfo.NextMoveStep(StepEnum.SO_01_MoveAxis_Ready);
                    if (!IsMoveAxisInSafePos())
                    {
                        MoveAxisToSafePos();
                        LogInfo($"出库 {MoveInfo.SLog}:行走机构不在安全位置,先到安全位置={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:
                    MoveInfo.NextMoveStep(StepEnum.SO_03_ToTray);
                    LogInfo($"出库 {MoveInfo.SLog}:到抽屉提取点,抽屉拉取进出轴到抽屉提取点P2/P4[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    PullAxis_Inout_To_P2_P4();
                    break;
                case StepEnum.SO_03_ToTray:
                    MoveInfo.NextMoveStep(StepEnum.SO_04_LiftTray);
                    LogInfo($"出库 {MoveInfo.SLog}:提升抽屉,抽屉拉取升降轴到抽屉提取高点P3[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    AddHookCheck(true);
                    PullAxis_UpdownToHighP3();
                    break;
                case StepEnum.SO_04_LiftTray:
                    MoveInfo.NextMoveStep(StepEnum.SO_05_PullTray);
                    LogInfo($"出库 {MoveInfo.SLog}:拉抽屉到库位点,抽屉拉取进出轴到料屉库位点P3/P5,同时检测{trayAColumns[GetPosColumn()]}=0[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    PullAxis_Inout_To_P3_P5();
                    if (CheckASide())
                    {
                        if (!GetShieldState(sheidAColmns[GetPosColumn()]))
                            MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(trayAColumns[GetPosColumn()], IO_VALUE.LOW));
                    }
                    else
                    {
                        if (!GetShieldState(sheidBColmns[GetPosColumn()]))
                            MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(trayBColumns[GetPosColumn()], IO_VALUE.LOW));
                    }
                    break;
                case StepEnum.SO_05_PullTray:
                    MoveInfo.NextMoveStep(StepEnum.SO_06_DropTrayToPos);
                    LogInfo($"出库 {MoveInfo.SLog}:将抽屉降到库位提取点,抽屉拉取升降轴到P2料屉提取水平点P2[{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();
                    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()}面]");
                    AddHookCheck(true);
                    PullAxis_UpdownToHighP3();
                    break;
                case StepEnum.SO_10_LiftTray:
                    //MoveInfo.NextMoveStep(StepEnum.SO_11_PushTray);
                    //LogInfo($"出库 {MoveInfo.SLog}:到进出轴待机点拍照,料斗拉取进出轴到料屉待机点P1,移栽旋转轴到取放料水平点P2,移栽X到P1[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    //PullAxis_Inout_To_P1();
                    //MiddleAxis_To_P2();
                    //XAxis_To_P1();

                    MoveInfo.NextMoveStep(StepEnum.SO_12_PutTrayMiddle);
                    LogInfo($"出库 {MoveInfo.SLog}:推到抽屉提取点,抽屉拉取进出轴到抽屉提取点P2/P4,移栽X到P1[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    PullAxis_Inout_To_P2_P4();
                    XAxis_To_P1();
                    break;
                case StepEnum.SO_11_PushTray:
                    MoveInfo.NextMoveStep(StepEnum.SO_12_PutTrayMiddle);
                    LogInfo($"出库 {MoveInfo.SLog}:推到抽屉提取点,抽屉拉取进出轴到抽屉提取点P2/P4[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    //Bitmap bitmap = AcqImage(CamPosSide(MoveInfo.MoveParam.PosInfo.PosId));
                    PullAxis_Inout_To_P2_P4();
                    //bool rtn = MatchAndSaveImg(bitmap, $"{DateTime.Now.ToString("HHmmss")}");
                    //string res = rtn ? "OK" : "NG";
                    //LogInfo($"出库 {MoveInfo.SLog}:抓手检测结果:{res}");

                    //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()}面]");
                    AddHookCheck(false);
                    PullAxis_UpdownToLowP4();
                    break;
                case StepEnum.SO_12_PutTrayDown:
                    MoveInfo.NextMoveStep(StepEnum.SO_13_InoutBack_1);
                    //AddReelCheck(true);
                    LogInfo($"出库 {MoveInfo.SLog}:抽屉拉取进出轴到拍照点,检测料叉信号,同时检测{trayAColumns[GetPosColumn()]}=1 [{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    if (CheckASide())
                    {
                        if (!GetShieldState(sheidAColmns[GetPosColumn()]))
                            MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(trayAColumns[GetPosColumn()], IO_VALUE.HIGH));
                    }
                    else
                    {
                        if (!GetShieldState(sheidBColmns[GetPosColumn()]))
                            MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(trayBColumns[GetPosColumn()], IO_VALUE.HIGH));
                    }
                    PullAxis_Inout_To_Cam();
                    break;
                case StepEnum.SO_13_InoutBack_1:
                    if (!CheckReel(true))
                    {
                        if (isAlarmForkCheck())
                            SetCriticalMsg($"{MoveInfo.MoveParam.PosInfo.GetPosSide()}取料后,料叉未检测到料盘【{MoveInfo?.MoveParam?.PosInfo?.barcode}】");
                        return;
                    }
                    SetWarnMsg("");
                    MoveInfo.NextMoveStep(StepEnum.SO_13_InoutBack);
                    checkForkCnt = 0;
                    ignoreCurFork = false;
                    LogInfo($"出库 {MoveInfo.SLog}:抽屉拉取进出轴已到达拍照点,移栽旋转轴到取放料水平点P2[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    MiddleAxis_To_P2();
                    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;
                                }
                            }
                        }
                    }
                    else//两夹爪都有料
                    {
                        if (MoveInfo.MoveParam.PosInfoBack.PlateW == MoveInfo.MoveParam.PosInfo.PlateW &&
                            MoveInfo.MoveParam.PosInfoBack.PlateH == MoveInfo.MoveParam.PosInfo.PlateH)
                        {
                            MoveInfo.NextMoveStep(StepEnum.SOB_14_GetReels_Ready);
                            return;
                        }
                    }
                    //直接出库,执行该步骤的情况:1.另一个料叉有料;2.另一面有出库任务但出料口有料;3.另一面没有出库任务;
                    MoveInfo.NextMoveStep(StepEnum.SO_14_GetReels_Ready);
                    PullAxis_UpdownToP1();
                    UpdownAxisTo_P4_P10();
                    //BuffAreaOutstoreDoor(true);
                    if (MoveInfo.MoveParam.PosInfoBack == null)
                        LogInfo($"出库 {MoveInfo.SLog}:[{MoveInfo.MoveParam.PosInfo.barcode}]取料完成,准备送往出料口。料屉升降轴到P1点,移栽升降轴到下暂存区出库放料高点P4/P10");
                    else
                        LogInfo($"出库 {MoveInfo.SLog}:[{MoveInfo.MoveParam.PosInfo.ToStr()}][{MoveInfo.MoveParam.PosInfoBack.ToStr()}]取料完成,准备送往出料口,抽屉升降轴到P1点,移栽升降轴到下暂存区出库放料高点P4/P10");
                    break;
                case StepEnum.SO_14_GetReels_Ready:
                    //if (!CheckReel(true))
                    //{
                    //    SetCriticalMsg($"未检测到{MoveInfo.MoveParam.PosInfo.GetPosSide()}面料叉上的料盘,请检查");
                    //    return;
                    //}
                    MoveInfo.NextMoveStep(StepEnum.SO_14_GetReels_Ready1);
                    MoveAxisToP1();

                    ignoreCurFork = false;
                    LogInfo($"出库 {MoveInfo.SLog}:准备送往出料口。行走机构到待机点P1");
                    ForkCheckWhenRunning();
                    break;
                case StepEnum.SO_14_GetReels_Ready1:
                    //if (!CheckReel(true))
                    //{
                    //    SetCriticalMsg($"未检测到{MoveInfo.MoveParam.PosInfo.GetPosSide()}面料叉上的料盘,请检查");
                    //    return;
                    //}

                    //已出一边的料,切换到另一边
                    MoveInfo.NextMoveStep(StepEnum.SO_15_ToBufferArea);
                    StopForkCheck();
                    ignoreCurFork = false;
                    //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);
                        BuffAreaOutstoreDoor(true);
                        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_ReleaseReel);
                    LogInfo($"出库 {MoveInfo.SLog}:松开料盘,移栽压紧轴到压紧前点P2");
                    ComAxis_To_P2();
                    break;
                case StepEnum.SO_18_ReleaseReel:
                    MoveInfo.NextMoveStep(StepEnum.SO_18_PutReel);
                    LogInfo($"出库 {MoveInfo.SLog}:放料盘,移栽升降轴到下暂存区放料低点P5/P11");
                    executeTime = (DateTime.Now - startTime).TotalSeconds.ToString("f2");
                    // SetBoxStatus(DeviceStatus.OutStoreBoxEnd, RunStatus.Busy, MoveInfo.MoveParam.PosInfo.PosId, MoveInfo.MoveParam.PosInfo.barcode);
                    UpdownAxisTo_P5_P11();
                    break;
                case StepEnum.SO_18_PutReel:
                    if (!StoreManager.XLRStore.boxEquip.SendStoreState(MoveInfo.MoveParam.PosInfo.PosId, MoveInfo.MoveParam.PosInfo.barcode, DeviceStatus.OutStoreBoxEnd))
                        return;
                    Msg.add($"出库完成:【{MoveInfo.MoveParam.PosInfo.PosId}】【{MoveInfo.MoveParam.PosInfo.barcode}】【{DeviceStatus.OutStoreBoxEnd}】", MsgLevel.info);
                    MoveInfo.NextMoveStep(StepEnum.SO_19_InOutBackFromBuff);
                    LogInfo($"出库 {MoveInfo.SLog}:[{MoveInfo.MoveParam.PosInfo.ToStr()}]出库完成[耗时:{(DateTime.Now - startTime).TotalSeconds.ToString("f2")}秒],移栽X轴到待机点P1,行走机构到待机点P1[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    XAxis_To_P1();
                    MoveAxisToP1();
                    if (CheckASide())
                    {
                        recentAOutstores.Push(MoveInfo.MoveParam.PosInfo.PosId);
                        LogInfo($"{recentAOutstores}");
                    }
                    else
                    {
                        recentBOutstores.Push(MoveInfo.MoveParam.PosInfo.PosId);
                        LogInfo($"{recentBOutstores}");
                    }
                    break;
                case StepEnum.SO_19_InOutBackFromBuff:
                    //出库料盘放置成功,将料盘信息写入对应出料口
                    SetReelInfoToBuff();
                    if (MoveInfo.MoveParam.PosInfoBack == null)
                    {
                        MoveInfo.NextMoveStep(StepEnum.SO_20_Finish);
                        BuffAreaOutstoreDoor(false);
                        LogInfo($"出库 {MoveInfo.SLog}:另一面料叉无料,关闭出料防护门,出库结束[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    }
                    else
                    {
                        MoveInfo.NextMoveStep(StepEnum.SO_14_GetReels_Ready);
                        LogInfo($"出库 {MoveInfo.SLog}:另一面料叉有料,开始出库,准备送往出料口,料屉升降轴到P1点,移栽升降轴到下暂存区放料高点P4/P10[{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;
                        // MoveAxisToP1();
                        PullAxis_UpdownToP1();
                        UpdownAxisTo_P4_P10();
                    }
                    break;
                case StepEnum.SO_20_Finish:
                    SetBoxStatus(DeviceStatus.StoreOnline, RunStatus.Runing);
                    MoveInfo.EndMove();
                    //停止记录  
                    StopRecord();
                    AutoInout.InOutEndProcess(this, MoveType.OutStore);
                    break;
            }
        }
        #endregion

    }
}