ReelTransport.cs 12.6 KB
using OnlineStore; 
using OnlineStore.LoadCSVLibrary;
using System; 

namespace DeviceLibrary
{
    class ReelTransport
    {
        Robot_Config Config;
        BoxStorePosition From;
        public BoxStorePosition To;
        BoxStorePosition Fix;
        MainMachine mainMachine; 
        AxisBean Middle_Axis;
        AxisBean UpDown_Axis;
        AxisBean InOut_Axis;
        AxisBean Comp_Axis;
        MoveInfo MoveInfo;
        public string ErrMsgTxt = "";

        public bool IgnoreX09 = false;

        public event Action<string, StoreMoveType, bool> InOutEndProcessEvent;
        public bool IsComplateOrFree { get => MoveInfo.MoveStep == MoveStep.Wait && !movelock; }
        public bool IsTakedReel { get => MoveInfo.MoveStep >= MoveStep.TS10_IOCheck; }
        public bool IsPutOnOut { get => MoveInfo.MoveStep >= MoveStep.TS16_Check; }


        public ReelTransport(Robot_Config _Config, MainMachine _mainMachine)
        {
            Config = _Config;
            mainMachine = _mainMachine;
            MoveInfo = new MoveInfo(crc.GetString("Res0123", "取放料机构"), false);
            To = null;
            From = null;
            #region 初始化伺服轴
            Middle_Axis = _mainMachine.Middle_Axis;
            UpDown_Axis = _mainMachine.UpDown_Axis;
            InOut_Axis = _mainMachine.InOut_Axis;
            Comp_Axis = _mainMachine.Comp_Axis;

            #endregion
        }
        public void Reset()
        {
            MoveInfo.NewMove(MoveStep.Wait);
            MoveInfo.log("执行重置");
            To = null;
            From = null;
            pause = false;
        }
        StoreMoveType storeMoveType = StoreMoveType.None;
        string WareCode = "";
        int plateH = 0;
        bool PreMove = false;
        public bool Start(BoxStorePosition from, BoxStorePosition to, StoreMoveType _storeMoveType, bool premove = false)
        {

            if (MoveInfo.MoveStep != MoveStep.Wait)
                return false;

            pause = false;
            storeMoveType = _storeMoveType;
            PreMove = premove;
            if (from == null)
            {
                WareCode = "NG";
                plateH = 56;
                To = to.clone();
                MoveInfo.NewMove(MoveStep.TS10_IOCheck);
                MoveInfo.log($"{storeMoveType}:开始运输料盘,直接到:{to.posid}");
                MoveInfo.MoveParam.TargetPos = $"NA=>{To.posid}";
            }
            else
            {
                WareCode = from.Reel.WareCode;
                plateH = from.Reel.PlateH;
                From = from.clone();
                To = to.clone();

                MoveInfo.NewMove(MoveStep.TS01);
                MoveInfo.log($"{storeMoveType}:开始运输料盘,从:{from.posid},到:{to.posid}");
                MoveInfo.MoveParam.TargetPos = $"{From.posid}=>{To.posid}";
                MoveInfo.MoveParam.ReelOnFixture = From.Reel.ReelOnFixture;
            }
          
            MoveInfo.MoveParam.WareCode = WareCode;

            ErrMsgTxt = "";
            return true;
        }
         
        bool pause = false;
        public void Pause()
        {
            pause = true;
        }
        public void Resume()
        {
            pause = false;
        }
        public bool Process()
        {
            if (pause)
                return false;
            if (mainMachine.CheckWait(MoveInfo))
                return false;

            switch (MoveInfo.MoveStep)
            {
                case MoveStep.Wait:
                    break;
                case MoveStep.TS01:
                    if (!IgnoreX09 && !MoveInfo.MoveParam.ReelOnFixture && IOManager.IOValue(IO_Type.TrayCheck_Fixture, Config).Equals(IO_VALUE.HIGH))
                    {
                        if (!IgnoreX09 && IOMonitor.IODebound(IO_Type.TrayCheck_Fixture, Config, IO_VALUE.HIGH, 5000))
                            Msg.add(string.Format(crc.GetString("Res0124", "出入库时料叉{0}检测到有物料无法继续,请检查."), Config.DIList[IO_Type.TrayCheck_Fixture].ElectricalDefinition), MsgLevel.alarm, ErrInfo.X09_BoxNotDetect);
                    }
                    else
                    {
                        Msg.add("", MsgLevel.info, ErrInfo.X09_Clear);
                        IgnoreX09 = false;
                        MoveInfo.NextMoveStep(MoveStep.TS02_Check);
                        MoveInfo.log($"{storeMoveType}:检查安全状态");
                    }
                    break;
                case MoveStep.TS02_Check:
                    if (MoveInfo.MoveParam.ReelOnFixture)
                    {
                        MoveInfo.NextMoveStep(MoveStep.TS08_GetReel);
                        MoveInfo.log($"{storeMoveType}:料盘已在料叉上,压紧轴压紧,Comp_PL:{From.Comp_PL}");
                        Comp_Axis.AbsMove(MoveInfo, From.Comp_PL, Config.Comp_P2_speed);
                    }
                    else
                    {
                        MoveInfo.NextMoveStep(MoveStep.TS03_InoutTP1);
                        InOut_Axis.AbsMove(MoveInfo, Config.InOut_P1, Config.InOut_P1_speed);
                        Comp_Axis.AbsMove(MoveInfo, From.Comp_PH, Config.Comp_P2_speed);
                        MoveInfo.log($"{storeMoveType}:进出轴返回待机点P1{Config.InOut_P1},压紧轴到高点{From.Comp_PH}");
                    }
                    break;
                case MoveStep.TS03_InoutTP1:
                    MoveInfo.NextMoveStep(MoveStep.TS04_TSPos);
                    UpDown_Axis.AbsMove(MoveInfo, From.UpDown_PL, Config.UpDown_P1_speed); 
                    Middle_Axis.AbsMove(MoveInfo, From.Middle_P2, Config.Middle_P1_speed);
                    MoveInfo.log($"{storeMoveType}:升降轴到取料低点{From.UpDown_PL},旋转轴到取料点{From.Middle_P2}");
                    break;
                case MoveStep.TS04_TSPos:
                  
                    MoveInfo.NextMoveStep(MoveStep.TS06_InoutTP2);
                    InOut_Axis.AbsMove(MoveInfo, From.InOut_P2, Config.InOut_P1_speed);
                    MoveInfo.log($"{storeMoveType}:进出轴到取料点P2{From.InOut_P2}");
                    break;
                case MoveStep.TS06_InoutTP2: 
                    RobotManage.CameraA.CameraGrabOne(RobotManage.CameraA.GetFixtureStateFilename(From.posid, WareCode, storeMoveType, FixtureState.FromIn));
                    MoveInfo.NextMoveStep(MoveStep.TS08_GetReel);
                    UpDown_Axis.AbsMove(MoveInfo, From.UpDown_PH, Config.UpDown_P1_speed);
                    Comp_Axis.AbsMove(MoveInfo, From.Comp_PL, Config.Comp_P2_speed);
                    MoveInfo.log($"{storeMoveType}:升降轴到取料高点{From.UpDown_PH},压紧轴到低点{From.Comp_PL}");
                    break;
                case MoveStep.TS08_GetReel:
                    MoveInfo.NextMoveStep(MoveStep.TS09_InoutTP1);
                    MoveInfo.log($"{storeMoveType}:进出轴到待机点P1{Config.InOut_P1}");
                    InOut_Axis.AbsMove(MoveInfo, Config.InOut_P1, Config.InOut_P1_speed);
                    IgnoreX09 = false;
                    break;
                case MoveStep.TS09_InoutTP1:
                    RobotManage.CameraA.CameraGrabOne(RobotManage.CameraA.GetFixtureStateFilename(From.posid, WareCode, storeMoveType, FixtureState.FromOut));
                    if (!IgnoreX09 && IOManager.IOValue(IO_Type.TrayCheck_Fixture, Config).Equals(IO_VALUE.LOW))
                    {
                        Msg.add(string.Format("出入库时料叉{0}没有检测到物料无法继续,请检查.", Config.DIList[IO_Type.TrayCheck_Fixture].ElectricalDefinition), MsgLevel.alarm, ErrInfo.X09_BoxNotDetect);
                    }
                    else
                    {
                        Msg.add("", MsgLevel.info, ErrInfo.X09_Clear);
                        IgnoreX09 = false;
                        MoveInfo.NextMoveStep(MoveStep.TS10_IOCheck) ;
                        MoveInfo.log($"{storeMoveType}:TrayCheck_Fixture取到料");
                        InOutEndProcess(StoreMoveType.OutStore, From.posid);
                    }
                    break;                
                case MoveStep.TS10_IOCheck:
                    MoveInfo.NextMoveStep(MoveStep.TS11_ToTPos);
                    Middle_Axis.AbsMove(MoveInfo, To.Middle_P2, Config.Middle_P1_speed);
                    MoveInfo.log($"{storeMoveType}");
                    UpDown_Axis.AbsMove(MoveInfo, To.UpDown_PH, Config.UpDown_P1_speed);
                    MoveInfo.log($"{storeMoveType}::旋转轴到目的地P2{To.Middle_P2}升降轴到目的地高点:{To.UpDown_PH}");
                    break;
                case MoveStep.TS11_ToTPos: 
                    MoveInfo.NextMoveStep(MoveStep.TS13_InoutTP2);
                    MoveInfo.log($"{storeMoveType}:进出轴到P2{To.InOut_P2}");
                    InOut_Axis.AbsMove(MoveInfo, To.InOut_P2, Config.InOut_P1_speed);
                    break;
                case MoveStep.TS13_InoutTP2:
                    RobotManage.CameraA.CameraGrabOne(RobotManage.CameraA.GetFixtureStateFilename(To.posid, WareCode, storeMoveType, FixtureState.ToIn));
                    MoveInfo.NextMoveStep(MoveStep.TS14_PutReel);
                    Comp_Axis.AbsMove(MoveInfo, To.Comp_PH, Config.Comp_P2_speed);
                    UpDown_Axis.AbsMove(MoveInfo, To.UpDown_PL, Config.UpDown_S1_Speed);
                    MoveInfo.log($"{storeMoveType}:压紧轴到压紧前点:{To.Comp_PH},升降轴到目的地低点:{To.UpDown_PL}"); 
                    break;
                case MoveStep.TS14_PutReel:
                    MoveInfo.NextMoveStep(MoveStep.TS15_InoutTP1);
                    InOut_Axis.AbsMove(MoveInfo, Config.InOut_P1, Config.InOut_P1_speed);
                    MoveInfo.log($"{storeMoveType}:进出轴到达待机点");
                    break;
                case MoveStep.TS15_InoutTP1:
                    RobotManage.CameraA.CameraGrabOne(RobotManage.CameraA.GetFixtureStateFilename(To.posid, WareCode, storeMoveType, FixtureState.ToOut));
                    if (!IgnoreX09 && IOManager.IOValue(IO_Type.TrayCheck_Fixture, Config).Equals(IO_VALUE.HIGH))
                    {
                        Msg.add(string.Format("放料后料叉{0}上任然检测到物料,请检查.", Config.DIList[IO_Type.TrayCheck_Fixture].ElectricalDefinition), MsgLevel.alarm, ErrInfo.X09_BoxNotDetect);
                    }
                    else
                    {
                        Msg.add("", MsgLevel.info, ErrInfo.X09_Clear);
                        IgnoreX09 = false;
                        MoveInfo.NextMoveStep(MoveStep.TS16_Check);
                        MoveInfo.log($"{storeMoveType}:安全检查");
                        InOutEndProcess(StoreMoveType.PutReel, To.posid);
                    }
                    break;
                case MoveStep.TS16_Check:
                    MoveInfo.NextMoveStep(MoveStep.TS17_AxisBack); 
                    if (RobotManage.mainMachine.AutoInOutTest)
                    {
                        MoveInfo.log($"{storeMoveType}:库位测试模式,升降轴,旋转不返回待机点");
                        break;
                    }
                    UpDown_Axis.AbsMove(MoveInfo, Config.UpDown_P1, Config.UpDown_P1_speed);
                    Middle_Axis.AbsMove(MoveInfo, Config.Middle_P1, Config.Middle_P1_speed);
                    MoveInfo.log($"{storeMoveType}:升降轴回P1{Config.UpDown_P1},旋转返回待机点P1{Config.Middle_P1}");
                    ErrMsgTxt = "";
                    break;
                case MoveStep.TS17_AxisBack:
                    MoveInfo.log($"{storeMoveType}:转移料盘完成");
                    MoveInfo.EndMove();
                    ErrMsgTxt = "";
                    To.posid = "";
                    storeMoveType = StoreMoveType.None;
                    break;
                case MoveStep.TS_Continue:
                    MoveInfo.NextMoveStep(MoveStep.TS17_AxisBack);
                    MoveInfo.log($"{storeMoveType}:继续运行进出轴到达待机点");
                    InOut_Axis.AbsMove(MoveInfo, Config.InOut_P1, Config.InOut_P1_speed);
                    break;
                default:
                    MoveInfo.log($"{storeMoveType}:未找到对应步骤:{MoveInfo.MoveStep}");
                    return true;
            }

            return false;
        }

        bool movelock = false;
        internal void Lock()
        {
            movelock = true;
        }
        internal void Unlock()
        {
            movelock = false;
        }
        private void InOutEndProcess(StoreMoveType storeMoveType, string posid)
        {
            InOutEndProcessEvent?.Invoke(posid, storeMoveType, true);
        }
    }
}