BoxEquip_InExecute_Partial.cs 11.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 入库,两侧都有料    
        private void BothComAxis_To_P2(bool isdebugSpeed = false)
        {
            if (isdebugSpeed)
            {
                ComAxis_A.AbsMove(MoveInfo, MoveInfo.MoveParam.MoveP.ComAxis_AB_P2, Config.ComAxis_FindPosSpeed);
                ComAxis_B.AbsMove(MoveInfo, MoveInfo.MoveParam.MoveP.ComAxis_AB_P2, Config.ComAxis_FindPosSpeed);
            }

            else
            {
                ComAxis_A.AbsMove(MoveInfo, MoveInfo.MoveParam.MoveP.ComAxis_AB_P2, Config.ComAxis_A_P2_Speed);
                ComAxis_B.AbsMove(MoveInfo, MoveInfo.MoveParam.MoveP.ComAxis_AB_P2, Config.ComAxis_B_P2_Speed);
            }
        }
        private void BothMiddleAxis_To_P2(bool isdebugSpeed = false)
        {
            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));
            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));
        }
        private void BothXAxis_To_P1(bool isdebugSpeed = false)
        {
            if (!XAxis_A.IsInPosition(Config.XAxis_A_P1))
            {
                if (isdebugSpeed)
                    XAxis_A.AbsMove(MoveInfo, Config.XAxis_A_P1, Config.XAxis_FindPosSpeed);
                else
                    XAxis_A.AbsMove(MoveInfo, Config.XAxis_A_P1, Config.XAxis_A_P1_Speed);
            }
            if (!XAxis_B.IsInPosition(Config.XAxis_B_P1))
            {
                if (isdebugSpeed)
                    XAxis_B.AbsMove(MoveInfo, Config.XAxis_B_P1, Config.XAxis_FindPosSpeed);
                else
                    XAxis_B.AbsMove(MoveInfo, Config.XAxis_B_P1, Config.XAxis_B_P1_Speed);
            }
        }
        private bool InDoorBothCheck(InOutParam param)
        {
            if (param.PosInfo == null)
                return false;
            if (param.PosInfoBack == null)
                return false;
            if (param.PosInfo != null)
            {
                if (param.PosInfoBack != null)
                {
                    return true;
                }
            }

            return false;
        }
        private void BothXAxis_To_P2(bool isdebugSpeed = false)
        {
            if (isdebugSpeed)
                XAxis_B.AbsMove(MoveInfo, Config.XAxis_B_P2, Config.XAxis_FindPosSpeed);
            else
                XAxis_B.AbsMove(MoveInfo, Config.XAxis_B_P2, Config.XAxis_B_P2_Speed);
            if (isdebugSpeed)
                XAxis_A.AbsMove(MoveInfo, Config.XAxis_A_P2, Config.XAxis_FindPosSpeed);
            else
                XAxis_A.AbsMove(MoveInfo, Config.XAxis_A_P2, Config.XAxis_A_P2_Speed);
        }
        private void AddBothReelCheck(bool hasReel)
        {
            //if (CheckASide())
            //{
            //    MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.ForkA_Tray_Check, hasReel ? IO_VALUE.HIGH : IO_VALUE.LOW));
            //}
            //else
            //{
            //    MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.ForkB_Tray_Check, hasReel ? IO_VALUE.HIGH : IO_VALUE.LOW));
            //}
        }
        private void BothComAxis_To_P3(bool isdebugSpeed = false)
        {
            int diff = 0;
            BoxPosition position = CSVPositionReader<BoxPosition>.GetPositon(MoveInfo.MoveParam.PosInfo.PosId);
            if (position != null)
            {
                diff = position.BagHigh - MoveInfo.MoveParam.PosInfo.PlateH;
                if (diff < 0) diff = 0;
                LogInfo($"{MoveInfo.MoveParam.PosInfo.PosId}库位高度:{position.BagHigh},料盘高度:{MoveInfo.MoveParam.PosInfo.PlateH},差值:{diff},系数:{comAxis_offset}," +
                    $"实际值:{MoveInfo.MoveParam.MoveP.ComAxis_AB_P3 + diff * comAxis_offset}={MoveInfo.MoveParam.MoveP.ComAxis_AB_P3}加{diff * comAxis_offset}");
            }
            int target = MoveInfo.MoveParam.MoveP.ComAxis_AB_P3 + diff * comAxis_offset;
            if (isdebugSpeed)
                ComAxis_A.AbsMove(MoveInfo, target, Config.ComAxis_FindPosSpeed);
            else
                ComAxis_A.AbsMove(MoveInfo, target, Config.ComAxis_A_P3_Speed);

            diff = 0;
            LineMoveP movep = new LineMoveP(Config, MoveInfo.MoveParam.PosInfoBack.PosId);
            BoxPosition position1 = CSVPositionReader<BoxPosition>.GetPositon(MoveInfo.MoveParam.PosInfoBack.PosId);
            if (position1 != null)
            {
                diff = position1.BagHigh - MoveInfo.MoveParam.PosInfoBack.PlateH;
                if (diff < 0) diff = 0;
                LogInfo($"{MoveInfo.MoveParam.PosInfoBack.PosId}库位高度:{position1.BagHigh},料盘高度:{MoveInfo.MoveParam.PosInfoBack.PlateH},差值:{diff}," +
                    $"实际值:{movep.ComAxis_AB_P3 + diff * comAxis_offset}={movep.ComAxis_AB_P3}加{diff * comAxis_offset}");
            }
            target = movep.ComAxis_AB_P3 + diff * comAxis_offset;
            if (isdebugSpeed)
                ComAxis_B.AbsMove(MoveInfo, target, Config.ComAxis_FindPosSpeed);
            else
                ComAxis_B.AbsMove(MoveInfo, target, Config.ComAxis_B_P3_Speed);
        }
        private void BothXAxis_To_P3(bool isdebugSpeed = false)
        {
            if (isdebugSpeed)
                XAxis_A.AbsMove(MoveInfo, MoveInfo.MoveParam.MoveP.XAxis_AB_P3, Config.XAxis_FindPosSpeed);
            else
                XAxis_A.AbsMove(MoveInfo, MoveInfo.MoveParam.MoveP.XAxis_AB_P3, Config.XAxis_A_P3_Speed);
            if (isdebugSpeed)
                XAxis_B.AbsMove(MoveInfo, MoveInfo.MoveParam.MoveP.XAxis_AB_P3, Config.XAxis_FindPosSpeed);
            else
                XAxis_B.AbsMove(MoveInfo, MoveInfo.MoveParam.MoveP.XAxis_AB_P3, Config.XAxis_B_P3_Speed);
        }
        private void ClearInDoorBothBuffer()
        {
            BufferDataManager.AInStoreInfo = null;
            BufferDataManager.BInStoreInfo = null;
            LogInfo($"入库 {MoveInfo.SLog}:取料完成,清除该暂存区的料盘信息[barcode={MoveInfo.MoveParam.PosInfo.barcode}][barcode={MoveInfo.MoveParam.PosInfoBack.barcode}]");
        }
        private void InstoreBothSideExecute()
        {
            switch (MoveInfo.MoveStep)
            {
                case StepEnum.SIB_00_StartInstore:
                    PullAxisToP1("入库");
                    break;
                case StepEnum.SIB_01_PullAxis_Ready:
                    SetBoxStatus(DeviceStatus.InStoreExecute, RunStatus.Busy, MoveInfo.MoveParam.PosInfo.PosId, MoveInfo.MoveParam.PosInfo.barcode);
                    MoveInfo.NextMoveStep(StepEnum.SIB_01_Pull_Updown_ToPosition);
                    if (!IsMoveAxisInSafePos())
                    {
                        MoveAxisToSafePos();
                        LogInfo($"入库 {MoveInfo.SLog}:行走机构不在安全位置,先到安全位置={Config.MoveAxis_SafePos}。当前位置{MoveAxis.GetAclPosition()}");
                    }
                    break;
                case StepEnum.SIB_01_Pull_Updown_ToPosition:
                    MoveInfo.NextMoveStep(StepEnum.SIB_01_MoveAxis_Ready);
                    LogInfo($"入库 {MoveInfo.SLog}:到暂存区入料口," +
                        $"行走机构到待机点P1,料斗升降轴到P1点,移栽升降轴到上暂存区入库取料低点P3/P9,移栽压紧轴到压紧前点P2,移栽旋转轴到取放料水平点P2,移栽X轴到P1,料斗升降轴到P1点[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    MoveAxisToP1();
                    PullAxis_UpdownToP1();
                    UpdownAxisTo_P3_P9();
                    BothComAxis_To_P2();
                    BothMiddleAxis_To_P2();
                    BothXAxis_To_P1();
                    //BuffAreaInstoreDoor(true);
                    break;
                case StepEnum.SIB_01_MoveAxis_Ready:
                    MoveInfo.NextMoveStep(StepEnum.SIB_02_ToBufferArea);
                    startTime = DateTime.Now;
                    break;
                case StepEnum.SIB_02_ToBufferArea:
                    if (!InDoorBothCheck(MoveInfo.MoveParam))
                    {
                        BuffAreaInstoreDoor(false);
                        SetWarnMsg($"入库 {MoveInfo.SLog}:AB入口料盘无入库信息, 任务取消");
                        LogInfo($"入库 {MoveInfo.SLog}:AB入口料盘因无入库信息,结束入库");
                        SetBoxStatus(DeviceStatus.StoreOnline, RunStatus.Runing);
                        Alarm(AlarmType.None);
                        MoveInfo.EndMove();
                    }
                    else
                    {
                        MoveInfo.NextMoveStep(StepEnum.SIB_03_VerifyBufferState);
                        BuffAreaInstoreDoor(true);
                        LogInfo($"入库 {MoveInfo.SLog}:AB入料口入库信息确认,[barcode={MoveInfo.MoveParam.PosInfo.barcode},posId={MoveInfo.MoveParam.PosInfo.PosId}][barcode={MoveInfo.MoveParam.PosInfoBack.barcode},posId={MoveInfo.MoveParam.PosInfoBack.PosId}],开始取料");
                    }
                    break;
                case StepEnum.SIB_03_VerifyBufferState:
                    if (!CheckInputMiddleAxisInBuff())
                    {
                        MoveInfo.NextMoveStep(StepEnum.SIB_04_InOutToBuff);
                        LogInfo($"入库 {MoveInfo.SLog}:移栽X轴到暂存区取放点P2,行走机构到取放点P2");
                        BothXAxis_To_P2();
                        MoveAxisToP2();
                    }
                    else if (MoveInfo.IsTimeOut())
                    {
                        SetWarnMsg($"等待上料机构旋转轴离开暂存区超时");
                    }
                    break;
                case StepEnum.SIB_04_InOutToBuff:
                    MoveInfo.NextMoveStep(StepEnum.SIB_05_GetReel);
                    LogInfo($"入库 {MoveInfo.SLog}:取料盘,移栽升降轴到上暂存区入库取料高点P2/P8,移栽压紧轴到压紧点P3");
                    AddBothReelCheck(true);
                    UpdownAxisTo_P2_P8();
                    BothComAxis_To_P3();
                    break;
                case StepEnum.SIB_05_GetReel:
                    MoveInfo.NextMoveStep(StepEnum.SIB_06_InOutBackToP1FromBuff);
                    LogInfo($"入库 {MoveInfo.SLog}:移栽X轴到库位取放点P3,行走机构到待机点P1");
                    // XAxis_To_P1();
                    BothXAxis_To_P3();
                    MoveAxisToP1();
                    break;
                case StepEnum.SIB_06_InOutBackToP1FromBuff:
                    MoveInfo.NextMoveStep(StepEnum.SIB_06_ClearBuffInfo);
                    //LogInfo($"入库 {MoveInfo.SLog}:移栽X轴到料屉库位取放料点P3[{MoveInfo.MoveParam.PosInfo.GetPosSide()}面]");
                    //清空暂存区料盘信息
                    ClearInDoorBothBuffer();
                    break;

                case StepEnum.SIB_06_ClearBuffInfo:
                    {
                        MoveInfo.NextMoveStep(StepEnum.SI_07_MiddleToP3);
                        //MiddleAxis_To_P3();
                        BuffAreaInstoreDoor(false);
                        LogInfo($"入库 {MoveInfo.SLog}:对两侧料盘进行入库");//移栽旋转轴到料屉库位垂直取放料点P3
                    }
                    break;
            }
        }
        #endregion

    }
}