OutTrayLineBean.cs 11.3 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 OnlineStore.DeviceLibrary
{
    /// <summary>
    /// 出料皮带线
    /// </summary>
    public class OutTrayLineBean
    {
        private DischargeLine equipBean = null;
        private string Line3_TrayCheck = "";
        //入口定位信号
        private string EntryLocation_Check = "";
        //出口定位信号
        private string ExitLocation_Check = "";
        //出口料盘检测信号
        private string ExitTray_Check = "";
        //出口料盘检测信号
        private string LineRun_Do = "";
        //最后一盘料的位置,>5时可置为0,0表示当前皮带线无料盘
        public  int LastTrayPosition = 0;
        private string Name = "";
        private LineTurnBean lineRun = null;
        internal LineMoveInfo MoveInfo = null;

        internal bool Line3CanRun = true ;
        public OutTrayLineBean(string name, string entryLocationS, string exitLocationS, string exittrayS, string lineRundo, string line3checkDi, DischargeLine equipBean)
        {
            lineRun = new LineTurnBean(equipBean.DeviceID);
            this.equipBean = equipBean;
            this.Name = name;
            MoveInfo = new LineMoveInfo(1001, name);
            this.EntryLocation_Check = entryLocationS;
            this.ExitLocation_Check = exitLocationS;
            this.ExitTray_Check = exittrayS;
            this.LineRun_Do = lineRundo;
            this.Line3_TrayCheck = line3checkDi;
        }

        public void StopRun()
        {
            MoveInfo.EndMove();
            lineRun.StopLineRun();
            Line3CanRun = true;
        }
        #region 出库处理
        private string posId = "";
        public bool StartOut(InOutParam moveParam)
        {
            if (MoveInfo.MoveType.Equals(LineMoveType.None))
            {
                MoveInfo.MoveParam = moveParam;
                MoveInfo.NewMove(LineMoveType.OutStore);
                posId = MoveInfo.MoveParam != null ? MoveInfo.MoveParam.PosId : "";
                MoveInfo.NextMoveStep(LineMoveStep.DLO_01_WaitEntryNoTray);
                LogUtil.info(Name + "开始出料【" + moveParam.PosId + "】处理:" + MoveInfo.SLog + "等待入口无料盘");
                MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                return true;
            }
            else
            {
                LogUtil.error(Name + " 启动出料【" + moveParam.PosId + "】 失败");
                return false;
            }
        }


        internal void OutStoreProcess()
        {
            if (MoveInfo.IsInWait)
            {
                equipBean.CheckWait(MoveInfo);
            }

            if (MoveInfo.IsInWait)
            {
                return;
            }

            if (MoveInfo.MoveStep.Equals(LineMoveStep.DLO_01_WaitEntryNoTray))
            {
                MoveInfo.NextMoveStep(LineMoveStep.DLO_02_WaitExitNoTray);
                LogUtil.info(Name + "出料【" + posId + "】:" + MoveInfo.SLog + "等待出口无料盘");
                MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
            }
            else if (MoveInfo.MoveStep.Equals(LineMoveStep.DLO_02_WaitExitNoTray))
            {
                MoveInfo.NextMoveStep(LineMoveStep.DLO_03_LineRun);
                LogUtil.info(Name + "出料【" + posId + "】:" + MoveInfo.SLog + "入口出口都没有料盘,转动皮带线到入口定位亮");
                MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                lineRun.StartLineRun(LineRun_Do, EntryLocation_Check, null);
            }
            else if (MoveInfo.MoveStep.Equals(LineMoveStep.DLO_03_LineRun))
            {
                if (lineRun.InTurn.Equals(false))
                {
                    MoveInfo.NextMoveStep(LineMoveStep.DLO_04_CanReviceTray);
                    LogUtil.info(Name + "出料【" + posId + "】:" + MoveInfo.SLog + "可以放入料盘,------------等待移栽放下料盘--------");
                    if (equipBean.IsDebug)
                    { MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000)); }
                }
            }
            else if (MoveInfo.MoveStep.Equals(LineMoveStep.DLO_04_CanReviceTray))
            {
                if (equipBean.IsDebug)
                {

                    MoveInfo.NextMoveStep(LineMoveStep.DLO_05_TrayIsOk);
                    LogUtil.info(Name + "出料【" + posId + "】:" + MoveInfo.SLog + "移栽放下料盘后更新为已放料盘");
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                }
            }
            else if (MoveInfo.MoveStep.Equals(LineMoveStep.DLO_05_TrayIsOk))
            {
                MoveInfo.NextMoveStep(LineMoveStep.DLO_06_LineRun_OutLocation_Check);
                LogUtil.info(Name + "出料【" + posId + "】:" + MoveInfo.SLog + "------------料盘已放下--------皮带线转动到出口定位信号亮");
                LastTrayPosition = 1;
                lineRun.StartLineRun(LineRun_Do, ExitLocation_Check,null);
            }
            else if (MoveInfo.MoveStep.Equals(LineMoveStep.DLO_06_LineRun_OutLocation_Check))
            {
                if (lineRun.InTurn.Equals(false))
                {
                    DLO_07_LineRun();
                }

            }
            else if (MoveInfo.MoveStep.Equals(LineMoveStep.DLO_07_LineRun))
            {
                if (lineRun.InTurn.Equals(false))
                { 

                    if (equipBean.IOValue(ExitTray_Check).Equals(IO_VALUE.HIGH))
                    {
                        if (LastTrayPosition > 5)
                        {
                            MoveInfo.NextMoveStep(LineMoveStep.DLO_08_ExitNoTray);
                            LogUtil.info(Name + "出料【" + posId + "】:" + MoveInfo.SLog + "最后一盘料位置【" + LastTrayPosition + "】,请检查" + ExitTray_Check + "信号是否正确");
                        }
                        else
                        {
                            DLO_07_LineRun();
                        }
                    }
                    else
                    {
                        MoveInfo.NextMoveStep(LineMoveStep.DLO_08_ExitNoTray);
                    }

                }
            }
            else if (MoveInfo.MoveStep.Equals(LineMoveStep.DLO_08_ExitNoTray))
            {
                MoveInfo.EndMove();
                LogUtil.info(Name + "出料【" + posId + "】:出口无料盘,出库结束");
            }
        }

        private void DLO_07_LineRun()
        {
            if (equipBean.IOValue(ExitTray_Check).Equals(IO_VALUE.HIGH))
            {
                //皮带线不转,并且入口无信号
                if (equipBean.Line3Turn.InTurn.Equals(false) && equipBean.IOValue(Line3_TrayCheck).Equals(IO_VALUE.LOW))
                {
                    Line3CanRun = false;
                    if (Line3_TrayCheck.Equals(IO_Type.EntryTray_Check3))
                    {
                        equipBean.Line3LastTrayP = 1;
                    } 
                }
                else
                {
                    return;
                }
            }
            MoveInfo.NextMoveStep(LineMoveStep.DLO_07_LineRun);
            LogUtil.info(Name + "出料【" + posId + "】:" + MoveInfo.SLog + "最后一盘料位置【" + LastTrayPosition + "】,出口有料盘,继续转动一个工位");
            lineRun.StartLineRun(LineRun_Do, ExitLocation_Check,LineEndProcess);

        }

        public void LineStartTurn()
        {
            LogUtil.info(Name + "转动一个工位");
            lineRun.StartLineRun(LineRun_Do, ExitLocation_Check,LineEndProcess); 
        }
        /// <summary>
        /// 转动结束,最后一盘料的位置+1
        /// </summary>
        /// <param name="result"></param>
        public void LineEndProcess(bool result)
        {
            if (result&&LastTrayPosition>0)
            { 
                LastTrayPosition++;
                Line3CanRun = true;
            }
        }
        #endregion

    }

    public class LineTurnBean
    {
        public delegate void TurnEndDel(bool result);
        public TurnEndDel turnEnd = null;
        public bool InTurn = false;
        private string LastMoveDO = "";
        private string LastCheckDI = "";
        private int subType = 0;

        public LineTurnBean(int subType)
        {
            this.subType = subType;
        }
        public void StopLineRun()
        {
            if (InTurn)
            {
                InTurn = false;
            }
        }
        public void StartLineRun(string moveDO, string checkDI, TurnEndDel endProcess, int timeOutMS = 30000)
        {
            InTurn = true;
            this.turnEnd = endProcess;
            Task.Factory.StartNew(delegate
            {
                LineRunAndWait(moveDO, checkDI, timeOutMS);
            });
        }

        private string LineRunAndWait(string moveDO, string checkDI, int timeOutMS = 30000)
        {
            LastMoveDO = moveDO;
            LastCheckDI = checkDI;
            LogUtil.info("开始转动:" + moveDO);
            IOManager.IOMove(moveDO, IO_VALUE.HIGH, subType);
            InTurn = true;
            DateTime startTime = DateTime.Now;
            string result = "";
            bool isStop = false;
            //先等待信号灭一次,然后再亮时停止
            while (true)
            {
                Thread.Sleep(20);
                TimeSpan span = DateTime.Now - startTime;
                if (!InTurn)
                {
                    isStop = true;
                    result = "手动停止";
                }
                else if (span.TotalMilliseconds > timeOutMS)
                {
                    isStop = true;
                    result = "转动超时";
                }
                //判断Buzy及位置是否结束
                else if (IOManager.IOValue(checkDI, subType).Equals(IO_VALUE.LOW))
                {
                    isStop = true;
                }
                if (isStop)
                {
                    LogUtil.info("验证" + checkDI + "=Low结束:" + result);
                    break;
                }
            }
            result = "";
            isStop = false;
            while (true)
            {
                Thread.Sleep(20);
                TimeSpan span = DateTime.Now - startTime;
                if (!InTurn)
                {
                    isStop = true;
                    result = "手动停止";
                }
                else if (span.TotalMilliseconds > timeOutMS)
                {
                    isStop = true;
                    result = "转动超时";
                }
                //判断Buzy及位置是否结束
                else if (IOManager.IOValue(checkDI, subType).Equals(IO_VALUE.HIGH))
                {
                    isStop = true;
                }
                if (isStop)
                {
                    LogUtil.info("停止运动:" + result + " " + moveDO);
                    IOManager.IOMove(moveDO, IO_VALUE.LOW, subType);
                    turnEnd?.Invoke(result.Equals(""));
                    InTurn = false;
                    return result;
                }
            }
        }
         
    }

}