OutShelfBean.cs 11.3 KB
using OnlineStore;
using OnlineStore.Common;
using OnlineStore.DeviceLibrary;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DeviceLibrary
{
    public class OutShelfBean
    {
        public string Name;
        //agv小车检测
        public string Agv_Detect = "Agv_Detect";

        //出料口前端料格检测
        public string Shelf_Front_Check = "Shelf_Front_Check";

        //出料口后端料格检测
        public string Shelf_Back_Check = "Shelf_Back_Check";

        //出料口定位上升端
        public string Location_Up = "Location_Up";

        //出料口定位下降端,
        public string Location_Down = "Location_Down";

        //电机正传
        public static string Moto_Fwd = "Moto_Fwd";
        //电机反转
        public static string Moto_Rwd = "Moto_Rwd";

        MoveInfo MoveInfo;
        public string ErrMsgTxt = ""; 
        private MainMachine mainMachine;
        /// <summary>
        /// 出料口定位气缸,high=up,low=down
        /// </summary>
        private CylinderManger locationCylinder;

        public string currShelfRfid;

        public TrayInfo CurrShelf;



        public OutShelfBean(string name )
        {
            this.Name = name;  
            MoveInfo = new MoveInfo(name, false);

            #region 初始化IO
            string ioStr = name + "_";
            Agv_Detect = ioStr + Agv_Detect;
            Shelf_Front_Check = ioStr + Shelf_Front_Check;
            Shelf_Back_Check = ioStr + Shelf_Back_Check;
            Location_Up = ioStr + Location_Up;
            Location_Down = ioStr + Location_Down;
            Moto_Fwd = ioStr + Moto_Fwd;
            Moto_Rwd = ioStr + Moto_Rwd;

            locationCylinder = new CylinderManger(name + "出料口定位", Location_Up, Location_Down);
            #endregion
        }
        public void Reset()
        {
            MoveInfo.NewMove(MoveStep.SR01_LocationDown);
            MoveInfo.log("执行重置,定位气缸下降");
            locationCylinder.ToLow(MoveInfo);
            ErrMsgTxt = "";
            pause = false;

        }
        private StoreMoveType storeMoveType = StoreMoveType.None;

        bool PreMove = false;

        public bool ShelfValid()
        {
            //料架是否有效可放料
            if (currShelfRfid != "")
            {
                if (MoveInfo.MoveStep.Equals(MoveStep.S10_ShelfReady)||MoveInfo.MoveStep.Equals(MoveStep.S11_PutReel))
                {
                    return true;
                }
            }
            return false;
        }
        public bool ShelfReady()
        {
            if (MoveInfo.MoveStep.Equals(MoveStep.S10_ShelfReady))
            {
                return true;
            }
            return false;
        }
        public bool StartPutReel()
        {
            if (ShelfReady())
            {
                MoveInfo.NewMove(MoveStep.S11_PutReel);
                MoveInfo.log("开始放料");
                return true;
            }
            return false;
        }
        bool pause = false;
        public void Pause()
        {
            pause = true;
        }
        public void Resume()
        {
            pause = false;
        }
        private void LineFRun(MoveInfo move = null)
        {
            lineMove(IO_VALUE.LOW, IO_VALUE.HIGH, move); 
        }
        private void LineRRun(MoveInfo move = null)
        {
            lineMove(IO_VALUE.HIGH, IO_VALUE.LOW, move); 
        }
        private void LineStopRun(MoveInfo move = null)
        {
            lineMove(IO_VALUE.LOW, IO_VALUE.LOW, move);  
        }
        private void lineMove(IO_VALUE rValue,IO_VALUE fValue,MoveInfo move)
        {
            IOManager.IOMove(Moto_Rwd, rValue);
            IOManager.IOMove(Moto_Fwd, fValue);
            if (move != null)
            {
                move.WaitList.Add(WaitResultInfo.WaitIO(Moto_Fwd, fValue));
                move.WaitList.Add(WaitResultInfo.WaitIO(Moto_Rwd, rValue));
            }
        }
        public bool Process()
        {
            if (pause)
                return false;
            if (mainMachine.CheckWait(MoveInfo))
                return false;

            switch (MoveInfo.MoveStep)
            {
                case MoveStep.Wait:
                    //判断定位气缸是否下降到位
                    if (locationCylinder.IsLow())
                    {
                        if (IOManager.IOValue(Shelf_Front_Check).Equals(IO_VALUE.HIGH) || IOManager.IOValue(Shelf_Back_Check).Equals(IO_VALUE.HIGH))
                        {
                            //默认是进来的料架 
                            MoveInfo.NewMove(MoveStep.S02_LineFRun);
                            MoveInfo.log("检测到料架信号,电机正传");
                            LineFRun();
                            //等待后端料格检测
                            MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(Shelf_Front_Check, IO_VALUE.HIGH));
                        }
                        else if (IOManager.IOValue(Agv_Detect).Equals(IO_VALUE.HIGH))
                        {
                            //小车已到位
                            //默认是进来的料架 
                            MoveInfo.NewMove(MoveStep.S02_LineFRun);
                            MoveInfo.log("检测到AGV小车,电机正传");
                            LineFRun();
                            //等待后端料格检测
                            MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(Shelf_Front_Check, IO_VALUE.HIGH));
                        }
                    }
                    break;
                case MoveStep.SR01_LocationDown:
                    MoveInfo.NewMove(MoveStep.Wait);
                    MoveInfo.log("复位完成");
                    break;
                case MoveStep.S02_LineFRun:
                    MoveInfo.NewMove(MoveStep.S04_WaitTime);
                    MoveInfo.log("检测到料架前端信号,再转动1秒钟");
                    LineFRun();
                    //等待后端料格检测
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(Shelf_Front_Check, IO_VALUE.HIGH));
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                    break;


                case MoveStep.S04_WaitTime:
                    MoveInfo.NewMove(MoveStep.S05_LocationUp);
                    MoveInfo.log("电机停止,定位气缸上升");
                    LineStopRun();
                    locationCylinder.ToHigh(MoveInfo);
                    break;
                case MoveStep.S05_LocationUp:
                    MoveInfo.NextMoveStep(MoveStep.S06_ReadRFID);
                    MoveInfo.log("读取RFID");
                    MoveInfo.NextMoveStep(MoveStep.S10_ShelfReady);
                    break;
                case MoveStep.S10_ShelfReady:
                    break;

                case MoveStep.S11_PutReel:
                    break;

                case MoveStep.S21_ShelfNeedLeave:

                    //呼叫AGV小车

                    break;

                case MoveStep.S22_WaitAGV:

                    //呼叫agv拉料

                    break;
                case MoveStep.S23_AgvDetect:
                    MoveInfo.NextMoveStep(MoveStep.S24_LocationDown);
                    MoveInfo.log("定位气缸下降");
                    locationCylinder.ToLow(MoveInfo);
                    break;
                case MoveStep.S24_LocationDown:
                    MoveInfo.NextMoveStep(MoveStep.S25_LineRRun);
                    MoveInfo.log("电机反转");
                    LineRRun();
                    break;
                case MoveStep.S25_LineRRun:
                    MoveInfo.NextMoveStep(MoveStep.S26_ShelfBackHigh);
                    MoveInfo.log("等待后端检测信号亮");
                    LineRRun();
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(Shelf_Back_Check, IO_VALUE.HIGH));
                    break;
                case MoveStep.S26_ShelfBackHigh:
                    MoveInfo.NextMoveStep(MoveStep.S27_ShelfBackLow);
                    MoveInfo.log("等待后端检测信号灭");
                    LineRRun();
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(Shelf_Back_Check, IO_VALUE.LOW));
                    break;
                case MoveStep.S27_ShelfBackLow:
                    MoveInfo.NextMoveStep(MoveStep.S28_WaitTime);
                    MoveInfo.log("继续转动2秒");
                    LineRRun();
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(Shelf_Back_Check, IO_VALUE.LOW));
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(2000));
                    break;
                case MoveStep.S28_WaitTime:
                    MoveInfo.NextMoveStep(MoveStep.Wait);
                    MoveInfo.log("料架已离开");
                    LineStopRun();
                    break;
                default:
                    MoveInfo.log($"{storeMoveType}:未找到对应步骤:{MoveInfo.MoveStep}");
                    return true;
            }

            return false;
        }

        bool movelock = false;
        internal void Lock()
        {
            movelock = true;
        }
        internal void Unlock()
        {
            movelock = false;
        }
        public bool IsDis()
        {
           
            return false;
        }
        internal bool IsRightShelf(TrayInfo CurrTray, out string ShelfPosId)
        {
            ShelfPosId = "";
            if (IsDis())
            {
                return false;
            }
            if (ShelfValid())
            {
                if (CurrShelf.realRFID.Equals(CurrTray.realRFID))
                {
                    if (String.IsNullOrEmpty(CurrShelf.rfid))
                    {
                        CurrShelf.rfid = CurrTray.rfid;
                        LogUtil.info(Name + "增加虚拟料架号绑定:" + CurrShelf.ToStr());
                    }
                    ShelfPosId = Name + CurrTray.shelfP;
                    return true;
                }
                else if (String.IsNullOrEmpty(CurrTray.realRFID))
                {
                    if ((!CurrShelf.rfid.Equals("")) && CurrShelf.rfid.Equals(CurrTray.rfid))
                    {
                        CurrTray.realRFID = CurrShelf.realRFID;
                        ShelfPosId = Name + CurrTray.shelfP;
                        return true;
                    }
                    if (!String.IsNullOrEmpty(CurrTray.usedRfidList))
                    {
                        string[] array = CurrTray.usedRfidList.Split(',');
                        //若料架已使用过,直接返回false
                        if (array.Contains(CurrShelf.realRFID))
                        {
                            return false;
                        }
                    }
                    if (CurrShelf.rfid.Equals(""))
                    {
                        CurrShelf.rfid = CurrTray.rfid;
                        CurrTray.realRFID = CurrShelf.realRFID;
                        LogUtil.info(Name + "增加虚拟料架号绑定:" + CurrShelf.ToStr());
                        ShelfPosId = Name + CurrTray.shelfP;
                        return true;
                    }
                }
            }

            return false;
        }

    }

}