DischargeLine_Partial.cs 6.9 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
{
    partial class DischargeLine
    {
        #region 托盘检测
        private void StartCheckFixture()
        {
            
        }
        private bool CheckIsNeedOutStore()
        { 
            return false;
        }
        protected override void CheckFixtureProcess()
        {
            if (!LineManager.Line.LineCanRun())
            {
                return;
            }
            if (SecondMoveInfo.IsInWait)
            {
                CheckWait(SecondMoveInfo);
            }
            if (SecondMoveInfo.IsInWait)
            {
                return;
            }
             
        }

        internal bool CanStartOut(int lineNum)
        {
            if (alarmType.Equals(LineAlarm.None).Equals(false) || runStatus.Equals(LineRunStatus.Runing).Equals(false))
            {
                return false;
            }
            if (lineNum.Equals(1))
            {
                if (LineRuning.Equals(true) && LastMoveDO.Equals(IO_Type.DLine_Run1))
                {
                    return false;
                }
                if (MoveInfo.MoveType.Equals(LineMoveType.None)&& IOValue(IO_Type.DLine_Entry_Check1).Equals(IO_VALUE.LOW))
                {
                    MoveInfo.NewMove(LineMoveType.OutStore);
                    return true;
                }
            }else if (lineNum.Equals(2))
            {
                if (LineRuning.Equals(true) && LastMoveDO.Equals(IO_Type.DLine_Run2))
                {
                    return false;
                }
                if (SecondMoveInfo.MoveType.Equals(LineMoveType.None) && IOValue(IO_Type.DLine_Entry_Check2).Equals(IO_VALUE.LOW))
                {
                    SecondMoveInfo.NewMove(LineMoveType.OutStore);
                    return true;
                }

            }
            return false;
        }

        #endregion

        #region 料盘移栽处理
        public override bool StartOutStoreMove(InOutParam param)
        {
            string posId = param != null ? param.PosId : "";
            //调试模式移栽装置不需要有操作
            if (IsDebug)
            {
                LogInfo("需要出料【" + posId + "】处于调试模式,暂时不再进行出出料操作");
                return false;
            }
            if (runStatus.Equals(LineRunStatus.Runing))
            {
                runStatus = LineRunStatus.Busy;
                lineStatus = LineStatus.OutStoreExecute;
                MoveInfo.MoveParam = param;
                MoveInfo.NewMove(LineMoveType.OutStore);
                LogInfo("出料【" + posId + "】处理(移栽):(PO_01_UpDownCylinderDown,上下气缸1下降)");
                MoveInfo.NextMoveStep(LineMoveStep.PO_01_UpDownCylinderDown);
                MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                CylinderMove(MoveInfo, IO_Type.UpDownCylinder_Up, IO_Type.UpDownCylinder_Down);
                return true;
            }
            else
            {
                LogUtil.error(Name + " 启动出料【" + posId + "】 失败,当前 storeStatus=" + runStatus);
                return false;
            }
        }

        protected override void OutStoreProcess()
        {
            if (MoveInfo.IsInWait)
            {
                CheckWait(MoveInfo);
            }
            if (SecondMoveInfo.IsInWait)
            {
                CheckWait(SecondMoveInfo);
            }
            if (MoveInfo.IsInWait)
            {
                return;
            }
            string posId = MoveInfo.MoveParam != null ? MoveInfo.MoveParam.PosId : "";
            if (MoveInfo.MoveStep.Equals(LineMoveStep.DL_R_LineCheck))
            {

            }

            else if (MoveInfo.MoveStep.Equals(LineMoveStep.DL_R_LineCheck))
            {
                LogInfo("出料【" + posId + "】处理完成!");
                runStatus = LineRunStatus.Runing;
                lineStatus = LineStatus.StoreOnline;
                MoveInfo.EndMove();
            }
        }
        #endregion



        private void  StartLineRun(string moveDO, string checkDI, int timeOutMS = 10000)
        {
            LineRuning = true;
            Task.Factory.StartNew(  delegate {
                LineRunAndWait(moveDO, checkDI, timeOutMS);
            });
        }

        private bool LineRuning = false;
        private string LastMoveDO = "";
        private string LastCheckDI = "";
        private void StopLineRun()
        { 
            if (LineRuning)
            {
                LineRuning = false;
            }
         
        }

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