BoxTransport.cs 16.8 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;
        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 bool IsComplateOrFree { get => MoveInfo.MoveStep == MoveStep.Wait; }
        public bool IsTakedReel { get => MoveInfo.MoveStep >= MoveStep.StoreTS10; }
        public bool IsPutOnOut {get=> MoveInfo.MoveStep >= MoveStep.StoreTS16; }
        
        public ReelTransport(Robot_Config _Config, MainMachine _mainMachine)
        {
            Config = _Config;
            mainMachine = _mainMachine;
            MoveInfo = new MoveInfo(crc.GetString(L.transfer_equipment, "出入库机构"),false);
            #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("执行重置");
        }
        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;

            
            storeMoveType = _storeMoveType;
            PreMove = premove;
            if (from == null)
            {
                WareCode = "NG";
                plateH = 32;
                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}";
            }
            if (To.posid == BoxStorePosition.strings)
            {
                Fix = BoxStorePosition.GetFixPos(Config, To.Reel);
            }
            MoveInfo.MoveParam.WareCode = WareCode;
            
            ErrMsgTxt = "";
            return true;
            //thread = new Thread(new ThreadStart(Run));
            //thread.Start();
        }

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

            MoveInfo.NextMoveStep(MoveStep.StoreTS06);
            return true;
        }
        public bool Process()
        {
            if (mainMachine.CheckWait(MoveInfo))
                return false;

            switch (MoveInfo.MoveStep)
            {
                case MoveStep.Wait:
                    break;
                case MoveStep.StoreTS01:
                    if (IOManager.IOValue(IO_Type.TrayCheck_Fixture).Equals(IO_VALUE.HIGH))
                    {
                        if (!IgnoreX09 && IOMonitor.IODebound(IO_Type.TrayCheck_Fixture, Config, IO_VALUE.HIGH, 5000))
                            Msg.add(crc.GetString(L.out_store_detect_material, "出库时料叉X30检测到有物料无法继续,请检查."), MsgLevel.alarm, ErrInfo.X09_BoxNotDetect);
                        //RobotManage.UserPause("出库时料叉X30检测到有物料无法继续,请检查");
                    }
                    else
                    {
                        Msg.add("", MsgLevel.info, ErrInfo.X09_Clear);
                        IgnoreX09 = false;
                        MoveInfo.NextMoveStep(MoveStep.StoreTS02);
                        MoveInfo.log($"{storeMoveType}:检查安全状态");
                    }
                    break;
                case MoveStep.StoreTS02:
                    MoveInfo.NextMoveStep(MoveStep.StoreTS04);
                    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);
                    //if (isNotSameSide(From.Middle_P2,From.UpDown_PL))
                    //{
                    //    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");
                    //}
                    break;
                case MoveStep.StoreTS04:
                    MoveInfo.NextMoveStep(MoveStep.StoreTS06);
                    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.StoreTS05:
                    if (!PreMove)
                        MoveInfo.NextMoveStep(MoveStep.StoreTS06);
                    break;
                case MoveStep.StoreTS06:
                    MoveInfo.NextMoveStep(MoveStep.StoreTS07);
                    InOut_Axis.AbsMove(MoveInfo, From.InOut_P2, Config.InOut_P2_speed);
                    MoveInfo.log($"{storeMoveType}:进出轴到达取料点{From.InOut_P2}");
                    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_P4_speed);
                    Comp_Axis.AbsMove(MoveInfo, From.Comp_PL, Config.Comp_P2_speed);
                    MoveInfo.log($"{storeMoveType}:上下轴到达取料高点");
                    break;
                case MoveStep.StoreTS08:
                    MoveInfo.NextMoveStep(MoveStep.StoreTS09);
                    InOut_Axis.AbsMove(MoveInfo, Config.InOut_P1, Config.InOut_P1_speed);
                    IgnoreX09 = false;
                    MoveInfo.log($"{storeMoveType}:进出轴到达待机点");
                    break;
                case MoveStep.StoreTS09:
                    RobotManage.CameraA.CameraGrabOne(RobotManage.CameraA.GetFixtureStateFilename(From.posid, WareCode, storeMoveType, FixtureState.FromOut));
                    if (!IgnoreX09 && IOManager.IOValue(IO_Type.TrayCheck_Fixture).Equals(IO_VALUE.LOW))
                    {
                        Msg.add(crc.GetString(L.out_store_not_detect_material, "出库时料叉X30没有检测到有物料无法继续,请检查."), MsgLevel.alarm,ErrInfo.X09_BoxNotDetect);
                        //RobotManage.UserPause("出库时料叉X30没有检测到有物料无法继续,请检查");
                    }
                    else
                    {
                        Msg.add("", MsgLevel.info, ErrInfo.X09_Clear);
                        IgnoreX09 = false;
                        if (To.posid== BoxStorePosition.strings && ConfigHelper.Config.Get("Device_Use_Fixpos",false) && Fix!=null)
                            MoveInfo.NextMoveStep(MoveStep.StoreFIX01);
                        else
                            MoveInfo.NextMoveStep(MoveStep.StoreTS10);
                        MoveInfo.log($"{storeMoveType}:X30取到料");
                        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}");
                    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/2);
                    MoveInfo.log($"{storeMoveType}:压紧轴高点:{Fix.Comp_PH}");
                    MoveInfo.log($"{storeMoveType}:上下轴到达目的地低点:{Fix.UpDown_PL}");
                    break;
                case MoveStep.StoreFIX04:
                    MoveInfo.NextMoveStep(MoveStep.StoreFIX05);
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                    break;
                case MoveStep.StoreFIX05:
                    MoveInfo.NextMoveStep(MoveStep.StoreFIX06);
                    Comp_Axis.AbsMove(MoveInfo, Fix.Comp_PL, Config.Comp_P2_speed);
                    UpDown_Axis.AbsMove(MoveInfo, Fix.UpDown_PH, Config.UpDown_P3_speed);
                    MoveInfo.log($"{storeMoveType}:压紧轴压紧点:{Fix.Comp_PL}");
                    MoveInfo.log($"{storeMoveType}:上下轴到达目的高点:{Fix.UpDown_PH}");
                    break;
                case MoveStep.StoreFIX06:
                    MoveInfo.NextMoveStep(MoveStep.StoreTS10);
                    InOut_Axis.AbsMove(MoveInfo, Config.InOut_P1, Config.InOut_P1_speed);
                    MoveInfo.log($"{storeMoveType}:进出轴到达待机点");
                    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.strings) {
                        if (!mainMachine.IsPutReelReady)
                        {
                            //if (MoveInfo.IsTimeOut(20))
                            Msg.add(crc.GetString(L.out_store_wait_string_ready, "等待料串准备好放料."), MsgLevel.warning);
                            MoveInfo.log($"等待料串准备好放料");
                            return false;
                        }
                    }else if (To.posid == BoxStorePosition.ngdoor)
                    {
                        if (mainMachine.ClampMoveInfo.MoveStep!=MoveStep.Wait)
                        {
                            //if (MoveInfo.IsTimeOut(20))
                            Msg.add(crc.GetString(L.out_store_wait_ngdoor_ready,"等待单料口空闲."), MsgLevel.warning);
                            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).Equals(IO_VALUE.HIGH))
                    {
                        Msg.add(crc.GetString(L.in_store_detect_material,"入库后料叉X30上任然检测到物料,请检查."), MsgLevel.alarm, ErrInfo.X09_BoxNotDetect);
                        //RobotManage.UserPause("入库后料叉X30上任然检测到物料,请检查");
                    }
                    else
                    {
                       
                            Msg.add("", MsgLevel.info, ErrInfo.X09_Clear);
                        IgnoreX09 = false;
                        MoveInfo.NextMoveStep(MoveStep.StoreTS16);
                        MoveInfo.log($"{storeMoveType}:安全检查");
                    }
                    break;
                case MoveStep.StoreTS16:
                    MoveInfo.NextMoveStep(MoveStep.StoreTS17);
                    if (From.posid != BoxStorePosition.strings && From.posid != BoxStorePosition.ngdoor
                        && To.posid != BoxStorePosition.strings && To.posid != BoxStorePosition.ngdoor
                        )
                    {
                        MoveInfo.log($"{storeMoveType}:库位测试模式,上下轴,旋转不返回待机点");
                        break; }

                    if (To.posid==BoxStorePosition.strings) 
                        UpDown_Axis.AbsMove(MoveInfo, Config.UpDown_P5, Config.UpDown_P1_speed);
                    else
                        UpDown_Axis.AbsMove(MoveInfo, Config.UpDown_P3, 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.NextMoveStep(MoveStep.StoreTS16);
                    MoveInfo.log($"{storeMoveType}:转移料盘完成");
                    MoveInfo.EndMove();
                    ErrMsgTxt = "";
                    InOutEndProcess(StoreMoveType.InStore, To.posid);
                    storeMoveType = StoreMoveType.None;
                    break;
                default:
                    MoveInfo.log($"{storeMoveType}:未找到对应步骤:{MoveInfo.MoveStep}");
                    return true;
            }

            return false;
        }
        private void InOutEndProcess(StoreMoveType storeMoveType, string posid)
        {
            InOutEndProcessEvent?.Invoke(posid, storeMoveType, true);
        }

        HIKCamera GetCamera(int pos) {
            //return pos > 0 ? RobotManage.CameraA : RobotManage.CameraB;
            return RobotManage.CameraA;
        }
    }
}