BoxEquip_InExecute.cs 18.7 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
    {
        #region 入库
        /// <summary>
        /// 检查另一个料叉上是否有料,有料则开始入库
        /// </summary>
        /// <returns></returns>
        private bool CheckInStoreOtherSideInfo()
        {
            if(MoveInfo.MoveParam.PosInfoBack !=null)
            {
                return true;
            }
            return false;
        }
        /// <summary>
        /// 料屉行
        /// </summary>
        /// <returns></returns>
        private int GetPosRow()
        {
            return MoveInfo.MoveParam.PosInfo.GetTrayRow();
        }
        /// <summary>
        /// 料屉列
        /// </summary>
        /// <returns></returns>
        private int GetPosColumn()
        {
            return MoveInfo.MoveParam.PosInfo.GetTrayColumn();
        }
        /// <summary>
        /// 入库前料盘信息检查
        /// </summary>
        /// <param name="param"></param>
        /// <returns></returns>
        private bool PreInStoreCheck(InOutParam param)
        {
            if (!AutoInout.autoNext && InDoorCheck(param))
            {
                SetWarnMsg(Name + $" 启动入库出错,入口料盘无入库信息[barcode={param.PosInfo.barcode},PosSide={param.PosInfo.PosSide}], 任务取消");
                SServerManager.cancelPutInTask(Name, param.PosInfo.barcode);
                return false;
            }

            if (!param.PosInfo.CheckPosition())
            {
                LogUtil.error(Name + " 启动入库【" + param.PosInfo.ToStr() + "】出错,找不到库位信息");
                return false;
            }
            if (AutoInout.autoNext)
            {
                LogInfo(" 循环测试入库, 不做入库验证. ");
                return true;
            }
            else
            {
                if (!ReviceInStoreCMD(param.PosInfo.PosId, param.PosInfo.PlateH, param.PosInfo.PlateW, param.PosInfo.barcode))
                {
                    LogUtil.error($" 入库验证失败:{param.PosInfo.ToStr()}");
                    return false;
                }
            }
            return true;
        }

        /// <summary>
        /// 清除入料暂存区的料盘信息
        /// </summary>
        private void ClearInDoorBuffer()
        {
            if(MoveInfo.MoveParam.PosInfo.PosId.Equals(BufferDataManager.AInStoreInfo.PosId))
            {
                BufferDataManager.AInStoreInfo = null;
                LogInfo($"存储机构-入库 {MoveInfo.SLog}:取料完成,清除该暂存区的料盘信息[barcode={MoveInfo.MoveParam.PosInfo.barcode}][{MoveInfo.MoveParam.PosInfo.PosSide}面]");

            }
            else if(MoveInfo.MoveParam.PosInfo.PosId.Equals(BufferDataManager.BInStoreInfo.PosId))
            {
                BufferDataManager.BInStoreInfo = null;
                LogInfo($"存储机构-入库 {MoveInfo.SLog}:取料完成,清除该暂存区的料盘信息[barcode={MoveInfo.MoveParam.PosInfo.barcode}][{MoveInfo.MoveParam.PosInfo.PosSide}面]");

            }
        }
        /// <summary>
        /// 检查另一边暂存区是否存在入库的料
        /// </summary>
        /// <returns></returns>
        private bool CheckOtherSideIsThereReel(out InOutPosInfo inOutPosInfo)
        {
            inOutPosInfo = null;
            if (CheckASide())
            {                
                if (InDoorCheck(new InOutParam(BufferDataManager.AInStoreInfo)))
                {
                    inOutPosInfo= BufferDataManager.AInStoreInfo.ToCopy();
                    return true;
                }

            }
            else
            {
                if (InDoorCheck(new InOutParam(BufferDataManager.BInStoreInfo)))
                {
                    inOutPosInfo = BufferDataManager.BInStoreInfo.ToCopy();
                    return true;
                }

            }
            return false;
        }
        private void InstoreExecute()
        {
            switch (MoveInfo.MoveStep)
            {
                case StepEnum.SI_00_StartInstore:
                    PullAxisToP1("入库");
                    break;
                case StepEnum.SI_01_PullAxis_Ready:
                    SetBoxStatus(DeviceStatus.InStoreExecute, RunStatus.Busy);
                    MoveInfo.NextMoveStep(StepEnum.SI_02_ToBufferArea);
                    LogInfo($"存储机构-入库 {MoveInfo.SLog}:到暂存区入料口," +
                        $"行走机构到进出料机构取放点P2,移栽升降轴到上暂存区取料低点P3/P9,移栽压紧轴到压紧前点P2,移栽旋转轴到进出料暂存区取放料水平点P2[{MoveInfo.MoveParam.PosInfo.PosSide}面]");
                    MoveAxis.AbsMove(MoveInfo, Config.MoveAxis_P2, Config.MoveAxis_P2_Speed);
                    if (CheckASide())
                    {
                        UpdownAxis.AbsMove(MoveInfo, Config.Updown_P3, Config.Updown_P3_Speed);
                        ComAxis_A.AbsMove(MoveInfo, MoveInfo.MoveParam.MoveP.ComAxis_AB_P2, Config.ComAxis_A_P2_Speed);
                        MiddleAxis_A.AbsMove(MoveInfo, Config.MiddleAxis_A_P2, Config.MiddleAxis_A_P2_Speed);
                        MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.AHorizontal_Check, IO_VALUE.HIGH));
                    }
                    else
                    {
                        UpdownAxis.AbsMove(MoveInfo, Config.Updown_P9, Config.Updown_P9_Speed);
                        ComAxis_B.AbsMove(MoveInfo, MoveInfo.MoveParam.MoveP.ComAxis_AB_P2, Config.ComAxis_B_P2_Speed);
                        MiddleAxis_B.AbsMove(MoveInfo, Config.MiddleAxis_B_P2, Config.MiddleAxis_B_P2_Speed);
                        MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.BHorizontal_Check, IO_VALUE.HIGH));
                    }
                    break;
                case StepEnum.SI_02_ToBufferArea:
                    if (!InDoorCheck(MoveInfo.MoveParam))
                    {
                        SetWarnMsg($" 存储机构-入库 {MoveInfo.SLog}:入口料盘无入库信息[barcode={MoveInfo.MoveParam.PosInfo.barcode},PosSide={MoveInfo.MoveParam.PosInfo.PosSide}], 任务取消");
                        if (MoveInfo.MoveParam.PosInfoBack == null)
                        {
                            LogInfo($"存储机构-入库 {MoveInfo.SLog}:入口料盘因无入库信息且AB面料叉无料,结束入库");
                            SetBoxStatus(DeviceStatus.None, RunStatus.Runing);
                            MoveInfo.EndMove();
                        }
                        else if (MoveInfo.MoveParam.PosInfoBack != null)//料叉有料,忽略当前入料口,直接入库
                        {
                            MoveInfo.NextMoveStep(StepEnum.SI_07_MiddleToP3);
                            LogInfo($"存储机构-入库 {MoveInfo.SLog}:入口料盘无入库信息,另一面料叉有料。先将当前移栽旋转轴到料屉库位垂直取放料点P3,然后对另一面入库[{MoveInfo.MoveParam.PosInfo.PosSide}面]");
                            MiddleAxis_To_P3();
                            MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                            MoveInfo.MoveParam.PosInfo = MoveInfo.MoveParam.PosInfoBack.ToCopy();
                            MoveInfo.MoveParam.MoveP = new LineMoveP(Config, MoveInfo.MoveParam.PosInfo.PosId);
                            MoveInfo.MoveParam.PosInfoBack = null;
                        }
                    }
                    else
                    {
                        MoveInfo.NextMoveStep(StepEnum.SI_03_VerifyBufferState);
                        LogInfo($"存储机构-入库 {MoveInfo.SLog}:入料口入库信息确认[barcode={MoveInfo.MoveParam.PosInfo.barcode}][{MoveInfo.MoveParam.PosInfo.PosSide}面],开始取料");
                    }

                    break;
                case StepEnum.SI_03_VerifyBufferState:
                    MoveInfo.NextMoveStep(StepEnum.SI_04_InOutToBuff);
                    LogInfo($"存储机构-入库 {MoveInfo.SLog}:移栽X轴到进出料暂存区取放点P2[{MoveInfo.MoveParam.PosInfo.PosSide}面]");
                    XAxis_To_P2();
                    break;
                case StepEnum.SI_04_InOutToBuff:
                    MoveInfo.NextMoveStep(StepEnum.SI_05_GetReel);
                    LogInfo($"存储机构-入库 {MoveInfo.SLog}:取料盘,移栽升降轴到上暂存区取料高点P2/P8,移栽压紧轴到压紧点P3");
                    if (CheckASide())
                    {
                        UpdownAxis.AbsMove(MoveInfo, Config.Updown_P2, Config.Updown_P2_Speed);
                        ComAxis_A.AbsMove(MoveInfo, MoveInfo.MoveParam.MoveP.ComAxis_AB_P3, Config.ComAxis_A_P3_Speed);
                    }
                    else
                    {
                        UpdownAxis.AbsMove(MoveInfo, Config.Updown_P8, Config.Updown_P8_Speed);
                        ComAxis_B.AbsMove(MoveInfo, MoveInfo.MoveParam.MoveP.ComAxis_AB_P3, Config.ComAxis_B_P3_Speed);
                    }
                    break;
                case StepEnum.SI_05_GetReel:
                    MoveInfo.NextMoveStep(StepEnum.SI_06_InOutBackFromBuff);
                    LogInfo($"存储机构-入库 {MoveInfo.SLog}:移栽X轴到料屉库位取放料点P3[{MoveInfo.MoveParam.PosInfo.PosSide}面]");
                    //清空暂存区料盘信息
                    ClearInDoorBuffer();
                    XAxis_To_P3();
                    break;
                case StepEnum.SI_06_InOutBackFromBuff:

                    //存储当前料叉信息
                    if (MoveInfo.MoveParam.PosInfoBack == null)
                    {
                        if(CheckOtherSideIsThereReel(out InOutPosInfo inOutPosInfo))
                        {
                            MoveInfo.NextMoveStep(StepEnum.SI_01_PullAxis_Ready);
                            LogInfo($"存储机构-入库 {MoveInfo.SLog}:移栽旋转轴到料屉库位垂直取放料点P3,取另一面暂存区的料[{MoveInfo.MoveParam.PosInfo.PosSide}面]");
                            MiddleAxis_To_P3();
                            MoveInfo.MoveParam.PosInfoBack = MoveInfo.MoveParam.PosInfo.ToCopy();
                            MoveInfo.MoveParam.PosInfo = inOutPosInfo;
                            MoveInfo.MoveParam.MoveP = new LineMoveP(Config, inOutPosInfo.PosId);

                        }
                        else
                        {
                            MoveInfo.NextMoveStep(StepEnum.SI_07_MiddleToP3);
                            LogInfo($"存储机构-入库 {MoveInfo.SLog}:移栽旋转轴到料屉库位垂直取放料点P3[{MoveInfo.MoveParam.PosInfo.PosSide}面]");
                            MiddleAxis_To_P3();
                        }
                    }
                    else //另一个料叉已有料,进行入库
                    {
                        MoveInfo.NextMoveStep(StepEnum.SI_07_MiddleToP3);
                        LogInfo($"存储机构-入库 {MoveInfo.SLog}:移栽旋转轴到料屉库位垂直取放料点P3[{MoveInfo.MoveParam.PosInfo.PosSide}面]");
                        MiddleAxis_To_P3();
                    }
                    break;

                //去库位点
                case StepEnum.SI_07_MiddleToP3:
                    MoveInfo.NextMoveStep(StepEnum.SI_08_ToPosition);
                    LogInfo($"存储机构-入库 {MoveInfo.SLog}:运行到库位,移栽升降轴到料屉上方过渡点P6/P12,行走机构到存储库位取放点位P3," +
                        $"料斗拉取升降轴到料屉提取低点P4[{MoveInfo.MoveParam.PosInfo.PosSide}面]");
                    MoveAxis.AbsMove(MoveInfo, MoveInfo.MoveParam.MoveP.MoveAxis_P3, Config.MoveAxis_P3_Speed);
                    PullAxis_Updown.AbsMove(MoveInfo, MoveInfo.MoveParam.MoveP.PullAxis_Updown_P4, Config.PullAxis_Updown_P4_Speed);
                    UpdownAxisTo_P6_P12();
                    break;
                case StepEnum.SI_08_ToPosition:
                    if(CamCheckReelPosition())
                    {
                        MoveInfo.NextMoveStep(StepEnum.SI_09_ToTray);
                        LogInfo($"存储机构-入库 {MoveInfo.SLog}:到抽屉提取点,料斗拉取进出轴到料屉提取点P2/P4[{MoveInfo.MoveParam.PosInfo.PosSide}面]");
                        ToTray();
                        IgnoreCamDect = false;
                    }
                    break;
                case StepEnum.SI_09_ToTray:
                    MoveInfo.NextMoveStep(StepEnum.SI_10_LiftTray);
                    LogInfo($"存储机构-入库 {MoveInfo.SLog}:提升抽屉,料斗拉取升降轴到料屉提取高点P3[{MoveInfo.MoveParam.PosInfo.PosSide}面]");
                    PullAxis_UpdownToP3();
                    break;
                case StepEnum.SI_10_LiftTray:
                    MoveInfo.NextMoveStep(StepEnum.SI_11_PullTray);
                    LogInfo($"存储机构-入库 {MoveInfo.SLog}:拉抽屉到库位点,料斗拉取进出轴到料屉库位点P3/P5[{MoveInfo.MoveParam.PosInfo.PosSide}面]");
                    PullAxis_Inout_To_P3_P5();
                    break;
                case StepEnum.SI_11_PullTray:
                    MoveInfo.NextMoveStep(StepEnum.SI_12_DropTrayToPos);
                    LogInfo($"存储机构-入库 {MoveInfo.SLog}:将抽屉降到库位提取点,料斗拉取升降轴到P2料屉提取水平点P2,到位后检测{trayRows[GetPosRow()]}=1[{MoveInfo.MoveParam.PosInfo.PosSide}面]");
                    PullAxis_Updown.AbsMove(MoveInfo, Config.PullAxis_Updown_P2, Config.PullAxis_Updown_P2_Speed);
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(trayRows[GetPosRow()], IO_VALUE.HIGH));
                    break;
                case StepEnum.SI_12_DropTrayToPos:
                    MoveInfo.NextMoveStep(StepEnum.SI_13_GetReel);
                    LogInfo($"存储机构-入库 {MoveInfo.SLog}:进入库位中,移栽升降轴到料屉取放点P7/P13[{MoveInfo.MoveParam.PosInfo.PosSide}面]");
                    UpdownAxisToP7_P13();
                    break;
                case StepEnum.SI_13_GetReel:
                    MoveInfo.NextMoveStep(StepEnum.SI_14_ReleaseCompress);
                    LogInfo($"存储机构-入库 {MoveInfo.SLog}:压紧轴开始缓慢释放,移栽压紧轴到压紧前点P2[{MoveInfo.MoveParam.PosInfo.PosSide}面]");
                    ComAxis_To_P2();
                    break;
                case StepEnum.SI_14_ReleaseCompress:
                    MoveInfo.NextMoveStep(StepEnum.SI_15_UpDownBack);
                    LogInfo($"存储机构-入库 {MoveInfo.SLog}:叉子从库位返回,[{MoveInfo.MoveParam.PosInfo.ToStr()}]入库完成,移栽升降轴到料屉上方过度点P6/P12[{MoveInfo.MoveParam.PosInfo.PosSide}面]");
                    //入库完成
                    SetBoxStatus(DeviceStatus.InStoreEnd, RunStatus.Busy);
                    UpdownAxisTo_P6_P12();
                    break;
                case StepEnum.SI_15_UpDownBack:
                    MoveInfo.NextMoveStep(StepEnum.SI_16_LiftTray);
                    LogInfo($"存储机构-入库 {MoveInfo.SLog}:提升抽屉,料斗拉取升降轴到料屉提取高点P3[{MoveInfo.MoveParam.PosInfo.PosSide}面]");
                    PullAxis_Updown.AbsMove(MoveInfo, MoveInfo.MoveParam.MoveP.PullAxis_Updown_P3, Config.PullAxis_Updown_P3_Speed);
                    break;
                case StepEnum.SI_16_LiftTray:
                    MoveInfo.NextMoveStep(StepEnum.SI_17_PushTray);
                    if (CheckASide())
                    {
                        LogInfo($"存储机构-入库 {MoveInfo.SLog}:推到抽屉提取点,料斗拉取进出轴到料屉提取点P2,同时检测{trayAColumns[GetPosColumn()]}=1[{MoveInfo.MoveParam.PosInfo.PosSide}面]");
                        PullAxis_Inout.AbsMove(MoveInfo, MoveInfo.MoveParam.MoveP.PullAxis_Inout_P2_P4, Config.PullAxis_Inout_P2_Speed);
                        MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(trayAColumns[GetPosColumn()], IO_VALUE.HIGH));
                    }
                    else
                    {
                        LogInfo($"存储机构-入库 {MoveInfo.SLog}:推到抽屉提取点,料斗拉取进出轴到料屉提取点P2,同时检测{trayBColumns[GetPosColumn()]} = 1[{MoveInfo.MoveParam.PosInfo.PosSide}面]");
                        PullAxis_Inout.AbsMove(MoveInfo, MoveInfo.MoveParam.MoveP.PullAxis_Inout_P2_P4, Config.PullAxis_Inout_P4_Speed);
                        MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(trayBColumns[GetPosColumn()], IO_VALUE.HIGH));
                    }
                    break;
                case StepEnum.SI_17_PushTray:
                    MoveInfo.NextMoveStep(StepEnum.SI_18_PutTrayDown);
                    LogInfo($"存储机构-入库 {MoveInfo.SLog}:放下料屉,料斗拉取升降轴到料屉提取低点P4[{MoveInfo.MoveParam.PosInfo.PosSide}面]");
                    PullAxis_Updown.AbsMove(MoveInfo, MoveInfo.MoveParam.MoveP.PullAxis_Updown_P4, Config.PullAxis_Updown_P4_Speed);
                    break;
                case StepEnum.SI_18_PutTrayDown:
                    MoveInfo.NextMoveStep(StepEnum.SI_19_InoutBack);
                    LogInfo($"存储机构-入库 {MoveInfo.SLog}:料斗拉取进出轴到待机点P1[{MoveInfo.MoveParam.PosInfo.PosSide}面]");
                    PullAxis_Inout.AbsMove(MoveInfo, Config.PullAxis_Inout_P1, Config.PullAxis_Inout_P1_Speed);
                    break;
                case StepEnum.SI_19_InoutBack:

                    if (!CheckInStoreOtherSideInfo())
                    {
                        SetBoxStatus(DeviceStatus.StoreOnline, RunStatus.Runing);
                        MoveInfo.EndMove();
                        AutoInout.InOutEndProcess(this, MoveType.InStore);
                    }
                    else
                    {
                        MoveInfo.NextMoveStep(StepEnum.SI_07_MiddleToP3);
                        LogInfo($"存储机构-入库 {MoveInfo.SLog}:从{MoveInfo.MoveParam.PosInfo.PosSide}面切换到另一面入库[{MoveInfo.MoveParam.PosInfoBack.barcode}]");
                        MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                        MoveInfo.MoveParam.PosInfo = MoveInfo.MoveParam.PosInfoBack.ToCopy();
                        MoveInfo.MoveParam.MoveP = new LineMoveP(Config, MoveInfo.MoveParam.PosInfo.PosId);
                        MoveInfo.MoveParam.PosInfoBack = null;

                    }
                    break;
            }
        }
        #endregion

    }
}