BoxEquip_InExecute.cs 17.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
    {
        #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.GetPosSide()}], 任务取消");
                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.GetPosSide()}面]");

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

            }
        }
        /// <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_01_Pull_Updown_ToPosition);
                    if (!IsMoveAxisInSafePos())
                    {
                        MoveAxisToP1();
                        LogInfo($"入库 行走机构不在安全位置,先到安全位置={Config.MoveAxis_SafePos}。当前位置{MoveAxis.GetAclPosition()}");
                    }
                    break;
                case StepEnum.SI_01_Pull_Updown_ToPosition:
                    MoveInfo.NextMoveStep(StepEnum.SI_01_MoveAxis_Ready);
                    LogInfo($"入库 {MoveInfo.SLog}:到暂存区入料口," +
                        $"料屉升降轴到P1点,移栽升降轴到上暂存区取料低点P3/P9[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    PullAxis_UpdownToP1();
                    UpdownAxisTo_P3_P9();
                    break;
                case StepEnum.SI_01_MoveAxis_Ready:
                    MoveInfo.NextMoveStep(StepEnum.SI_02_ToBufferArea);
                    LogInfo($"入库 {MoveInfo.SLog}:到暂存区入料口," +
                        $"行走机构到取放点P2,移栽压紧轴到压紧前点P2,移栽旋转轴到取放料水平点P2,移栽X轴到P1[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    MoveAxisToP2();
                    ComAxis_To_P2();
                    MiddleAxis_To_P2();
                    XAxis_To_P1();
                    break;
                case StepEnum.SI_02_ToBufferArea:
                    if (!InDoorCheck(MoveInfo.MoveParam))
                    {
                        SetWarnMsg($" 存储机构-入库 {MoveInfo.SLog}:入口料盘无入库信息[barcode={MoveInfo.MoveParam.PosInfo.barcode},PosSide={MoveInfo.MoveParam.PosInfo.GetPosSide()}], 任务取消");
                        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.GetPosSide()}面]");
                            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}][posId={MoveInfo.MoveParam.PosInfo.PosId}][{MoveInfo.MoveParam.PosInfo.GetPosSide()}面],开始取料");
                    }

                    break;
                case StepEnum.SI_03_VerifyBufferState:
                    MoveInfo.NextMoveStep(StepEnum.SI_04_InOutToBuff);
                    LogInfo($"入库 {MoveInfo.SLog}:移栽X轴到暂存区取放点P2[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    XAxis_To_P2();
                    break;
                case StepEnum.SI_04_InOutToBuff:
                    MoveInfo.NextMoveStep(StepEnum.SI_05_GetReel);
                    LogInfo($"入库 {MoveInfo.SLog}:取料盘,移栽升降轴到上暂存区取料高点P2/P8,移栽压紧轴到压紧点P3");
                    UpdownAxisTo_P2_P8();
                    ComAxis_To_P3();
                    break;
                case StepEnum.SI_05_GetReel:
                    MoveInfo.NextMoveStep(StepEnum.SI_06_InOutBackFromBuff);
                    LogInfo($"入库 {MoveInfo.SLog}:移栽X轴到料屉库位取放料点P3[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    //清空暂存区料盘信息
                   // 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}:取另一面暂存区的料[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                        //    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);
                            MiddleAxis_To_P3();
                            LogInfo($"入库 {MoveInfo.SLog}:另一面无料,移栽旋转轴到料屉库位垂直取放料点P3,直接入库[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                        }
                    }
                    else //另一个料叉已有料,进行入库
                    {
                        MoveInfo.NextMoveStep(StepEnum.SI_07_MiddleToP3);
                        MiddleAxis_To_P3();
                        LogInfo($"入库 {MoveInfo.SLog}:另一个料叉已有料,移栽旋转轴到料屉库位垂直取放料点P3,进行入库[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    }
                    break;

                //去库位点
                case StepEnum.SI_07_MiddleToP3:
                    MoveInfo.NextMoveStep(StepEnum.SI_08_ToPosition);
                    LogInfo($"入库 {MoveInfo.SLog}:运行到库位,移栽升降轴到料屉上方过渡点P6/P12,行走机构到存储库位取放点位P3," +
                        $"料斗拉取升降轴到料屉提取低点P4[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    MoveAxisToP3();
                    PullAxis_UpdownToLowP4();
                    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.GetPosSide()}面]");
                        ToTray();
                        IgnoreCamDect = false;
                    }
                    break;
                case StepEnum.SI_09_ToTray:
                    MoveInfo.NextMoveStep(StepEnum.SI_10_LiftTray);
                    LogInfo($"入库 {MoveInfo.SLog}:提升抽屉,料斗拉取升降轴到料屉提取高点P3[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    PullAxis_UpdownToHighP3();
                    break;
                case StepEnum.SI_10_LiftTray:
                    MoveInfo.NextMoveStep(StepEnum.SI_11_PullTray);
                    LogInfo($"入库 {MoveInfo.SLog}:拉抽屉到库位点,料斗拉取进出轴到料屉库位点P3/P5[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    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.GetPosSide()}面]");
                    PullAxis_UpdownToMiddleP2();
                    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.GetPosSide()}面]");
                    UpdownAxisToP7_P13();
                    break;
                case StepEnum.SI_13_GetReel:
                    MoveInfo.NextMoveStep(StepEnum.SI_14_ReleaseCompress);
                    LogInfo($"入库 {MoveInfo.SLog}:压紧轴开始缓慢释放,移栽压紧轴到压紧前点P2[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    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.GetPosSide()}面]");
                    //入库完成
                    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.GetPosSide()}面]");
                    PullAxis_UpdownToHighP3();
                    break;
                case StepEnum.SI_16_LiftTray:
                    MoveInfo.NextMoveStep(StepEnum.SI_17_PushTray);
                    LogInfo($"入库 {MoveInfo.SLog}:推到抽屉提取点,料斗拉取进出轴到料屉提取点P2[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    PullAxis_Inout_To_P2_P4();
                    break;
                case StepEnum.SI_17_PushTray:
                    MoveInfo.NextMoveStep(StepEnum.SI_18_PutTrayMiddle);
                    PullAxis_UpdownToMiddleP2();
                    if (CheckASide())
                    {
                        LogInfo($"入库 {MoveInfo.SLog}:料斗拉取升降轴到料屉水平点P2,同时检测{trayAColumns[GetPosColumn()]}=1[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                        MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(trayAColumns[GetPosColumn()], IO_VALUE.HIGH));
                    }
                    else
                    {
                        LogInfo($"入库 {MoveInfo.SLog}:料斗拉取升降轴到料屉水平点P2,同时检测{trayBColumns[GetPosColumn()]} = 1[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                        MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(trayBColumns[GetPosColumn()], IO_VALUE.HIGH));
                    }
                    break;
                case StepEnum.SI_18_PutTrayMiddle:
                    MoveInfo.NextMoveStep(StepEnum.SI_18_PutTrayDown);
                    LogInfo($"入库 {MoveInfo.SLog}:放下料屉,料斗拉取升降轴到料屉提取低点P4[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    PullAxis_UpdownToLowP4();
                    break;
                case StepEnum.SI_18_PutTrayDown:
                    MoveInfo.NextMoveStep(StepEnum.SI_19_InoutBack);
                    LogInfo($"入库 {MoveInfo.SLog}:料斗拉取进出轴到待机点P1[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    PullAxis_Inout_To_P1();
                    break;
                case StepEnum.SI_19_InoutBack:

                    if (!CheckInStoreOtherSideInfo())
                    {
                        SetBoxStatus(DeviceStatus.StoreOnline, RunStatus.Runing);
                        MoveInfo.EndMove();
                        AutoInout.InOutEndProcess(this, MoveType.InStore);
                        LogInfo($"入库 {MoveInfo.SLog}:入库结束[{MoveInfo.MoveParam.PosInfo.PosId}][{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    }
                    else
                    {
                        MoveInfo.NextMoveStep(StepEnum.SI_07_MiddleToP3);
                        LogInfo($"入库 {MoveInfo.SLog}:从{MoveInfo.MoveParam.PosInfo.GetPosSide()}面切换到另一面入库[{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

    }
}