BoxTransport.cs 19.0 KB
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 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.rightdoor || To.posid == BoxStorePosition.leftdoor) && 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 = "";
        bool PreMove = false;
        public bool Start(BoxStorePosition from, BoxStorePosition to, StoreMoveType _storeMoveType, string warecode, bool premove = false)
        {

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

            WareCode = warecode;
            storeMoveType = _storeMoveType;
            PreMove = premove;
            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 == null ? "None" : 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;

            if (y_to <= Config.Yaxis_P1)
                return true;

            if (dty <= Config.Yaxis_P1)
                return true;

            //从外侧到内测,判断目标位置是否小于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)
            {

            }

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


            if (From.posid == BoxStorePosition.rightdoor || From.posid == BoxStorePosition.leftdoor)
            {
                if (InOutDevice.InOutDeviceList[From.CurrentSide].InWaitBoxLeave)
                {
                    MoveInfo.NextMoveStep(MoveStep.StoreTS06);
                    MoveInfo.log($"{storeMoveType}:{From.CurrentSide}:防护门打开");
                    InOutDevice.InOutDeviceList[From.CurrentSide].OpenDoor(MoveInfo);
                }
                else
                {
                    if (MoveInfo.IsTimeOut(10))
                    {
                        Msg.add("等待入库料箱升降台到位", MsgLevel.warning);
                        MoveInfo.log($"{storeMoveType}:等待入库料箱升降台到位");
                    }
                }
            }
            else
                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.SideA_ForkMaterial_Check).Equals(IO_VALUE.HIGH) ||
                        IOManager.IOValue(IO_Type.SideB_ForkMaterial_Check).Equals(IO_VALUE.HIGH))
                    {
                        if(IOMonitor.IODebound(IO_Type.SideA_ForkMaterial_Check,Config,IO_VALUE.HIGH,2000)||
                           IOMonitor.IODebound(IO_Type.SideB_ForkMaterial_Check, Config, IO_VALUE.HIGH, 2000))
                        {
                            Msg.add("伸缩叉2侧X06/X07检测到有物料无法继续,请检查", MsgLevel.alarm);
                            RobotManage.UserPause("伸缩叉2侧X06/X07检测到有物料无法继续,请检查");
                        }

                    }
                    else if (IOManager.IOValue(IO_Type.ForkMaterial_Check).Equals(IO_VALUE.HIGH))
                    {
                        Msg.add("出库时伸缩叉X05检测到有物料无法继续,请检查", MsgLevel.alarm);
                        RobotManage.UserPause("出库时伸缩叉X05检测到有物料无法继续,请检查");
                    }
                    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");
                    //}
                    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.StoreTS04:
                    MoveInfo.NextMoveStep(MoveStep.StoreTS05);
                    //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:
                    if (!PreMove)
                    {
                        //if (From.posid == BoxStorePosition.rightdoor || From.posid == BoxStorePosition.leftdoor)
                        //{
                        //    if (InOutDevice.InOutDeviceList[From.CurrentSide].InWaitBoxLeave)
                        //    {
                        //        MoveInfo.NextMoveStep(MoveStep.StoreTS06);                                
                        //        MoveInfo.log($"{storeMoveType}:{From.CurrentSide}:防护门打开");
                        //        InOutDevice.InOutDeviceList[From.CurrentSide].OpenDoor(MoveInfo);
                        //    }
                        //    else
                        //    {
                        //        if (MoveInfo.IsTimeOut(10))
                        //        {
                        //            Msg.add("等待入库料箱升降台到位", MsgLevel.warning);
                        //            MoveInfo.log($"{storeMoveType}:等待入库料箱升降台到位");
                        //        }
                        //    }
                        //}
                        //else
                        //{
                        //    MoveInfo.NextMoveStep(MoveStep.StoreTS06);
                        //    MoveInfo.log($"{BoxStorePosition.rightdoor}:{BoxStorePosition.leftdoor}");

                        //    MoveInfo.log($"{storeMoveType}:{From.posid}:{From.posid == BoxStorePosition.rightdoor}:{From.posid == BoxStorePosition.leftdoor}");
                        //}
                        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))
                    {
                        if (IOMonitor.IODebound(IO_Type.SideA_ForkMaterial_Check, Config, IO_VALUE.HIGH, 2000) ||
                            IOMonitor.IODebound(IO_Type.SideB_ForkMaterial_Check, Config, IO_VALUE.HIGH, 2000))
                        {
                            Msg.add("伸缩叉2侧X06/X07检测到有物料无法继续,请检查", MsgLevel.alarm);
                            RobotManage.UserPause("伸缩叉2侧X06/X07检测到有物料无法继续,请检查");
                        }

                    }
                    else if (!IgnoreX09 && IOManager.IOValue(IO_Type.ForkMaterial_Check).Equals(IO_VALUE.LOW))
                    {
                        Msg.add("出库时伸缩叉X05没有检测到有物料无法继续,请检查", MsgLevel.alarm, ErrInfo.X09_BoxNotDetect);
                        RobotManage.UserPause("出库时伸缩叉X05没有检测到有物料无法继续,请检查");
                    }
                    else
                    {
                        IgnoreX09 = false;
                        MoveInfo.NextMoveStep(MoveStep.StoreTS10);
                        if (From.posid == BoxStorePosition.rightdoor || From.posid == BoxStorePosition.leftdoor)
                            InOutDevice.InOutDeviceList[From.CurrentSide].CloseDoor(MoveInfo);
                        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.StoreTS11);
                    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:
                    if (To.posid == BoxStorePosition.rightdoor || To.posid == BoxStorePosition.leftdoor)
                    {
                        if (!InOutDevice.InOutDeviceList[To.CurrentSide].IsOutLiftEmpty)
                        {
                            if (MoveInfo.IsTimeOut(20))
                                Msg.add("等待出口顶升清空周转箱", MsgLevel.warning);
                            return false;
                        }
                        MoveInfo.NextMoveStep(MoveStep.StoreTS12);
                        InOutDevice.InOutDeviceList[To.CurrentSide].OpenDoor(MoveInfo);
                        return false;
                    }
                    else
                        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))
                    {
                        if (IOMonitor.IODebound(IO_Type.SideA_ForkMaterial_Check, Config, IO_VALUE.HIGH, 2000) ||
                             IOMonitor.IODebound(IO_Type.SideB_ForkMaterial_Check, Config, IO_VALUE.HIGH, 2000))
                        {
                            Msg.add("伸缩叉2侧X06/X07检测到有物料无法继续,请检查", MsgLevel.alarm);
                            RobotManage.UserPause("伸缩叉2侧X06/X07检测到有物料无法继续,请检查");
                        }
                    }
                    else if (IOManager.IOValue(IO_Type.ForkMaterial_Check).Equals(IO_VALUE.HIGH))
                    {
                        Msg.add("入库后伸缩叉X05上任然检测到物料,请检查", MsgLevel.alarm);
                        RobotManage.UserPause("入库后伸缩叉X05上任然检测到物料,请检查");
                    }
                    else
                    {
                        MoveInfo.NextMoveStep(MoveStep.StoreTS16);
                        if (To.posid == BoxStorePosition.rightdoor || To.posid == BoxStorePosition.leftdoor)
                            InOutDevice.InOutDeviceList[To.CurrentSide].CloseDoor(MoveInfo);
                        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;
        }
    }
}