DUOStoreBean.cs 13.6 KB
using Asa;
using log4net;
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;

namespace OnlineStore.DeviceLibrary
{ 
    public partial class DUOStoreBean : KTK_Store
    {         
        private System.Timers.Timer ledProcessTimer = null;      
      
        public Dictionary<int, BOX_Config> BoxConfigMap { get; set; }
        public Dictionary<int, BoxBean> BoxMap = new Dictionary<int, BoxBean>();
     
        public Store_Config Config { get; set; }
        public bool UseBuzzer = ConfigAppSettings.GetIntValue(Setting_Init.UseBuzzer).Equals(1); 

        public HoisterCylinder hoisterCylinder = new HoisterCylinder(0);
        public AxisBean T1_BatchAxis = null;
        public AxisBean T2_MiddleAxis = null;
        public AxisBean T3_UpdownAxis = null;
        #region  初始化

        internal bool canStart = false;
        public DUOStoreBean(Store_Config lineConfig, Dictionary<int, BOX_Config> configList)
        {
            BoxConfigMap = new Dictionary<int, BOX_Config>();
            BoxMap = new Dictionary<int, BoxBean>();
            if (lineConfig.IOSingle_TimerOut <= 0)
            {
                lineConfig.IOSingle_TimerOut = 5000;
            }
            Init();
            InitTimer();
            baseConfig = lineConfig;
            this.Config = lineConfig;
            this.ID = lineConfig.Id;

            MoveInfo = new StoreMoveInfo(ID);
            Name = (" DUO料仓_" + Config.CID + " ").ToUpper();
            List<string> ioList = new List<string>();
            AddDeviceName(ioList, Config.IOIPList);
           
            foreach (BOX_Config config in configList.Values)
            {
                BoxBean equip = new BoxBean(config);

                AddDeviceName(ioList, config.IOIPList);
                BoxMap.Add(config.Id, equip);
                BoxConfigMap.Add(config.Id, config);
            }
            Config.T3_Updown_Axis.BreakOnDO = IO_Type.MoveAxis_Break;
            Config.T1_Batch_Axis.BreakOnDO = IO_Type.MoveAxis_Break;
            T1_BatchAxis = new AxisBean(Config.T1_Batch_Axis, Name);
            T2_MiddleAxis = new AxisBean(Config.T2_Middle_Axis,Name);
            T3_UpdownAxis = new AxisBean(Config.T3_Updown_Axis,Name);
            IOManager.Init();

            CodeManager.LoadConfig();

            Task.Factory.StartNew(delegate
            {
                //   RFIDManager.RfidReader.Open(rfidList.ToArray());
                IOManager.instance.ConnectionIOList(ioList);
                addLastDI(IO_Type.Airpressure_Check, IOValue(IO_Type.Airpressure_Check));
                addLastDI(IO_Type.SuddenStop_BTN, IOValue(IO_Type.SuddenStop_BTN));
                addLastDI(IO_Type.Reset_BTN, IOValue(IO_Type.Reset_BTN));
                IOMove(IO_Type.Alarm_HddLed, IO_VALUE.LOW);
                IOMove(IO_Type.AutoRun_HddLed, IO_VALUE.LOW);
                IOMove(IO_Type.RunSign_HddLed, IO_VALUE.LOW);
                mainTimer.Enabled = true;
                canStart = true;

            });
        }

        private void AddDeviceName(List<string> targetList, List<string> list)
        {
            foreach (string str in list)
            {
                if (!targetList.Contains(str))
                {
                    targetList.Add(str);
                }
            }
        }
        public void InitTimer()
        {
            ledProcessTimer = new System.Timers.Timer();
            ledProcessTimer.Interval = 1000;
            ledProcessTimer.Elapsed += LedProcess;
            ledProcessTimer.AutoReset = true;
            ledProcessTimer.Enabled = false;             
        }

        private void IoCheckTimerProcess(object sender, ElapsedEventArgs e)
        { 
        }
        #endregion

        public override bool StartRun(bool isDebug = false)
        {
            if (!canStart)
            {
                SetWarnMsg("启动失败:设备未初始化完成");
                return false;
            }
            if (BoxConfigMap == null)
            {
                SetWarnMsg("启动失败:未加载到料仓配置");
                return false;
            }
            if (IOValue(IO_Type.SuddenStop_BTN).Equals(IO_VALUE.LOW))
            {
                SetWarnMsg("启动失败:急停未开");
            }
            else if (IOValue(IO_Type.Airpressure_Check).Equals(IO_VALUE.LOW))
            {
                SetWarnMsg("启动失败:没有气压信号");
            }
            else
            {
                LogUtil.info(Name + "开始启动,连接agv调度,连接rfid,启动时间:" + StartTime.ToString());
                storeRunStatus = StoreRunStatus.HomeMoving;
                StartTime = DateTime.Now;
                //AgvClient.SetCancelState(false);
                
                //RFIDManager.Open(rfidList.ToArray());

                mainTimer.Enabled = false;
                isInSuddenDown = false;
                isNoAirCheck = false;
                alarmType = AlarmType.None;
                WarnMsg = "";
              
                foreach (BoxBean box in this.BoxMap.Values)
                {
                    box.StartRun();
                }

                ledProcessTimer.Enabled = true;
                mainTimer.Enabled = true;
                return true;
            }
            return false;
        }

        public override void Reset(bool isNeedClearAuto = true)
        {
            mainTimer.Enabled = false;

            //停止运动
            MoveInfo.EndMove();

            storeRunStatus = StoreRunStatus.Reset;

            mainTimer.Enabled = false;
            isInSuddenDown = false;
            isNoAirCheck = false;
            alarmType = AlarmType.None;
            WarnMsg = "";

            foreach (BoxBean equip in BoxMap.Values)
            {
                if (!equip.alarmType.Equals(AlarmType.None))
                {
                    LogUtil.info(Name + "收到复位信号," + equip.Name + " 需要复位");
                    equip.Reset();
                }
                else
                {
                    LogUtil.info(Name + "收到复位信号," + equip.Name + " 正常无报警,不需要复位");
                } 
            }
            mainTimer.Enabled = true;
        }
       

        public override void StopRun()
        { 
            mainTimer.Enabled = false;
            ledProcessTimer.Enabled = false; 
            //停止运行时,把阻挡气缸上升
            StopMove();
            foreach (BoxBean equip in BoxMap.Values)
            {
                equip.StopRun();
            }
            storeRunStatus = StoreRunStatus.Wait;
           // RFIDManager.Close();
            TimeSpan span = DateTime.Now - StartTime;
            LogUtil.info( Name + ",停止运行,关闭rfid,总运行时间:" + span.ToString());
        }
         
        #region 灯光处理 
        private void LedProcess(object sender, ElapsedEventArgs e)
        {
            try
            {
                DateTime time = DateTime.Now;
                bool isNeedAlarmLed = false;
                bool isInOut = false;
                StoreRunStatus runs = StoreRunStatus.Wait;
              
                foreach (BoxBean box in BoxMap.Values)
                {
                    if (!box.alarmType.Equals(AlarmType.None))
                    {
                        isNeedAlarmLed = true;
                    }
                    if (box.MoveInfo.MoveType.Equals(MoveType.InStore) || box.MoveInfo.MoveType.Equals(MoveType.OutStore))
                    {
                        isInOut = true;
                    }
                    if (box.storeRunStatus > runs)
                    {
                        runs = box.storeRunStatus;
                    } 
                } 

                //黄灯
                if (runs.Equals(StoreRunStatus.HomeMoving) || runs.Equals(StoreRunStatus.Reset))
                {
                    //开机执行中时黄灯闪烁
                    if (IsDoValue(IO_Type.RunSign_HddLed, IO_VALUE.HIGH))
                    {
                        IOMove(IO_Type.RunSign_HddLed, IO_VALUE.LOW);
                    }
                    else
                    {
                        IOMove(IO_Type.RunSign_HddLed, IO_VALUE.HIGH);
                    }
                } 
                else
                {
                    if (IsDoValue(IO_Type.RunSign_HddLed, IO_VALUE.HIGH))
                    {
                        IOMove(IO_Type.RunSign_HddLed, IO_VALUE.LOW);
                    }
                } 
                if (alarmType.Equals(AlarmType.None).Equals(false) || isNoAirCheck || isInSuddenDown )
                {
                    isNeedAlarmLed = true;
                } 
                //忙碌中,判断是否有移栽在出入库执行,绿灯闪烁
                if (isInOut)
                {
                    if (IsDoValue(IO_Type.AutoRun_HddLed, IO_VALUE.LOW))
                    {
                        IOMove(IO_Type.AutoRun_HddLed, IO_VALUE.HIGH);
                    }
                    else
                    {
                        IOMove(IO_Type.AutoRun_HddLed, IO_VALUE.LOW);
                    }
                }
                else if (IsDoValue(IO_Type.AutoRun_HddLed, IO_VALUE.HIGH))
                {
                    IOMove(IO_Type.AutoRun_HddLed, IO_VALUE.LOW);
                }

                //报警中 ,红灯闪烁
                if (isNeedAlarmLed)
                {
                    if (IsDoValue(IO_Type.Alarm_HddLed, IO_VALUE.LOW))
                    {
                        IOMove(IO_Type.Alarm_HddLed, IO_VALUE.HIGH);
                    }
                    else
                    {
                        IOMove(IO_Type.Alarm_HddLed, IO_VALUE.LOW);
                    }
                }
                else if (IsDoValue(IO_Type.Alarm_HddLed, IO_VALUE.HIGH))
                {
                    IOMove(IO_Type.Alarm_HddLed, IO_VALUE.LOW);
                }

            }
            catch (Exception ex)
            {
                LogUtil.error(Name + "灯处理定时器出错:" + ex.ToString());
            }
            Thread.Sleep(5);
        }

        private bool IsDoValue(string ioType, IO_VALUE ioValue)
        {
            return IOValue(ioType).Equals(ioValue);
        }
        #endregion 

        protected override void timersTimer_Elapsed(object sender, ElapsedEventArgs e)
        { 
            BusyMoveProcess(); 
        }  
        public override void StopMove()
        { 
            foreach (BoxBean equip in this.BoxMap.Values)
            {
              //  if (!equip.IsDebug)
                {
                    equip.StopMove();
                } 
            }
            MoveInfo.EndMove(); 
        }

        protected override void ResetProcess()
        {
            bool isOk = true;
            //判断是否所有的已经返回完成

            foreach (BoxBean box in this.BoxMap.Values)
            {
                if ((box.storeRunStatus.Equals(StoreRunStatus.HomeMoving) || box.storeRunStatus.Equals(StoreRunStatus.Reset))  )
                //if ((box.storeRunStatus.Equals(StoreRunStatus.HomeMoving) || box.storeRunStatus.Equals(StoreRunStatus.Reset)) && box.IsDebug.Equals(false))
                    {
                    if (box.alarmType.Equals(AlarmType.None))
                    {
                        isOk = false;
                        break;
                    }
                    else
                    {
                        WarnMsg = box.Name + "在复位过程中报警,需要重新复位";
                    }
                }
            }
         
            if (isOk)
            { 
                //所有原点重置完成
                storeRunStatus = StoreRunStatus.Runing; 
                LogUtil.info(Name + "所有设备重置完成");
            }
        }
     
    
        public override void Alarm(AlarmType alarmType, string alarmDetial = "", string alarmMsg = "", MoveType storeMoveType = MoveType.None)
        {

        }

        public void LineRun(StoreMoveInfo move)
        {
            if (move != null)
            {
                move.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Line_BackRun, IO_VALUE.LOW));
                move.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Line_Run, IO_VALUE.HIGH));
            }
            IOMove(IO_Type.Line_BackRun, IO_VALUE.LOW);
            IOMove(IO_Type.Line_Run, IO_VALUE.HIGH);
        }

        public void LineStop(StoreMoveInfo move)
        {
            if (move != null)
            {
                move.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Line_BackRun, IO_VALUE.LOW));
                move.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Line_Run, IO_VALUE.LOW));
            }
            IOMove(IO_Type.Line_BackRun, IO_VALUE.LOW);
            IOMove(IO_Type.Line_Run, IO_VALUE.LOW);
        }

        public bool OpenAllAxis(bool isCheck = true)
        {

            if (RunMultiAxis(isCheck, IO_Type.MoveAxis_Run, IO_Type.MoveAxis_Break, new AxisBean []{ T3_UpdownAxis,T2_MiddleAxis}))
            {
                if (RunAxis(isCheck, T1_BatchAxis)  )
                {
                    return true;
                }
            }
            return false;
        }

        public void CloseAllAxis()
        {
            IOMove(IO_Type.MoveAxis_Break, IO_VALUE.LOW);
            IOMove(IO_Type.BatchAxis_Break, IO_VALUE.LOW); 

            CloseMultiAxis(IO_Type.MoveAxis_Run, IO_Type.MoveAxis_Break, new AxisBean[] { T3_UpdownAxis, T2_MiddleAxis });
            CloseAxis(T1_BatchAxis); 
        }
    }
}