BoxEquip_OutExecute.cs 19.3 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 SetReelAInfoToBuff()
        {
            {
                BufferDataManager.AOutStoreInfo = MoveInfoLineA.MoveParam.PosInfo.ToCopy();
            }
        }
        private void SetReelBInfoToBuff()
        {
            {
                BufferDataManager.BOutStoreInfo = MoveInfoLineB.MoveParam.PosInfo.ToCopy();
            }
        }
        bool CanPutReelIntoLine()
        {
            if(CheckASide())
            {
                return MoveInfoLineA.MoveType.Equals(MoveType.None);
            }
            else
            {
                return MoveInfoLineB.MoveType.Equals(MoveType.None);
            }
        }
        #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()}面]");
                    AddReelCheck(true);
                    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,旋转轴到水平点[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    PullAxis_Inout_To_P2_P4();
                    //XAxis_To_P1();移栽X到P1,
                    MiddleAxis_To_P2();
                    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}:放下抽屉,移栽旋转轴到取放料水平点P2,抽屉拉取升降轴到抽屉提取低点P4[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    AddHookCheck(false);
                    PullAxis_UpdownToLowP4();
                    MiddleAxis_To_P2();
                    break;
                case StepEnum.SO_12_PutTrayDown:
                    MoveInfo.NextMoveStep(StepEnum.SO_13_InoutBack);
                    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:
                    //检查另一面是否有出库任务
                    //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(500));
                    //                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}]取料完成,准备送往皮带线。");
                    else
                        LogInfo($"出库 {MoveInfo.SLog}:[{MoveInfo.MoveParam.PosInfo.ToStr()}][{MoveInfo.MoveParam.PosInfoBack.ToStr()}]取料完成,准备送往皮带线。");
                    break;
                case StepEnum.SO_14_GetReels_Ready:
                    if (GetSlidePos(MoveInfo.MoveParam.PosInfo.GetPosSide(), MoveInfo.MoveParam.PosInfo.GetTrayColumn(), out MoveInfo.MoveParam.SlidePos))
                    {
                        MoveInfo.NextMoveStep(StepEnum.SO_15_ToSlideArea);
                        ClearSpecifiedAlarm($"不存在{MoveInfo.MoveParam.PosInfo.PosId}的滑梯位置,请检查配置");
                        LogInfo($"出库 {MoveInfo.SLog}:[{MoveInfo.MoveParam.PosInfo.barcode}]去当前列的滑梯处");
                        ToSlidePos();
                    }
                    else
                    {
                        SetWarnMsg($"不存在{MoveInfo.MoveParam.PosInfo.PosId}的滑梯位置,请检查配置");
                    }
                    break;
                case StepEnum.SO_15_ToSlideArea:
                    if (!CanPutReelIntoLine())
                    {
                        SetWarnMsg($"出库 {MoveInfo.SLog}:皮带线有其他料盘,无法放置该料盘[barcode={MoveInfo.MoveParam.PosInfo.barcode},PosSide={MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    }
                    else
                    {
                        MoveInfo.NextMoveStep(StepEnum.SO_16_VerifyBufferState);
                        BuffAreaOutstoreDoor(true);
                        ClearSpecifiedAlarm($"皮带线有其他料盘,无法放置该料盘");
                        LogInfo($"出库 {MoveInfo.SLog}:皮带线无料盘确认,准备放料[barcode={MoveInfo.MoveParam.PosInfo.barcode}][{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    }
                    break;
                case StepEnum.SO_16_VerifyBufferState:
                    {
                        MoveInfo.NextMoveStep(StepEnum.SO_17_MiddleToSlide);
                        //LogInfo($"出库 {MoveInfo.SLog}:旋转轴转到放料位置[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                        //MiddleToSlidePos();
                    }

                    break;
                case StepEnum.SO_17_MiddleToSlide:
                    if(CanPutReelIntoLine())
                    {
                        MoveInfo.NextMoveStep(StepEnum.SO_18_ReleaseReel);
                        ClearSpecifiedAlarm($"等待皮带线无料盘超时");
                        StartLineRun(MoveInfo.MoveParam);
                        LogInfo($"出库 {MoveInfo.SLog}:松开料盘,移栽压紧轴到压紧前点P2");
                        ComAxis_To_P2();
                    }
                    else if(MoveInfo.IsTimeOut(30))
                    {
                        SetWarnMsg($"等待皮带线无料盘超时");
                    }
                    break;
                case StepEnum.SO_18_ReleaseReel:
                    MoveInfo.NextMoveStep(StepEnum.SO_18_PutReel);
                    LogInfo($"出库 {MoveInfo.SLog}:等待1秒,启动皮带线");
                    //料盘到达仓内皮带线
                    SServerManager.UploadLocInfo(MoveInfo.MoveParam.PosInfo.barcode,LocStatus.ON_INNER_LINE);
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
                    executeTime = (DateTime.Now - startTime).TotalSeconds.ToString("f2");
                    SetBoxStatus(DeviceStatus.OutStoreBoxEnd, RunStatus.Busy, MoveInfo.MoveParam.PosInfo.PosId, MoveInfo.MoveParam.PosInfo.barcode);
                    
                    break;
                case StepEnum.SO_18_PutReel:
                    MoveInfo.NextMoveStep(StepEnum.SO_19_MiddleToP1);
                    LogInfo($"出库 {MoveInfo.SLog}:[{MoveInfo.MoveParam.PosInfo.ToStr()}]料盘到达皮带线[耗时:{(DateTime.Now - startTime).TotalSeconds.ToString("f2")}秒],移栽X轴到待机点P1,行走机构到待机点P1[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    MiddleAxis_To_P1();
                    break;
                case StepEnum.SO_19_MiddleToP1:
                    //if (MoveInfo.MoveParam.PosInfoBack == null)
                    {
                        MoveInfo.NextMoveStep(StepEnum.SO_20_Finish);
                        BothXAxis_To_P1();
                        LogInfo($"出库 {MoveInfo.SLog}:出库结束[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");//另一面料叉无料,
                    }
                    //else
                    //{
                    //    MoveInfo.NextMoveStep(StepEnum.SO_14_GetReels_Ready);
                    //    LogInfo($"出库 {MoveInfo.SLog}:另一面料叉有料,开始出库,准备送往皮带线。料屉升降轴到P1点,移栽升降轴到P1点[{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;
                    //   // PullAxis_UpdownToP1();
                    //    //UpdownAxisToP1();
                    //    //XAxis_To_P1();,移栽X轴到P1点
                    //}
                    break;
                case StepEnum.SO_20_Finish:
                    SetBoxStatus(DeviceStatus.StoreOnline, RunStatus.Runing);
                    MoveInfo.EndMove();
                    AutoInout.InOutEndProcess(this, MoveType.OutStore);
                    break;
            }
        }
        #endregion

    }
}