LineBean_Partial.cs 14.2 KB
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace OnlineStore.DeviceLibrary
{
    partial class LineBean
    {
        #region 定时处理方法 


        public bool CanProcessLine(bool isCheckSleep = true)
        {
            if (IOManager.IOValue(IO_Type.MotorRun_C1, 0).Equals(IO_VALUE.HIGH))
            {
                return true;
            }
            return false;
        }
        public bool OutHyCanProLine()
        {
            return CanProcessLine(); 
        }

        private DateTime preIoTimerOutTime = DateTime.Now;
        private void IOTimeOutProcess()
        {
            try
            {
                TimeSpan span = DateTime.Now - preIoTimerOutTime;
                if (span.TotalSeconds > 1 && alarmType.Equals(LineAlarmType.IoSingleTimeOut))
                {
                    preIoTimerOutTime = DateTime.Now;

                    if (runStatus < LineRunStatus.Runing || isInSuddenDown || isNoAirCheck)
                    {
                        return;
                    }

                    //若BOX和移栽都没有在等待Io的过程中则此Io超时异常可能已经处理过
                    if (MoveInfo.IsInWait.Equals(false)  )
                    //if (MoveInfo.IsInWait.Equals(false) && T3C1_MoveInfo.IsInWait.Equals(false))
                        {
                        LogUtil.info(Name + "清理信号超时报警【" + WarnMsg + "】 ");
                        alarmType = LineAlarmType.None;
                        SetWarnMsg("");
                    }
                }
            }
            catch (Exception ex)
            {
                LogUtil.error("IOTimeOutProcess出错:", ex);
            }
        }
        private DateTime preRWTime = DateTime.Now;
        private void CheckWait(LineMoveInfo checkWaitInfo)
        {
            try
            {
                List<WaitResultInfo> list = checkWaitInfo.WaitList;
                if (list.Count <= 0)
                {
                    checkWaitInfo.EndStepWait();
                    return;
                }

                //当等待超过一分钟时,需要打印提示 
                TimeSpan span = DateTime.Now - checkWaitInfo.LastSetpTime;
                string NotOkMsg = "";
                bool isOk = true;
                if (checkWaitInfo.OneWaitCanEndStep)
                {
                    isOk = false;
                }
                foreach (WaitResultInfo wait in list)
                {
                    if (wait == null || wait.IsEnd)
                    {
                        continue;
                    }
                    NotOkMsg = " [" + wait.ToStr() + "] ";
                    if (wait.WaitType.Equals(WaitEnum.W002_IOValue))
                    {
                        NotOkMsg = " [" + Config.GetDisplayName(wait.IoType) + "=" + wait.IoValue + "] ";
                        wait.IsEnd = IOValue(wait.IoType).Equals(wait.IoValue);

                        if (!wait.IsEnd)
                        {
                            TimeSpan rwSpan = DateTime.Now - preRWTime;
                            //一分钟还未检测到
                            if (span.TotalSeconds > LineManager.Config.IOSingle_TimerOut && NoAlarm())
                            {
                                ConfigIO io = baseConfig.getWaitIO(wait.IoType);
                                WarnMsg = checkWaitInfo.Name + "[" + checkWaitInfo.MoveStep + "]等待" + NotOkMsg + " 超时";
                                Alarm(LineAlarmType.IoSingleTimeOut);
                                LogUtil.error(WarnMsg, 901);
                            }
                            //超过报警时长
                            else if (rwSpan.TotalSeconds > 5 && span.TotalSeconds > 6 && span.TotalSeconds < LineManager.Config.IOSingle_TimerOut * 2)
                            {
                                preRWTime = DateTime.Now;
                                string msg = checkWaitInfo.Name + "  " + NotOkMsg + "已等待 " + Math.Round(span.TotalSeconds, 1) + "秒,重写DO:";
                                bool isLog = false;
                                foreach (WaitResultInfo ww in list)
                                {
                                    if (ww != null && ww.WaitType.Equals(2) && baseConfig.DOList.ContainsKey(ww.IoType))
                                    {
                                        if (IOManager.DOValue(ww.IoType, baseConfig.Id).Equals(ww.IoValue).Equals(false))
                                        {
                                            isLog = true;
                                            IOMove(ww.IoType, ww.IoValue);
                                            msg += ww.ToStr() + ",";
                                        }
                                    }
                                }
                                if (isLog)
                                {
                                    LogUtil.error(msg);
                                }
                            }
                            if (!checkWaitInfo.OneWaitCanEndStep)
                            {
                                isOk = false;
                                break;
                            }
                        }
                    }
                    else if (wait.WaitType.Equals(WaitEnum.W003_Time))
                    {
                        wait.IsEnd = (span.TotalMilliseconds >= wait.TimeMSeconds);
                    }
                    else if (wait.WaitType.Equals(WaitEnum.W008_InStoreCheckOK))
                    {
                        string posId = checkWaitInfo.MoveParam.PosId;
                        int id = checkWaitInfo.MoveParam.GetStoreId();
                        wait.IsEnd = LineServer.RightInPosId(id, posId);
                    }
                    else if (wait.WaitType.Equals(WaitEnum.W009_BoxCanInstore))
                    {
                        int storeId = checkWaitInfo.MoveParam.GetStoreId();
                        wait.IsEnd = LineServer.BoxCanReviceTray(storeId,out NotOkMsg);
                    }
                    //else if (wait.WaitType.Equals(WaitEnum.W010_SWCanTopUp))
                    //{
                    //    //wait.IsEnd = SwCanUpMove(wait.TargetPosition);
                    //}
                    if (wait.IsEnd)
                    {
                        if (checkWaitInfo.OneWaitCanEndStep)
                        {
                            isOk = true;
                            break;
                        }
                    }
                    else
                    {
                        if (!checkWaitInfo.OneWaitCanEndStep)
                        {
                            isOk = false;
                            break;
                        }
                    }
                }
                if (isOk)
                {
                    checkWaitInfo.EndStepWait();
                }
                else if (span.TotalSeconds > checkWaitInfo.TimeOutSeconds)
                {
                    WarnMsg = checkWaitInfo.Name + "[" + checkWaitInfo.MoveStep + "][" + NotOkMsg + "]已等待[" + FormUtil.GetSpanStr(span) + "] ";
                    LogUtil.error(WarnMsg, 900);
                    Alarm(LineAlarmType.IoSingleTimeOut);
                }
            }
            catch (Exception ex)
            {
                LogUtil.error(checkWaitInfo.Name + " [" + checkWaitInfo.MoveStep + "] CheckWait 出错:", ex);

            }
        }
        #endregion


        #region 出入库

        public override bool StartOutStoreMove(InOutParam param)
        {
            return true;
        }
        protected override void OutStoreProcess()
        {
        }
        public override bool StartInStoreMove(InOutParam param)
        {
            return true;

        }
        protected override void InStoreProcess()
        {
        }

        #endregion

        #region IO操作
        private void InOutLog(string msg)
        {
            LogUtil.debug(Name + msg);
        }

        private bool IsDoValue(string ioType, IO_VALUE value)
        {
            if (IOManager.DOValue(ioType, 0).Equals(value))
            {
                return true;
            }
            return false;
        }

        #endregion



        #region 料仓出入库逻辑处理

 
        public void boxBean_OutStoreEnd(int storeId, InOutParam param)
        {
            MoveEquip moveEquip = MoveEquipMap[storeId];
            string posId = param != null ? param.PosId : "";
            if (moveEquip.OnlyProOutTray)
            {
                LogUtil.error(param.ToStr() + "  已经完成出库," + moveEquip.Name + " 无法执行出库 ");
                return;
            }
            if (moveEquip.IsDebug)
            {
                LogUtil.error(param.ToStr() + "  已经完成出库," + moveEquip.Name + "当前正在调试中,不继续操作!");
                return;
            }

            //料仓出库完成,移栽装置开始出库检测
            if (moveEquip.IsDebug == false && moveEquip.MoveInfo.MoveType == LineMoveType.None && moveEquip.runStatus == LineRunStatus.Runing)
            {
                LogUtil.info(param.ToStr() + "  已经完成出库,开始" + moveEquip.Name + "出库!");
                bool result = moveEquip.StartOutStoreMove(param);
                if (!result)
                {
                    LogUtil.info(Name + " 执行出库【" + param.ToStr() + "】失败, 加入等待队列");
                    moveEquip.AddWaitOutInfo(param);
                }
            }
            else if (moveEquip.MoveInfo.MoveType.Equals(LineMoveType.OutStore) && moveEquip.MoveInfo.MoveParam != null && moveEquip.MoveInfo.MoveParam.PosId.Equals(posId))
            {
                LogUtil.info(param.ToStr() + "已经完成出库," + moveEquip.Name + "正在【" + posId + "】出库中,库位号重复,不处理!");
            }
            else
            {
                LogUtil.info(param.ToStr() + "已经完成出库," + moveEquip.Name + "正在忙碌中,把出库信息放入列表中!");
                moveEquip.AddWaitOutInfo(param);
            }
        }
       
        public bool CanOutStore(int id)
        {
            if (!NoErrorAlarm())
            {
                return false;
            }
            if (!MoveEquipMap.ContainsKey(id))
            {
                return false;
            }
            if (LineManager.DisGetWare)
            {
                return false;
            }
            MoveEquip move = MoveEquipMap[id];
            if (move.OnlyProOutTray)
            {
                return false;
            }
            if (!move.NoAlarm() || move.waitInStoreList.Count > 0 || move.IsDebug || move.waitOutStoreList.Count > 0)
            {
                return false;
            }
            if (runStatus.Equals(LineRunStatus.Runing) || runStatus.Equals(LineRunStatus.Busy))
            {
                if (move.MoveInfo.MoveType.Equals(LineMoveType.None) && move.runStatus.Equals(LineRunStatus.Runing))
                {

                    //如果移栽已拦截到自己入库的托盘,不能出库
                    if (move.SecondMoveInfo.MoveType.Equals(LineMoveType.Fixture) &&
                        move.SecondMoveInfo.MoveStep >= LineMoveStep.MIO_05_WaitTime &&
                        move.SecondMoveInfo.MoveStep <= LineMoveStep.MO_14_TopDown
                        )
                    {
                        return false;
                    }
                    return true;
                }
                //前进后退气缸后退以后才可以出库
                else if (move.runStatus.Equals(LineRunStatus.Busy) && move.MoveInfo.MoveType.Equals(LineMoveType.OutStore))
                {
                    if (move.MoveInfo.MoveStep >= (LineMoveStep.MO_60_CylinderDown))
                    {
                        return true;
                    }
                    else if (move.MoveInfo.IsStep(LineMoveStep.MO_59_CylinderAfter) && move.MoveInfo.IsInWait.Equals(false)
                        && move.CylinderIsOk(IO_Type.BeforeAfterCylinder_Before, IO_Type.BeforeAfterCylinder_After))
                    {
                        return true;
                    }
                }
            }
            return false;
        }
        /// <summary>
        /// 判断指定的移栽是否可以入库
        /// </summary> 
        /// <returns></returns>
        public bool CanIntore(int id)
        {
            if (!NoErrorAlarm())
            {
                return false;
            }
            if (!MoveEquipMap.ContainsKey(id))
            {
                return false;
            }
            MoveEquip move = MoveEquipMap[id];
            if (move.IsDebug)
            {
                return false;
            }
            if (runStatus > LineRunStatus.Wait && move.runStatus > LineRunStatus.Wait)
            {
                return true;
            }
            return false;
        }

        #endregion


        #region 上料机构托盘到位验证及放行

        internal bool TrayIsReady(int deviceID, out int trayNum)
        {
            trayNum = -1;

            bool isDebug = AllEquipMap[deviceID].IsDebug;

            foreach (HYEquipBase hy in HYEquipMap.Values)
            {
                if (hy.Config.WorkDeviceId.Equals(deviceID))
                {
                    if (hy.TrayIsReady())
                    {
                        trayNum = hy.currTrayNum;
                        return true;
                    }

                    //TODO 调试模式直接返回true
                    if (IsDebug && hy.runStatus <= LineRunStatus.Wait)
                    {
                        return true;
                    }
                }
            }
            return false;
        }

        internal void TrayCanLeave(int deviceID)
        {
            foreach (HYEquipBase hy in HYEquipMap.Values)
            {

                if (hy.Config.WorkDeviceId.Equals(deviceID))
                {
                    hy.TrayCanLeave();
                    break;
                }
            }
        }
        #endregion

         
    }
}