BoxTransport.cs 17.3 KB
using OnlineStore;
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace DeviceLibrary
{
    class ReelTransport
    {
        Robot_Config Config;
        BoxStorePosition From;
        public BoxStorePosition To;
        BoxStorePosition Fix;
        MainMachine mainMachine;
        //using static 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 event Func<bool, bool> DoorControl;
        public bool IsComplateOrFree { get => MoveInfo.MoveStep == MoveStep.Wait && !movelock; }
        public bool IsTakedReel { get => MoveInfo.MoveStep >= MoveStep.StoreTS10; }
        public bool IsPutOnOut { get => MoveInfo.MoveStep >= MoveStep.StoreTS16 || MoveInfo.MoveStep== MoveStep.Wait; }


        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.StoreTS10);
                MoveInfo.log($"{storeMoveType}:开始运输料盘,直接到:{to.posid}");
                MoveInfo.MoveParam.PosID = $"NA=>{To.posid}";
            }
            else
            {
                WareCode = from.Reel.WareCode;
                plateH = from.Reel.PlateH;
                From = from.clone();
                To = to.clone();

                MoveInfo.NewMove(MoveStep.StoreTS01);
                MoveInfo.log($"{storeMoveType}:开始运输料盘,从:{from.posid},到:{to.posid}");
                MoveInfo.MoveParam.PosID = $"{From.posid}=>{To.posid}";
                MoveInfo.MoveParam.ReelOnFixture = From.Reel.ReelOnFixture;
            }
            if (To.posid == BoxStorePosition.ngdoor)
            {
                Fix = BoxStorePosition.GetFixPos(Config, To.Reel);
            }
            MoveInfo.MoveParam.WareCode = WareCode;

            ErrMsgTxt = "";
            return true;
        }

        public bool ReadyToTakeBox()
        {
            if (MoveInfo.MoveStep != MoveStep.StoreTS05)
                return false;

            MoveInfo.NextMoveStep(MoveStep.StoreTS06);
            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.StoreTS01:
                    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.StoreTS02);
                        MoveInfo.log($"{storeMoveType}:检查安全状态");
                    }
                    break;
                case MoveStep.StoreTS02:
                    if (MoveInfo.MoveParam.ReelOnFixture)
                    {
                        MoveInfo.NextMoveStep(MoveStep.StoreTS08);
                        MoveInfo.log($"{storeMoveType}:料盘已在料叉上,压紧轴压紧,Comp_PL:{From.Comp_PL}");
                        Comp_Axis.AbsMove(MoveInfo, From.Comp_PL, Config.Comp_P2_speed);
                    }
                    else
                    {
                        MoveInfo.NextMoveStep(MoveStep.StoreTS03);
                        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");
                    }
                    break;
                case MoveStep.StoreTS03:
                    MoveInfo.NextMoveStep(MoveStep.StoreTS04);
                    UpDown_Axis.AbsMove(MoveInfo, From.UpDown_PL, Config.UpDown_P1_speed);
                    MoveInfo.log($"{storeMoveType}:上下轴到达取料低点{From.UpDown_PL}");
                    Middle_Axis.AbsMove(MoveInfo, From.Middle_P2, Config.Middle_P2_speed);
                    MoveInfo.log($"{storeMoveType}:行走轴到达取料点{From.Middle_P2}");
                    break;
                case MoveStep.StoreTS04:
                    if (From.posid == BoxStorePosition.ngdoor)
                    {
                        if (DoorControl.Invoke(true))
                        {
                            MoveInfo.NextMoveStep(MoveStep.StoreTS05);
                        }
                    }
                    else
                        MoveInfo.NextMoveStep(MoveStep.StoreTS05);
                    break;
                case MoveStep.StoreTS05:
                    MoveInfo.NextMoveStep(MoveStep.StoreTS06);
                    InOut_Axis.AbsMove(MoveInfo, From.InOut_P2, Config.InOut_P2_speed);
                    MoveInfo.log($"{storeMoveType}:进出轴到达取料点{From.InOut_P2}");
                    break;
                case MoveStep.StoreTS06:
                    MoveInfo.NextMoveStep(MoveStep.StoreTS07);
                    break;
                case MoveStep.StoreTS07:
                    RobotManage.CameraA.CameraGrabOne(RobotManage.CameraA.GetFixtureStateFilename(From.posid, WareCode, storeMoveType, FixtureState.FromIn));
                    MoveInfo.NextMoveStep(MoveStep.StoreTS08);
                    UpDown_Axis.AbsMove(MoveInfo, From.UpDown_PH, Config.UpDown_P2_speed);
                    Comp_Axis.AbsMove(MoveInfo, From.Comp_PL, Config.Comp_P2_speed);
                    MoveInfo.log($"{storeMoveType}:上下轴到达取料高点");
                    break;
                case MoveStep.StoreTS08:
                    MoveInfo.NextMoveStep(MoveStep.StoreTS09);
                    MoveInfo.log($"{storeMoveType}:进出轴到达待机点");
                    InOut_Axis.AbsMove(MoveInfo, Config.InOut_P1, Config.InOut_P1_speed);
                    IgnoreX09 = false;
                    break;
                case MoveStep.StoreTS09:
                    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(crc.GetString("Res0125", "出库时料叉{0}没有检测到物料无法继续,请检查."), Config.DIList[IO_Type.TrayCheck_Fixture].ElectricalDefinition), MsgLevel.alarm, ErrInfo.X09_BoxNotDetect);
                    }
                    else
                    {
                        DoorControl.Invoke(false);
                        Msg.add("", MsgLevel.info, ErrInfo.X09_Clear);
                        IgnoreX09 = false;
                        if (To.posid == BoxStorePosition.ngdoor && Setting_Init.Device_Use_Fixpos
                            && Fix != null && From != null && From.posid != Fix.posid)
                            MoveInfo.NextMoveStep(MoveStep.StoreFIX01);
                        else
                            MoveInfo.NextMoveStep(MoveStep.StoreTS10);
                        MoveInfo.log($"{storeMoveType}:TrayCheck_Fixture取到料");
                        InOutEndProcess(StoreMoveType.OutStore, From.posid);
                    }
                    break;
                case MoveStep.StoreFIX01:
                    MoveInfo.NextMoveStep(MoveStep.StoreFIX02);
                    Middle_Axis.AbsMove(MoveInfo, Fix.Middle_P2, Config.Middle_P2_speed);
                    MoveInfo.log($"{storeMoveType}:行走轴到达目的地:{Fix.Middle_P2}");
                    UpDown_Axis.AbsMove(MoveInfo, Fix.UpDown_PH, Config.UpDown_P1_speed);
                    MoveInfo.log($"{storeMoveType}:上下轴到达目的地高点:{Fix.UpDown_PH}");
                    Setting_Init.Runtime_PlateInFix = Fix.posid;
                    break;
                case MoveStep.StoreFIX02:
                    MoveInfo.NextMoveStep(MoveStep.StoreFIX03);
                    MoveInfo.log($"{storeMoveType}:进出轴到达目的地");
                    InOut_Axis.AbsMove(MoveInfo, Fix.InOut_P2, Config.InOut_P2_speed);
                    break;
                case MoveStep.StoreFIX03:
                    RobotManage.CameraA.CameraGrabOne(RobotManage.CameraA.GetFixtureStateFilename(To.posid, WareCode, storeMoveType, FixtureState.ToFix));
                    MoveInfo.NextMoveStep(MoveStep.StoreFIX04);
                    Comp_Axis.AbsMove(MoveInfo, Fix.Comp_PH, Config.Comp_P2_speed);
                    UpDown_Axis.AbsMove(MoveInfo, Fix.UpDown_PL, Config.UpDown_P3_speed);
                    MoveInfo.log($"{storeMoveType}:压紧轴高点:{Fix.Comp_PH}");
                    MoveInfo.log($"{storeMoveType}:上下轴到达目的地低点:{Fix.UpDown_PL}");
                    break;
                case MoveStep.StoreFIX04:
                    MoveInfo.NextMoveStep(MoveStep.StoreFIX05);
                    Comp_Axis.AbsMove(MoveInfo, Fix.Comp_PL, Config.Comp_P2_speed);
                    UpDown_Axis.AbsMove(MoveInfo, Fix.UpDown_PH, Config.UpDown_P3_speed / 2);
                    MoveInfo.log($"{storeMoveType}:压紧轴压紧点:{Fix.Comp_PL}");
                    MoveInfo.log($"{storeMoveType}:上下轴到达目的高点:{Fix.UpDown_PH}");
                    break;
                case MoveStep.StoreFIX05:
                    MoveInfo.NextMoveStep(MoveStep.StoreTS10);
                    InOut_Axis.AbsMove(MoveInfo, Config.InOut_P1, Config.InOut_P1_speed);
                    MoveInfo.log($"{storeMoveType}:进出轴到达待机点");
                    Setting_Init.Runtime_PlateInFix = "";
                    break;
                case MoveStep.StoreTS10:
                    MoveInfo.NextMoveStep(MoveStep.StoreTS11);
                    Middle_Axis.AbsMove(MoveInfo, To.Middle_P2, Config.Middle_P2_speed);
                    MoveInfo.log($"{storeMoveType}:行走轴到达目的地:{To.Middle_P2}");
                    UpDown_Axis.AbsMove(MoveInfo, To.UpDown_PH, Config.UpDown_P1_speed);
                    MoveInfo.log($"{storeMoveType}:上下轴到达目的地高点:{To.UpDown_PH}");
                    break;
                case MoveStep.StoreTS11:
                    if (To.posid == BoxStorePosition.ngdoor)
                    {
                        if (IOManager.IOValue(IO_Type.TrayCheck_Door, Config).Equals(IO_VALUE.HIGH))
                        {
                            Msg.add(crc.GetString("Res0126", "单料门口有料无法放料."), MsgLevel.info);
                            MoveInfo.log($"单料门口有料无法放料");
                            return false;
                        }
                        if (!DoorControl.Invoke(true))
                        {
                            Msg.add(crc.GetString("Res0127", "等待单料口门开启."), MsgLevel.info);
                            MoveInfo.log($"等待单料口门开启");
                            return false;
                        }
                    }
                    MoveInfo.NextMoveStep(MoveStep.StoreTS12);
                    break;
                case MoveStep.StoreTS12:
                    MoveInfo.NextMoveStep(MoveStep.StoreTS13);
                    MoveInfo.log($"{storeMoveType}:进出轴到达目的地");
                    InOut_Axis.AbsMove(MoveInfo, To.InOut_P2, Config.InOut_P2_speed);
                    break;
                case MoveStep.StoreTS13:
                    RobotManage.CameraA.CameraGrabOne(RobotManage.CameraA.GetFixtureStateFilename(To.posid, WareCode, storeMoveType, FixtureState.ToIn));
                    MoveInfo.NextMoveStep(MoveStep.StoreTS14);
                    Comp_Axis.AbsMove(MoveInfo, To.Comp_PH, Config.Comp_P2_speed);
                    UpDown_Axis.AbsMove(MoveInfo, To.UpDown_PL, Config.UpDown_P3_speed);
                    MoveInfo.log($"{storeMoveType}:压紧轴压紧点:{To.Comp_PH}");
                    MoveInfo.log($"{storeMoveType}:上下轴到达目的地低点:{To.UpDown_PL}");
                    break;
                case MoveStep.StoreTS14:
                    MoveInfo.NextMoveStep(MoveStep.StoreTS15);
                    InOut_Axis.AbsMove(MoveInfo, Config.InOut_P1, Config.InOut_P1_speed);
                    MoveInfo.log($"{storeMoveType}:进出轴到达待机点");
                    break;
                case MoveStep.StoreTS15:
                    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(crc.GetString("Res0128", "入库后料叉{0}上任然检测到物料,请检查."), Config.DIList[IO_Type.TrayCheck_Fixture].ElectricalDefinition), MsgLevel.alarm, ErrInfo.X09_BoxNotDetect);
                    }
                    else
                    {
                        DoorControl.Invoke(false);
                        Msg.add("", MsgLevel.info, ErrInfo.X09_Clear);
                        IgnoreX09 = false;
                        MoveInfo.NextMoveStep(MoveStep.StoreTS16);
                        MoveInfo.log($"{storeMoveType}:安全检查");
                        InOutEndProcess(StoreMoveType.InStore, To.posid);
                    }
                    break;
                case MoveStep.StoreTS16:
                    MoveInfo.NextMoveStep(MoveStep.StoreTS17);
                    if (From != null && From.posid != BoxStorePosition.ngdoor && From.posid != BoxStorePosition.ngdoor)
                    {
                        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");
                    ErrMsgTxt = "";
                    break;
                case MoveStep.StoreTS17:
                    MoveInfo.log($"{storeMoveType}:转移料盘完成");
                    MoveInfo.EndMove();
                    ErrMsgTxt = "";
                    To.posid = "";
                    storeMoveType = StoreMoveType.None;
                    break;
                case MoveStep.StoreTS_Continue:
                    MoveInfo.NextMoveStep(MoveStep.StoreTS17);
                    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);
        }
    }
}