InReelBean.cs 7.8 KB
using OnlineStore.Common; 
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

namespace DeviceLibrary
{
  public  class InReelBean:BaseBean
    {
     
        //料盘检测信号
        public string Reel_Check = "Reel_Check"; 
       

        //private string LastCode;
        private List<CodeLibrary.CodeInfo> LastCode;

        public TrayInfo CurrTray = new TrayInfo();

        public string PosName;

        public InReelBean(string name  )
        {
            this.Name = name;
            this.PosName = name;
            MoveInfo = new MoveInfo(name );

            #region 初始化IO
            string ioStr = name + "_";
            Reel_Check = ioStr + Reel_Check; 
            #endregion
        }
       

        public void Reset()
        {
            MoveInfo.NewMove(MoveStep.Wait);
            MoveInfo.log("执行重置,清理当前条码:"+LastCode);
            LastCode = new List<CodeLibrary.CodeInfo>();
            SetWarnMsg();  
        }

        public bool ReelReady()
        {
            if (MoveInfo.MoveStep.Equals(MoveStep.IN05_ReelReady))
            {
                return true;
            }
            return false;
        }
        public void ReelLeave()
        {
            MoveInfo.NewMove(MoveStep.Wait);
            MoveInfo.log("料盘已离开:执行重置,清理当前条码:" + LastCode);
            LastCode = new List<CodeLibrary.CodeInfo> ();
            SetWarnMsg();
        }

        bool pause = false;
        public void Pause()
        {
            pause = true;
        }
        public void Resume()
        {
            pause = false;
        }

        private Stopwatch reelCheckWatch = new Stopwatch();
        
        public bool Process()
        {
            if (pause)
                return false;
            if (RobotManage.mainMachine.CheckWait(MoveInfo))
            {
                return false;
            }
            switch (MoveInfo.MoveStep)
            {
                case MoveStep.Wait:
                    //判断定位气缸是否下降到位
                    if (IOManager.IOValue(Reel_Check).Equals(IO_VALUE.HIGH))
                    {
                        if (RobotManage.checkWatch(reelCheckWatch, 1000, true))
                        {
                            //默认是进来的料架 
                            MoveInfo.NewMove(MoveStep.IN01_WaitCheck);
                            MoveInfo.log("检测到料盘信号");
                            MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(Reel_Check, IO_VALUE.HIGH));
                            SetWarnMsg();
                        }
                    }
                    else
                    {
                        reelCheckWatch.Reset();
                    }
                    break;
                case MoveStep.IN01_WaitCheck:
                    IN02_ScanCode();
                    break;
                case MoveStep.IN02_ScanCode:
                    if (ScanCodeTask == null || ScanCodeTask.IsCompleted)
                    {
                        MoveInfo.NewMove(MoveStep.IN03_GetPos);
                        MoveInfo.log("获取库位号");
                    }
                    else if (MoveInfo.IsTimeOut(60))
                    {
                        SetWarnMsg( MoveInfo.Name + "[" + MoveInfo.MoveStep + "] 扫码执行结束超时 [" + Math.Round(MoveInfo.StepSpan().TotalSeconds, 1) + "]秒");
                    }
                    break;
                case MoveStep.IN03_GetPos:
                    if (GetPosTask == null || GetPosTask.IsCompleted)
                    {
                        MoveInfo.NewMove(MoveStep.IN05_ReelReady);
                        MoveInfo.log("料盘已准备好,等待取料");
                    }
                    else if (MoveInfo.IsTimeOut(60))
                    {
                        SetWarnMsg( MoveInfo.Name + "[" + MoveInfo.MoveStep + "] 获取库位号超时 [" + Math.Round(MoveInfo.StepSpan().TotalSeconds, 1) + "]秒");
                    }
                    break;
                case MoveStep.IN05_ReelReady:
                    break;
                default:
                    MoveInfo.log($" 未找到对应步骤:{MoveInfo.MoveStep}");
                    return true;
            }

            return false;
        }

        private Task ScanCodeTask = null;
        private Task GetPosTask = null;

        private void IN02_ScanCode()
        {
            try
            {
                MoveInfo.NewMove(MoveStep.IN02_ScanCode);
                MoveInfo.log("开始扫码");
                ScanCodeTask = Task.Factory.StartNew(delegate
                {
                    string[] cameraName=Setting_Init.CameraScan_IN_2;
                    if (Name.Contains("1"))
                    {
                        cameraName = Setting_Init.CameraScan_IN_1;
                    } 
                     LastCode= CodeManager.CameraScan(cameraName.ToList());
                    MoveInfo.log("扫码完成:");
                });
            }
            catch (Exception ex)
            {
                LogUtil.error("IN02_ScanCode 扫码出错:", ex);
            }
        }
        private void IN03_GetPos()
        {
            try
            {
                MoveInfo.NewMove(MoveStep.IN03_GetPos);
                string codestr = CodeManager.ProcessCode(LastCode);
                if (LastCode.Count <= 0 || codestr.Equals(""))
                {
                    CurrTray = TrayInfo.newNgTray(codestr, "扫码失败");
                    MoveInfo.log("未扫到条码,直接NG ");
                }
                else
                {
                    MoveInfo.log("获取库位号: " + codestr);
                    GetPosTask = Task.Factory.StartNew(delegate
                    {
                        while (MoveInfo.MoveStep.Equals(MoveStep.IN03_GetPos))
                        {
                            string shelfRfid = RobotManage.mainMachine.getReadyShelf();
                            if (String.IsNullOrEmpty(shelfRfid))
                            {
                                //无可用料架
                                SetWarnMsg( $"{Name}:{codestr}暂无可用料架");
                                MoveInfo.errlog("获取库位号: " + WarnMsg + ",等待3秒后重新获取");
                                Thread.Sleep(3000);
                            }
                            else
                            {
                                ClearWarnMsg("暂无可用料架");
                                //获取库位号
                                string outMsg = "";
                                CurrTray = HttpServer.GetLocation(codestr, shelfRfid, out outMsg);
                                //需要取放料,且料架已准备好 
                                if (outMsg.Equals(""))
                                {
                                    ClearWarnMsg("getLocation");
                                    MoveInfo.log("获取位置成功:" + CurrTray.ToStr());
                                }
                                else
                                {
                                    SetWarnMsg( " getLocation " + outMsg);
                                }
                                break;
                            }
                        } 
                    });
                }
            }
            catch (Exception ex)
            {
                LogUtil.error("IN03_GetPos 扫码出错:", ex);
            }
        }

     

        bool movelock = false;
        internal void Lock()
        {
            movelock = true;
        }
        internal void Unlock()
        {
            movelock = false;
        }

    }
}