KTK_Store.cs 11.3 KB
using log4net; 
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;


namespace OnlineStore.DeviceLibrary
{
    /// <summary>
    /// 康泰克单台自动料仓
    /// </summary>
    public abstract class KTK_Store
    {
        /// <summary>
        /// 料仓状态
        /// </summary>
        public LineRunStatus runStatus = LineRunStatus.Wait;
        /// <summary>
        ///1=设备联机(正常就绪)(入库后,BOX恢复原始状态)(出库后,移载装置恢复原始状态),
        ///2=急停,3=故障,4=警告,5=调试
        ///  6=入库执行中,7=入仓完成,8=入仓失败
        /// 9=出库执行,10=出仓完成,11=出库失败
        /// </summary>
        public LineStatus lineStatus = LineStatus.ResetMove;
        /// <summary>
        /// 提示消息,一般发给服务器后清空(LineBean表示报警提示消息,BoxBean表示出入库失败的原因记录)
        /// </summary>
        public string WarnMsg = "";
        public DeviceConfig baseConfig = null;
        public string Name { get; set; }
        public int DeviceID { get; set; }
        /// <summary>
        /// 定时器
        /// </summary>
        protected System.Timers.Timer mainTimer;

        private bool isInit = false;
         
        public KTK_Store()
        {
        }
        /// <summary>
        /// 开始运行的时间
        /// </summary>
        public DateTime StartTime { get; set; }

        /// <summary>
        /// 最后一次气压检测变为0的时间
        /// </summary>
        public DateTime lastAirCloseTime = DateTime.Now;
        /// <summary>
        /// 是否在急停中
        /// </summary>
        public bool isInSuddenDown = false;
        /// <summary>
        /// 是否没有检测到气压
        /// </summary>
        public bool isNoAirCheck = false;

        //protected int NeedCheckSafetyLight = 0;
        /// <summary>
        /// 是否再报警中
        /// </summary>
        public LineAlarmType alarmType = LineAlarmType.None;

        public AlarmInfo alarmInfo = new AlarmInfo();

        /// <summary>
        /// 记录上一次的部分IO状态,主要是急停,气压检测信号,复位信号,用来判断是否io发生改变
        /// </summary>
        public Dictionary<string, IO_VALUE> DILastValueMap = new Dictionary<string, IO_VALUE>();

        public object lastDiListLock = "";
        public void addLastDI(string type, IO_VALUE value)
        { 
            try
            {
                lock (lastDiListLock)
                {
                    if (DILastValueMap.ContainsKey(type))
                    {
                        DILastValueMap.Remove(type);
                    }
                    DILastValueMap.Add(type, value);
                }
            }
            catch (Exception ex)
            {
                LogUtil.info(ex.ToString());
            }
        }
         
        /// <summary>
        /// 运动处理
        /// </summary> 
        protected bool isInPro = false;
        protected virtual void BusyMoveProcess()
        {
            //if (isInPro)
            //{
            //    return;
            //}
            isInPro = true;
            try
            {
                switch (MoveInfo.MoveType)
                {
                    case LineMoveType.InStore:
                        InStoreProcess();
                        isInPro = false;
                        break;
                    case LineMoveType.OutStore:
                        OutStoreProcess();
                        isInPro = false;
                        break;
                    case LineMoveType.ReturnHome:
                        ResetProcess();
                        isInPro = false;
                        break;
                    case LineMoveType.Reset:
                        ResetProcess();
                        isInPro = false;
                        break;
                    default: break;
                }
            }
            catch (Exception ex)
            {
                LogUtil.error("BusyMoveProcess出错:" + ex.ToString());
            }
            isInPro = false;
        }
        protected void SaveAlarmInfo(LineAlarmType alarmType, string alarmDetial, string alarmMsg, LineMoveType storeMoveType)
        {
            alarmMsg = alarmMsg.Replace(Name, "");
            int inoutStatus = 0;
            if (storeMoveType.Equals(LineMoveType.InStore))
            {
                inoutStatus = 1;
            }
            else if (storeMoveType.Equals(LineMoveType.InStore))
            {
                inoutStatus = 2;
            }
            int aType = 0;
            switch (alarmType)
            {
                case LineAlarmType.AxisMoveError:
                    aType = 2;
                    break;
                case LineAlarmType.AxisAlarm:
                    aType = 2;
                    break;
                case LineAlarmType.SuddenStop:
                    aType = 1;
                    alarmDetial = "1";
                    break;
                case LineAlarmType.NoAirCheck:
                    aType = 1;
                    alarmDetial = "2";
                    break;
                case LineAlarmType.IoSingleTimeOut:
                    aType = 3;
                    break;
                case LineAlarmType.StellAlarm:
                    aType = 2;
                    alarmDetial = "5";
                    break;
                default: break;
            }
            alarmInfo = new AlarmInfo(DeviceID, aType, alarmDetial, alarmMsg, inoutStatus);
        }

        /// <summary>
        /// 开始运行
        /// </summary>
        public abstract bool StartRun(bool isDebug = false);
        /// <summary>
        /// 停止运行
        /// </summary>
        public abstract void StopRun();
        /// <summary>
        /// 报警
        /// </summary>
        /// <param name="alarmType"></param>
        public abstract void Alarm(LineAlarmType alarmType );
        /// <summary>
        /// 重置(夹料装置状态不变)
        /// </summary>
        public abstract bool Reset();

        /// <summary>
        /// 停止所有运动
        /// </summary>
        public abstract void StopMove( );

        /// <summary>
        /// 重置处理
        /// </summary>
        protected abstract void ResetProcess();
        ///// <summary>
        ///// 原点返回处理
        ///// </summary>
        //protected abstract void ReturnHomeProcess();
         
        /// <summary>
        /// 初始化
        /// </summary>
        protected virtual void Init()
        {
            if (!isInit)
            { 
                mainTimer = new System.Timers.Timer();
                mainTimer.Enabled = false;
                mainTimer.Interval = 300;
                mainTimer.Elapsed += mainTimer_Elapsed;
                mainTimer.AutoReset = true;
                isInit = true;
            }
        } 

        /// <summary>
        /// 移动信息
        /// </summary>
        public LineMoveInfo MoveInfo = null;

        /// <summary>
        /// 定时处理,监听信号,监听IO
        /// </summary> 
        protected abstract void mainTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e);

        #region 出库
        /// <summary>
        /// 开始出库运动
        /// </summary> 
        public abstract bool StartOutStoreMove(InOutParam param);
        protected abstract void OutStoreProcess();
        #endregion

        #region 入库
        /// <summary>
        /// 开始入库移动移动
        /// </summary> 
        public abstract bool StartInStoreMove(InOutParam param);
        protected abstract void InStoreProcess();
        #endregion
         
        public static  string GetRunStr(LineStatus ls, LineRunStatus runs)
        {
            string sta = "运行中";
            string aa = "";
            switch (runs)
            {
                case LineRunStatus.Busy:
                    sta = "忙碌";
                    break;
                case LineRunStatus.HomeMoving:
                    sta = "原点返回";
                    break;
                case LineRunStatus.Reset:
                    sta = "重置";
                    break;
                case LineRunStatus.Runing:
                    sta = "运行中";
                    break;
                case LineRunStatus.Wait:
                    sta = "等待启动";
                    break;
            }
            if (runs > LineRunStatus.Wait)
            {
                //"0":"急停中",   "1":"设备联机",   "2":"故障中", "3":"入库执行中",  "4":"出库执行中",   5":"料盘入仓位完成",   "6":"料盘出仓位完成",  7":"设备调试中",
                switch (ls)
                {
                    case LineStatus.Debugging:
                        aa = "设备调试中";
                        break;
                    //case LineStatus.InStoreEnd:
                    //    aa = "料盘入仓位完成";
                    //    break;
                    case LineStatus.InStoreExecute:
                        aa = "入库执行中";
                        break;
                    case LineStatus.InTrouble:
                        aa = "故障中";
                        break;
                    //case LineStatus.OutStoreBoxEnd:
                    //    aa = "料盘出仓位完成";
                    //    break;
                    case LineStatus.OutStoreExecute:
                        aa = "出库执行中";
                        break;
                    case LineStatus.StoreOnline:
                        aa = "设备联机";
                        break;
                    case LineStatus.SuddenStop:
                        aa = "急停中";
                        break;
                        //case LineStatus.OutMoveExecute:
                        //    aa = "出库完成";
                        //    break;
                        //case LineStatus.InStoreFaild:
                        //    aa = "入库失败(" + WarnMsg + ")";
                        //    break;
                        //case LineStatus.OutStoreFaild:
                        //    aa = "出库失败(" + WarnMsg + ")";
                        //    break;
                } 
            }
             
            if (!aa.Equals(""))
            {
                return sta + "_" + aa;
            }
            else
            {
                return sta;
            }
        }

        public void CylinderMove(LineMoveInfo moveInfo, string IoLowType, string IoHighType)
        {
            IOMove(IoLowType, IO_VALUE.LOW);
            IOMove(IoHighType, IO_VALUE.HIGH);
            if (moveInfo != null)
            {
                moveInfo.WaitList.Add(WaitResultInfo.WaitIO(IoLowType, IO_VALUE.LOW));
                moveInfo.WaitList.Add(WaitResultInfo.WaitIO(IoHighType, IO_VALUE.HIGH));
            }
        }
        public void IOMove(string IoType, IO_VALUE value)
        {
            IOManager.IOMove(IoType, value, baseConfig.Id);
        }
        public IO_VALUE IOValue(string IoType)
        {
            return IOManager.IOValue(IoType, baseConfig.Id);
        }

        public void LogInfo(string logInfo)
        {
            LogUtil.info(Name + logInfo);
        }
    }
}