BoxTransport.cs 13.9 KB
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 BoxTransport
    {
        Robot_Config Config;
        BoxStorePosition From;
        BoxStorePosition To;
        MainMachine mainMachine;
        //using static mainMachine;
        AxisBean XAxis;
        AxisBean YAxis;
        AxisBean ZAxis;
        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 IsTakedBox { get => MoveInfo.MoveStep >= MoveStep.StoreTS10; }
        public bool IsPutOnOut {get=> To.posid== BoxStorePosition.outdoor && MoveInfo.MoveStep >= MoveStep.StoreTS16; }
        public BoxTransport(Robot_Config _Config, MainMachine _mainMachine)
        {
            Config = _Config;
            mainMachine = _mainMachine;
            MoveInfo = new MoveInfo("行走机构",false);
            #region 初始化伺服轴
            XAxis = _mainMachine.XAxis;
            YAxis = _mainMachine.YAxis;
            ZAxis = _mainMachine.ZAxis;
            #endregion
        }
        public void Reset() {
            MoveInfo.NewMove(MoveStep.Wait);
            MoveInfo.log("执行重置");
        }
        StoreMoveType storeMoveType = StoreMoveType.None;
        string WareCode="";
        public bool Start(BoxStorePosition from, BoxStorePosition to, StoreMoveType _storeMoveType, string warecode)
        {

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

            WareCode = warecode;
            storeMoveType = _storeMoveType;
            if (from == null)
            {
                To = to.clone();
                MoveInfo.NewMove(MoveStep.StoreTS10);
                MoveInfo.log($"{storeMoveType}:开始运输周转箱,直接到:{to.posid}");
            }
            else
            {
                From = from.clone();
                To = to.clone();
                MoveInfo.NewMove(MoveStep.StoreTS01);
                MoveInfo.log($"{storeMoveType}:开始运输周转箱,从:{from.posid},到:{to.posid}");
            }
            MoveInfo.MoveParam.WareCode = WareCode;
            MoveInfo.MoveParam.PosID = $"{From.posid}=>{To.posid}";
            ErrMsgTxt = "";
            return true;
            //thread = new Thread(new ThreadStart(Run));
            //thread.Start();
        }

        bool isNotSameSide(int x_to, int y_to)
        {
            var p = XAxis.GetAclPosition();
            var rtx = p + Config.XAxis.CanErrorCountMax;
            var ltx = p - Config.XAxis.CanErrorCountMax;

            var py = YAxis.GetAclPosition();
            var uty = py + Config.YAxis.CanErrorCountMax;
            var dty = py - Config.YAxis.CanErrorCountMax;

            //从外侧到内测,判断目标位置是否小于p1
            if (rtx >= Config.Xaxis_P1 && x_to < Config.Xaxis_P1)
            {
                if (y_to < Config.Yaxis_P1)
                    return true;
            }
            //从内测到外侧判断当前位置是否小于p1
            if (ltx <= Config.Xaxis_P1 && x_to > Config.Xaxis_P1)
            {
                if (uty < Config.Yaxis_P1)
                    return true;
            }

            return false;
        }
        public bool Process()
        {
            if (mainMachine.CheckWait(MoveInfo))
                return false;

            switch (MoveInfo.MoveStep)
            {
                case MoveStep.Wait:
                    break;
                case MoveStep.StoreTS01:
                    if (IOManager.IOValue(IO_Type.SideA_ForkMaterial_Check).Equals(IO_VALUE.HIGH) ||
                        IOManager.IOValue(IO_Type.SideB_ForkMaterial_Check).Equals(IO_VALUE.HIGH))
                    {
                        Msg.add("伸缩叉2侧X10/X11检测到有物料无法继续,请检查", MsgLevel.alarm);
                        RobotManage.UserPause("伸缩叉2侧X10,X11检测到有物料无法继续,请检查");
                    }
                    else if (IOManager.IOValue(IO_Type.ForkMaterial_Check).Equals(IO_VALUE.HIGH))
                    {
                        Msg.add("出库时伸缩叉X09检测到有物料无法继续,请检查", MsgLevel.alarm);
                        RobotManage.UserPause("出库时伸缩叉X09检测到有物料无法继续,请检查");
                    }
                    else
                    {
                        MoveInfo.NextMoveStep(MoveStep.StoreTS02);
                        MoveInfo.log($"{storeMoveType}:检查安全状态");
                    }
                    break;
                case MoveStep.StoreTS02:
                    MoveInfo.NextMoveStep(MoveStep.StoreTS03);
                    ZAxis.AbsMove(MoveInfo, Config.Zaxis_P1, Config.Zaxis_P1_speed);
                    MoveInfo.log($"{storeMoveType}:进出轴返回待机点P1");
                    break;
                case MoveStep.StoreTS03:
                    MoveInfo.NextMoveStep(MoveStep.StoreTS04);
                    if (isNotSameSide(From.Xaxis_P2,From.Yaxis_PL))
                    {
                        YAxis.AbsMove(MoveInfo, Config.Yaxis_P1, Config.Yaxis_P1_speed);
                        XAxis.AbsMove(MoveInfo, Config.Xaxis_P1, Config.Xaxis_P1_speed);
                        MoveInfo.log($"{storeMoveType}:上下轴,行走机构返回待机点P1");
                    }
                    break;
                case MoveStep.StoreTS04:
                    MoveInfo.NextMoveStep(MoveStep.StoreTS06);
                    YAxis.AbsMove(MoveInfo, From.Yaxis_PL, Config.Yaxis_P1_speed);
                    MoveInfo.log($"{storeMoveType}:上下轴到达取料低点");
                    XAxis.AbsMove(MoveInfo, From.Xaxis_P2, Config.Xaxis_P2_speed);
                    MoveInfo.log($"{storeMoveType}:行走机构到达取料点");
                    break;
                case MoveStep.StoreTS05:
                    MoveInfo.NextMoveStep(MoveStep.StoreTS06);                    
                    break;
                case MoveStep.StoreTS06:
                    MoveInfo.NextMoveStep(MoveStep.StoreTS07);
                    ZAxis.AbsMove(MoveInfo, From.Zaxis_P2, Config.Zaxis_P2_speed);
                    MoveInfo.log($"{storeMoveType}:进出轴到达取料点");
                    break;
                case MoveStep.StoreTS07:
                    GetCamera(From.Zaxis_P2).CameraGrabOne(RobotManage.CameraA.GetFixtureStateFilename(From.posid, WareCode, storeMoveType, FixtureState.FromIn));
                    RobotManage.CameraB.CameraGrabOne(RobotManage.CameraA.GetFixtureStateFilename(From.posid, WareCode, storeMoveType, FixtureState.FromInSide));
                    MoveInfo.NextMoveStep(MoveStep.StoreTS08);
                    YAxis.AbsMove(MoveInfo, From.Yaxis_PH, Config.Yaxis_P4_speed);
                    MoveInfo.log($"{storeMoveType}:上下轴到达取料高点");
                    break;
                case MoveStep.StoreTS08:
                    MoveInfo.NextMoveStep(MoveStep.StoreTS09);
                    ZAxis.AbsMove(MoveInfo, Config.Zaxis_P1, Config.Zaxis_P1_speed);
                    IgnoreX09 = false;
                    MoveInfo.log($"{storeMoveType}:进出轴到达待机点");
                    break;
                case MoveStep.StoreTS09:
                    GetCamera(From.Zaxis_P2).CameraGrabOne(RobotManage.CameraA.GetFixtureStateFilename(From.posid, WareCode, storeMoveType, FixtureState.FromOut));
                    RobotManage.CameraB.CameraGrabOne(RobotManage.CameraA.GetFixtureStateFilename(From.posid, WareCode, storeMoveType, FixtureState.FromOutSide));
                    if (IOManager.IOValue(IO_Type.SideA_ForkMaterial_Check).Equals(IO_VALUE.HIGH) ||
                        IOManager.IOValue(IO_Type.SideB_ForkMaterial_Check).Equals(IO_VALUE.HIGH))
                    {
                        Msg.add("伸缩叉2侧X10/X11检测到有物料无法继续,请检查", MsgLevel.alarm);
                        RobotManage.UserPause("伸缩叉2侧X10/X11检测到有物料无法继续,请检查");
                    }
                    else if (!IgnoreX09 && IOManager.IOValue(IO_Type.ForkMaterial_Check).Equals(IO_VALUE.LOW))
                    {
                        Msg.add("出库时伸缩叉X09没有检测到有物料无法继续,请检查", MsgLevel.alarm,ErrInfo.X09_BoxNotDetect);
                        RobotManage.UserPause("出库时伸缩叉X09没有检测到有物料无法继续,请检查");
                    }
                    else
                    {
                        IgnoreX09 = false;
                        MoveInfo.NextMoveStep(MoveStep.StoreTS10);
                        if (isNotSameSide(To.Xaxis_P2, To.Yaxis_PL))
                        {
                            YAxis.AbsMove(MoveInfo, Config.Yaxis_P1, Config.Yaxis_P1_speed);
                            XAxis.AbsMove(MoveInfo, Config.Xaxis_P1, Config.Xaxis_P1_speed);
                            MoveInfo.log($"{storeMoveType}:上下轴,行走机构返回待机点P1");
                        }
                        InOutEndProcess(StoreMoveType.OutStore, From.posid);
                    }
                    break;
                case MoveStep.StoreTS10:
                    MoveInfo.NextMoveStep(MoveStep.StoreTS12);
                    XAxis.AbsMove(MoveInfo, To.Xaxis_P2, Config.Xaxis_P2_speed);
                    MoveInfo.log($"{storeMoveType}:行走机构到达目的地");
                    YAxis.AbsMove(MoveInfo, To.Yaxis_PH, Config.Yaxis_P1_speed);
                    MoveInfo.log($"{storeMoveType}:上下轴到达目的地高点");
                    break;
                case MoveStep.StoreTS11:
                    MoveInfo.NextMoveStep(MoveStep.StoreTS12);                    
                    break;
                case MoveStep.StoreTS12:
                    MoveInfo.NextMoveStep(MoveStep.StoreTS13);
                    ZAxis.AbsMove(MoveInfo, To.Zaxis_P2, Config.Zaxis_P2_speed);
                    MoveInfo.log($"{storeMoveType}:进出轴到达目的地");
                    break;
                case MoveStep.StoreTS13:
                    if (To != null)
                        GetCamera(To.Zaxis_P2).CameraGrabOne(RobotManage.CameraA.GetFixtureStateFilename(To.posid, WareCode, storeMoveType, FixtureState.ToIn));
                    if (From!=null)
                        RobotManage.CameraB.CameraGrabOne(RobotManage.CameraA.GetFixtureStateFilename(From.posid, WareCode, storeMoveType, FixtureState.ToInSide));
                    MoveInfo.NextMoveStep(MoveStep.StoreTS14);
                    YAxis.AbsMove(MoveInfo, To.Yaxis_PL, Config.Yaxis_P4_speed);
                    MoveInfo.log($"{storeMoveType}:上下轴到达目的地低点");
                    break;
                case MoveStep.StoreTS14:
                    MoveInfo.NextMoveStep(MoveStep.StoreTS15);
                    ZAxis.AbsMove(MoveInfo, Config.Zaxis_P1, Config.Zaxis_P1_speed);
                    MoveInfo.log($"{storeMoveType}:进出轴到达待机点");
                    break;
                case MoveStep.StoreTS15:
                    GetCamera(To.Zaxis_P2).CameraGrabOne(RobotManage.CameraA.GetFixtureStateFilename(To.posid, WareCode, storeMoveType, FixtureState.ToOut));
                    if (From != null) 
                        RobotManage.CameraB.CameraGrabOne(RobotManage.CameraA.GetFixtureStateFilename(From.posid, WareCode, storeMoveType, FixtureState.ToOutSide));
                    if (IOManager.IOValue(IO_Type.SideA_ForkMaterial_Check).Equals(IO_VALUE.HIGH) ||
                        IOManager.IOValue(IO_Type.SideB_ForkMaterial_Check).Equals(IO_VALUE.HIGH))
                    {
                        Msg.add("伸缩叉2侧X10/X11检测到有物料无法继续,请检查", MsgLevel.alarm);
                        RobotManage.UserPause("伸缩叉2侧X10/X11检测到有物料无法继续,请检查");
                    }
                    else if (IOManager.IOValue(IO_Type.ForkMaterial_Check).Equals(IO_VALUE.HIGH))
                    {
                        Msg.add("入库后伸缩叉X09上任然检测到物料,请检查", MsgLevel.alarm);
                        RobotManage.UserPause("入库后伸缩叉X09上任然检测到物料,请检查");
                    }
                    else
                    {
                        MoveInfo.NextMoveStep(MoveStep.StoreTS16);
                        MoveInfo.log($"{storeMoveType}:安全检查");
                    }
                    break;
                case MoveStep.StoreTS16:
                    MoveInfo.NextMoveStep(MoveStep.StoreTS17);
                    YAxis.AbsMove(MoveInfo, Config.Yaxis_P1, Config.Yaxis_P1_speed);
                    XAxis.AbsMove(MoveInfo, Config.Xaxis_P1, Config.Xaxis_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;
        }
    }
}