StationEquip.cs 13.0 KB
using Asa;
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.TaskbarClock;

namespace OnlineStore.DeviceLibrary
{
    /// <summary>
    /// 人工操作工位类
    /// </summary>
    public partial class StationEquip : EquipBase
    {
        public StationEquip_Config Config;
        public string CurShelfId_Station = "";
        public StationEquip(string cid, StationEquip_Config config)
        {
            this.DeviceID = config.Id;
            baseConfig = config;
            this.Config = config;
            IsDebug = config.IsDebug.Equals(1);
            if (DeviceID.Equals(1))
            {
                OutDeviceId = 2;
            }
            else if (DeviceID.Equals(2))
            {
                OutDeviceId = 3;
            }
            else if (DeviceID.Equals(3))
            {
                OutDeviceId = 4;
            }
            else if (DeviceID.Equals(4))
            {
                OutDeviceId = 5;
            }
            else if (DeviceID.Equals(5))
            {
                OutDeviceId = 201;
            }
            Name = ("工位" + DeviceID % 100).ToUpper();

            Init();
            MoveInfo = new LineMoveInfo(DeviceID, "[" + Name.Trim() + "-Move]");
            SecondMoveInfo = new LineMoveInfo(DeviceID, "[" + Name.Trim() + "-SMove]");
            RFIDIP = RFIDManager.GetRFIP(DeviceID);
            mainTimer.Enabled = true;
        }

        public override bool StartRun(bool isDebug = false)
        {
            if (CanStartRun().Equals(false))
            {
                return false;
            }

            mainTimer.Enabled = false;
            MoveInfo.EndMove();
            SecondMoveInfo.EndMove();
            runStatus = LineRunStatus.HomeMoving;

            LogInfo("开始原点返回: ");
            MoveInfo.NewMove(LineMoveType.RHome);

            StartReset();

            if (isDebug)
            {
                LogInfo("开始调试,启动定时器 ");
                mainTimer.Start();
            }
            return true;
        }

        public override bool Reset()
        {
            runStatus = LineRunStatus.Reset;
            StopMove("复位");
            MoveInfo.NewMove(LineMoveType.Reset);
            SecondMoveInfo.EndMove();
            alarmType = LineAlarmType.None;
            LogInfo("开始重置: ");
            runStatus = LineRunStatus.Reset;
            MoveInfo.NewMove(LineMoveType.Reset);
            StartReset();
            return true;
        }

        private void StartReset()
        {
            ResetClearData();
            StartEquip();
            MoveInfo.NextMoveStep(LineMoveStep.SR_01_AllStopDown);
            LogInfo("开始复位,所有阻挡下降 ");
            FrontStopDown(MoveInfo);
            if (DeviceID == 5)
                StopUp(MoveInfo);
            else
                StopDown(MoveInfo);
            isInPro = false;
        }
        private void StopUp(LineMoveInfo moveInfo = null)
        {
            IOMove(IO_Type.Stop_Down, IO_VALUE.LOW);
            IOMove(IO_Type.Stop_Up, IO_VALUE.HIGH);
            if (moveInfo != null)
            {
                MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Stop_Down, IO_VALUE.LOW));
                MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Stop_Up, IO_VALUE.HIGH));
                MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Stop_DownCheck, IO_VALUE.LOW));
                MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Stop_UpCheck, IO_VALUE.HIGH));
            }
        }
        private void StopDown(LineMoveInfo moveInfo = null)
        {
            IOMove(IO_Type.Stop_Up, IO_VALUE.LOW);
            IOMove(IO_Type.Stop_Down, IO_VALUE.HIGH);
            if (moveInfo != null)
            {
                MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Stop_Up, IO_VALUE.LOW));
                MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Stop_Down, IO_VALUE.HIGH));
                MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Stop_UpCheck, IO_VALUE.LOW));
                MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Stop_DownCheck, IO_VALUE.HIGH));
            }
        }
        private void FrontStopUp(LineMoveInfo moveInfo = null)
        {
            IOMove(IO_Type.FrontStop_Down, IO_VALUE.LOW);
            IOMove(IO_Type.FrontStop_Up, IO_VALUE.HIGH);
            if (moveInfo != null)
            {
                MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.FrontStop_Down, IO_VALUE.LOW));
                MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.FrontStop_Up, IO_VALUE.HIGH));
                MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.FrontStop_DownCheck, IO_VALUE.LOW));
                MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.FrontStop_UpCheck, IO_VALUE.HIGH));
            }
        }
        private void FrontStopDown(LineMoveInfo moveInfo = null)
        {
            IOMove(IO_Type.FrontStop_Up, IO_VALUE.LOW);
            IOMove(IO_Type.FrontStop_Down, IO_VALUE.HIGH);
            if (moveInfo != null)
            {
                MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.FrontStop_Up, IO_VALUE.LOW));
                MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.FrontStop_Down, IO_VALUE.HIGH));
                MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.FrontStop_UpCheck, IO_VALUE.LOW));
                MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.FrontStop_DownCheck, IO_VALUE.HIGH));
            }
        }
        protected override void ResetProcess()
        {
            if (MoveInfo.IsInWait)
            {
                CheckWait(MoveInfo);
            }
            if (!MoveInfo.IsInWait)
            {
                switch (MoveInfo.MoveStep)
                {
                    //case LineMoveStep.Wait:
                    //    StartReset();
                    //    break;
                    case LineMoveStep.SR_01_AllStopDown:
                        MoveInfo.NextMoveStep(LineMoveStep.SR_02_End);
                        if (ContainerManager.GetOutTaskCnt(DeviceID) > 0)
                        {
                            FrontStopUp(MoveInfo);
                            LogInfo("有入库容器,前阻挡保持上升");
                        }
                        else if (ContainerManager.GetInTaskCnt(DeviceID) > 0)
                        {
                            LogInfo("无出库容器,前阻挡下降");
                            FrontStopDown(MoveInfo);
                            StopUp(MoveInfo);
                        }
                        else if (IOValue(IO_Type.Stop_BoxCheck).Equals(IO_VALUE.LOW))
                        {
                            if (DeviceID == 5)
                            {
                                LogInfo("工位无容器,前阻挡下降");
                                FrontStopDown(MoveInfo);
                            }
                            else
                            {
                                LogInfo("工位无容器,前阻挡、阻挡下降");
                                FrontStopDown(MoveInfo);
                                StopDown(MoveInfo);
                            }

                        }
                        else//工位处有容器,但信息不在缓存,读取并添加到缓存
                        {
                            UpdateContainerCode();
                            LogInfo($"工位有容器,读取容器信息:{CurContainerId}");
                        }
                        break;
                    case LineMoveStep.SR_02_End:
                        LogInfo("重置完成!");
                        MoveEndS();
                        break;
                    default: break;
                }
            }
        }
        internal override void StopMove(string stopDes = "")
        {
            if (!String.IsNullOrEmpty(stopDes))
            {
                if (MoveInfo.MoveType.Equals(LineMoveType.InStore) || MoveInfo.MoveType.Equals(LineMoveType.OutStore))
                {
                    LogInfo("[" + stopDes + "]时中止运动: " + MoveInfo.ToStr());
                }
            }
            MoveInfo.EndMove();
            SecondMoveInfo.EndMove();
            CloseAllDO();
        }

        public override void StopRun()
        {
            runStatus = LineRunStatus.Wait;
            if (mainTimer != null)
            {
                mainTimer.Enabled = false;
            }
            StopMove();
            StopEquip();
        }


        protected override void BaseTimerProcess()
        {
            if (isInSuddenDown || isNoAirCheck)
            {
                return;
            }
            BusyMoveProcess();
            IOTimeOutProcess();
            stopWatchCheck();
            if (MoveInfo.MoveType.Equals(LineMoveType.None) && NoErrorAlarm() && (!MoveStop))
            {
                if (LineManager.Line?.CanProcessLine() ?? false)
                {
                    if (IOValue(IO_Type.FrontStop_BoxCheck).Equals(IO_VALUE.HIGH) ||
                        IOValue(IO_Type.Stop_BoxCheck).Equals(IO_VALUE.HIGH))//只要有料经过就算到达
                        containerArrived = true;
                    GetInOutStore();
                }

            }
        }
        /// <summary>
        /// 读取该工位出库任务的箱子
        /// </summary>
        void GetInOutStore()
        {
            InOutParam inOutParam;
            if (DeviceID != 5 && Config.IsDebug == 1)
            {
                CheckAndMove(IO_Type.FrontStop_Up, IO_VALUE.LOW);
                CheckAndMove(IO_Type.Stop_Up, IO_VALUE.LOW);
                CheckAndMove(IO_Type.FrontStop_Down, IO_VALUE.HIGH);
                CheckAndMove(IO_Type.Stop_Down, IO_VALUE.HIGH);
                return;
            }
            if (ContainerManager.StationHasOutTask(DeviceID, out inOutParam))
            {
                StartOutStoreMove(inOutParam);
            }
            else if (ContainerManager.StationHasInTask(DeviceID, out inOutParam))
            {
                StartInStoreMove(inOutParam);
            }
        }
        //private bool ReadLineShelfId()
        //{
        //    try
        //    {
        //        //判断料架的编码是否正确
        //        RFIDData rfidD = RFIDManager.ReadRFID(RFIDIP[0]);
        //        CurContainerId = rfidD.NumStr();

        //        //发送料架信息给调度系统
        //        LogUtil.info(Name + "读取到线体上料架编号:" + CurContainerId);
        //    }
        //    catch (Exception ex)
        //    {
        //        LogUtil.error(Name + "ReadLineShelfId出错:", ex);
        //    }
        //    return true;
        //}
        /// <summary>
        /// 检测到托盘的时间
        /// </summary>
        private Stopwatch trayCheckWait = new Stopwatch();
        private Stopwatch trayCheckLowWait = new Stopwatch();
        private void stopWatchCheck()
        {
            if (IOValue(IO_Type.FrontStop_BoxCheck).Equals(IO_VALUE.HIGH))
            {
                trayCheckLowWait.Stop();
                CheckStopWatch(trayCheckWait, 30000, false);
            }
            else
            {
                trayCheckWait.Stop();
                CheckStopWatch(trayCheckLowWait, 30000, false);
            }
        }

        public override bool IsIdle(int type)
        {
            if (IsDebug) return true;
            if (MoveInfo.MoveType.Equals(LineMoveType.None))
            {
                if (IOValue(IO_Type.FrontStop_BoxCheck).Equals(IO_VALUE.LOW) && CheckStopWatch(trayCheckLowWait, 3000, false))
                {
                    return true;
                }
            }
            return false;
        }
        private bool ReadStationShelfId()
        {
            try
            {
                //判断料架的编码是否正确
                RFIDData rfidD = RFIDManager.ReadRFID(RFIDIP[1]);
                CurShelfId_Station = rfidD.IsValidated()?rfidD.ToContainerId():rfidD.NumStr();

                //发送料架信息给调度系统
                LogUtil.info(Name + "读取到工作台料架编号:" + CurShelfId_Station);
            }
            catch (Exception ex)
            {
                LogUtil.error(Name + "ReadStationShelfId出错:", ex);
            }
            return true;
        }
        public override string GetMoveStr()
        {
            string msg = "";
            msg += "工作位容器:" + CurShelfId_Station + "\r\n";

            msg += "当前容器:" + CurContainerId + "  上个容器:" + PreContainerId + "\n";
            msg += "runS:  " + runStatus + "\n";
            msg += "alarm:  " + alarmType + "\n";
            msg += "MoveT:" + MoveInfo.MoveType + " " + MoveInfo.SLog + "\n";
            msg += "MoveMsg:" + LogMsg + "\n";
            return msg;
        }
    }
}