RobotBase.cs 12.1 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
{
    public class RobotBase
    {
        public LineMoveInfo MoveInfo = null;
        public AlarmType alarmType = AlarmType.None;
        public bool IsDebug = false;
        public bool isInSuddenDown = false;
        public bool NoAirCheck = false;
        public string WarnMsg = "";
        protected System.Timers.Timer ledTimer = new System.Timers.Timer();
        protected System.Timers.Timer mainTimer = new System.Timers.Timer();
        public string Name = "";
        public RobotConfig baseConfig = null;
        public RobotBase(RobotConfig baseConfig)
        {
            this.baseConfig = baseConfig;
            ledTimer = new System.Timers.Timer();
            ledTimer.Interval = 1000;
            ledTimer.AutoReset = true;
            ledTimer.Enabled = false;
            mainTimer = new System.Timers.Timer();
            mainTimer.Interval = 300;
            mainTimer.AutoReset = true;
            mainTimer.Enabled = false;
        }
        public bool CylinderIsOk(string IoLowType, string IoHighType)
        {
            if (IOManager.DIValue(IoLowType).Equals(IO_VALUE.LOW) && IOManager.DIValue(IoHighType).Equals(IO_VALUE.HIGH))
            {
                return true;
            }
            return false;
        }
        public void CylinderMove(LineMoveInfo moveInfo, string IoLowType, string IoHighType, bool isCheckMove = false)
        {
            try
            {
                if (moveInfo != null)
                {
                    moveInfo.WaitList.Add(WaitResultInfo.WaitIO(IoLowType, IO_VALUE.LOW, true));
                    moveInfo.WaitList.Add(WaitResultInfo.WaitIO(IoHighType, IO_VALUE.HIGH, true));
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(200));
                }
                if (isCheckMove)
                {
                    CheckAndMove(IoLowType, IO_VALUE.LOW);
                    CheckAndMove(IoHighType, IO_VALUE.HIGH);
                }
                else
                {
                    IOMove(IoLowType, IO_VALUE.LOW);
                    Thread.Sleep(100);
                    IOMove(IoHighType, IO_VALUE.HIGH);
                }
            }
            catch (Exception ex)
            {
                LogUtil.error(Name + "CylinderMove  [" + IoLowType + "] [" + IoHighType + "] [" + isCheckMove + "] 出错:" + ex.ToString());
            }

        }
        public void CheckAndMove(string IoType, IO_VALUE value)
        {
            if (!IOValue(IoType).Equals(value))
            {
                IOMove(IoType, value);
            }
        }
        public void IOMove(string IoType, IO_VALUE value, int msTime = 0)
        {
            if (msTime <= 0)
            {
                IOManager.IOMove(IoType, value);
            }
            else
            {
                Task.Factory.StartNew(delegate
                {
                    IOManager.IOMove(IoType, value);
                    Thread.Sleep(msTime);
                    IO_VALUE tValue = value.Equals(IO_VALUE.HIGH) ? IO_VALUE.LOW : IO_VALUE.HIGH;
                    LogUtil.info(msTime + "时间到,设置" + IoType + "=" + tValue);
                    IOManager.IOMove(IoType, tValue);
                });
            }
        }

        public IO_VALUE IOValue(string IoType)
        {
            return IOManager.IOValue(IoType);
        }
        public void DebugInfo(string logInfo)
        {
            LogUtil.debug(Name + logInfo);
        }
        public void LogInfo(string logInfo)
        {
            LogUtil.info(Name + logInfo);
        }
        /// <summary>
        /// 阻塞等待IO信号,等到返回true,未等到返回false
        /// </summary>c
        public bool WaitIo(string ioType, IO_VALUE value, int timeOut, string errName = "")
        {
            try
            {
                return WaitUtil.Wait(timeOut, delegate ()
                {
                    return value.Equals(IOValue(ioType));
                }, errName);
            }
            catch (Exception ex)
            {
                LogUtil.error(Name + " 等待" + ioType + "=" + value + "超时:" + ex.ToString());
                return false;
            }
        }

        public void SetWarnMsg(string msg = "")
        {
            if (String.IsNullOrEmpty(msg).Equals(false))
            {
                if (WarnMsg.Equals(msg))
                {
                    if (msg.StartsWith(Name))
                    {
                        LogUtil.error(msg, 105);
                    }
                    else
                    {
                        LogUtil.error(Name + msg, 105);
                    }
                }
                else
                {
                    if (msg.StartsWith(Name))
                    {
                        LogUtil.error(msg);
                    }
                    else
                    {
                        LogUtil.error(Name + msg);
                    }
                }
            }

            WarnMsg = msg;
        }

        #region CheckWait处理

        private DateTime preCheckAxisTime = DateTime.Now;
        protected DateTime preRWTime = DateTime.Now;
        internal void CheckWait(LineMoveInfo moveInfo)
        {
            try
            {
                List<WaitResultInfo> list = moveInfo.WaitList;
                if (list.Count <= 0)
                {
                    moveInfo.EndStepWait();
                    return;
                }

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

                    }
                    else if (wait.WaitType.Equals(WaitEnum.W002_IOValue))
                    {
                        NotOkMsg = " [" + baseConfig.GetDisplayName(wait.IoType) + "=" + wait.IoValue + "]";
                        wait.IsEnd = IOValue(wait.IoType).Equals(wait.IoValue);

                        if (!wait.IsEnd)
                        {
                            if (wait.IoType.Equals(IO_Type.LHigh_LineRun) || wait.IoType.Equals(IO_Type.LLown_LineRun)
                                || wait.IoType.Equals(IO_Type.S1_LineRun) || wait.IoType.Equals(IO_Type.S1_LineBackRun))
                            {
                                IOMove(wait.IoType, wait.IoValue);
                                LogInfo(" [" + moveInfo.MoveType + "][" + moveInfo.MoveStep + "]重写DO: " + wait.ToStr());
                            }
                            //if (wait.IsDO)
                            //{
                            //    if (IOManager.DOValue(wait.IoType).Equals(wait.IoValue).Equals(false))
                            //    {
                            //        IOMove(wait.IoType, wait.IoValue);
                            //        LogInfo(" [" + moveInfo.MoveType + "][" + moveInfo.MoveStep + "]重写DO: " + wait.ToStr());
                            //    }
                                 
                            //}

                            TimeSpan rwSpan = DateTime.Now - preRWTime;
                            //一分钟还未检测到

                            if (rwSpan.TotalSeconds > 5 && span.TotalSeconds > 6)//&& span.TotalSeconds < LineManager.Config.IOSingle_TimerOut * 2
                            {
                                if (moveInfo.CanRMoveIO)
                                {
                                    preRWTime = DateTime.Now;
                                    string msg = Name + " [" + moveInfo.MoveType + "][" + moveInfo.MoveStep + "] " + 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).Equals(ww.IoValue).Equals(false))
                                            {
                                                isLog = true;
                                                IOMove(ww.IoType, ww.IoValue);
                                                msg += ww.ToStr() + ",";
                                            }
                                        }
                                    }
                                    if (isLog)
                                    {
                                        LogUtil.error(msg);
                                    }
                                }
                            }

                            if (span.TotalSeconds > LineManager.Config.IOSingle_TimerOut)
                            {
                                if (alarmType.Equals(AlarmType.None))
                                {
                                    ConfigIO io = baseConfig.getWaitIO(wait.IoType);
                                    WarnMsg = Name + "[" + moveInfo.MoveType + "][" + moveInfo.MoveStep + "] 等待" + NotOkMsg + " 超时 " + Math.Round(span.TotalSeconds, 1) + "秒";
                                    LogUtil.error(Name + WarnMsg, 13);
                                    Alarm(AlarmType.IoSingleTimeOut);
                                }
                            }
                            if (!moveInfo.OneWaitCanEndStep)
                            {
                                isOk = false;
                                break;
                            }
                        }
                    }
                    else if (wait.WaitType.Equals(WaitEnum.W003_Time))
                    {
                        wait.IsEnd = (span.TotalMilliseconds >= wait.TimeMSeconds);
                    }

                    if (wait.IsEnd)
                    {
                        if (moveInfo.OneWaitCanEndStep)
                        {
                            isOk = true;
                            break;
                        }
                    }
                    else
                    {
                        if (!moveInfo.OneWaitCanEndStep)
                        {
                            isOk = false;
                            break;
                        }
                    }
                }
                if (isOk)
                {
                    moveInfo.EndStepWait();
                }
                else if (span.TotalSeconds > moveInfo.TimeOutSeconds)
                {
                    WarnMsg = Name + "[" + moveInfo.MoveType + "][" + moveInfo.MoveStep + "]等待" + NotOkMsg
                        + "超时[" + Math.Round(span.TotalSeconds, 1) + "]秒";
                    LogUtil.error(WarnMsg, 1002);
                    Alarm(AlarmType.IoSingleTimeOut);
                }
            }
            catch (Exception ex)
            {
                LogUtil.error(Name + " [" + moveInfo.MoveStep + "] CheckWait 出错:", ex);
            }
        }


        public virtual string GetRunInfo()
        {
            return "";
        }
        #endregion
        public virtual bool StartRun()
        {
            return false;
        }
        public virtual void StopRun()
        { }
        public virtual void Reset()
        { }
        public virtual void StopMove()
        {

        }
        public virtual void Alarm(AlarmType alarmType)
        {
        }
    }
}