FeedingEquip.cs 12.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.Runtime.InteropServices;
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 FeedingEquip : AGVEquipBase
    {
        public AGVEquip_Config Config;
        public FeedingEquip(string cid, AGVEquip_Config config)
        {
            this.DeviceID = config.Id;
            baseConfig = config;
            this.Config = config;
            IsDebug = config.IsDebug.Equals(1);
            OutDeviceId = 202;
            Name = ("入料工位").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("复位");
            SecondMoveInfo.EndMove();
            alarmType = LineAlarmType.None;
            LogInfo("开始重置: ");
            runStatus = LineRunStatus.Reset;
            MoveInfo.NewMove(LineMoveType.Reset);
            StartReset();
            return true;
        }

        private void StartReset()
        {
            ResetClearData();
            StartEquip();
            MoveInfo.NextMoveStep(LineMoveStep.FR_01_AllStopUp);
            LogInfo("开始复位,所有阻挡上升 ");
            StopUp(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 LineRun(LineMoveInfo moveInfo = null)
        {
            IOMove(IO_Type.MotorRun, IO_VALUE.HIGH);
            if (moveInfo != null)
            {
                MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.MotorRun, IO_VALUE.HIGH));
            }
        }
        private void LineStop(LineMoveInfo moveInfo = null)
        {
            IOMove(IO_Type.MotorRun, IO_VALUE.LOW);
            if (moveInfo != null)
            {
                MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.MotorRun, IO_VALUE.LOW));
            }
        }
        protected override void ResetProcess()
        {
            if (MoveInfo.IsInWait)
            {
                CheckWait(MoveInfo);
            }
            if (!MoveInfo.IsInWait)
            {
                switch (MoveInfo.MoveStep)
                {
                    case LineMoveStep.Wait:
                        StartReset();
                        break;
                    case LineMoveStep.FR_01_AllStopUp:
                        MoveInfo.NextMoveStep(LineMoveStep.FR_02_End);
                        break;
                    case LineMoveStep.FR_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();
        }

        /// <summary>
        /// 检测到托盘的时间
        /// </summary>
        private Stopwatch trayCheckWait = new Stopwatch();
        private Stopwatch trayCheckLowWait = new Stopwatch();
        private void stopWatchCheck()
        {
            if (IOValue(IO_Type.AGV_BoxCheck).Equals(IO_VALUE.HIGH))
            {
                trayCheckLowWait.Stop();
                CheckStopWatch(trayCheckWait, 30000, false);
            }
            else
            {
                trayCheckWait.Stop();
                CheckStopWatch(trayCheckLowWait, 30000, false);
            }
        }
        protected override void BaseTimerProcess()
        {
            if (isInSuddenDown || isNoAirCheck)
            {
                return;
            }
            BusyMoveProcess();
            IOTimeOutProcess();
            stopWatchCheck();
            if (LineManager.Line?.CanProcessLine() ?? false)
            {
                if (MoveInfo.MoveType.Equals(LineMoveType.None) && NoErrorAlarm() && (!MoveStop))
                {
                    if (IOValue(IO_Type.AGV_BoxCheck).Equals(IO_VALUE.HIGH) && CheckStopWatch(trayCheckWait, TrayWaitTime, true))
                    {
                        EquipBase equipBase = GetOutEquip();
                        if (equipBase != null && equipBase.IsIdle(1) && ContainerManager.CntofContainerOnLine() < 24)
                        {
                            ClearSpecifiedWarnMsg("等待下游");
                            waitNextIdleWatch.Stop();
                            equipBase.StartMove(1);
                            StartOutStoreMove(null);
                        }
                        else
                        {
                            if (!waitNextIdleWatch.IsRunning)
                            {
                                waitNextIdleWatch.Start();
                            }
                            if (waitNextIdleWatch.Elapsed.TotalSeconds >= 60)
                                SetWarnMsg($"等待下游{equipBase.Name}空闲超时{FormUtil.GetSpanStr(waitNextIdleWatch.Elapsed)}");
                        }
                    }

                }
            }

        }

        public override string GetMoveStr()
        {
            string msg = "";
            string leftTask = "";
            msg += "料架:" + CurContainerId + "    " + leftTask + "\r\n";
            //if (LastOutParam.rfid != "")
            //{
            //    msg += "出库信息:" + LastOutParam.ToShortStr() + "\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;
        }


        protected override void BoxProcess()
        {
            throw new NotImplementedException();
        }

        public override bool StartOutStoreMove(InOutParam param)
        {
            MoveInfo.NewMove(LineMoveType.OutStore);
            runStatus = LineRunStatus.Busy;
            MoveInfo.NextMoveStep(LineMoveStep.FO_01_StopDown);
            LogInfo(MoveInfo.SLog + " 阻挡下降,链条运行,放行容器");
            StopDown(MoveInfo);
            LineRun(MoveInfo);
            return true;
        }
        /// <summary>
        /// 箱子离开入料工位
        /// </summary>
        /// <exception cref="NotImplementedException"></exception>
        protected override void OutStoreProcess()
        {
            if (MoveInfo.IsInWait)
            {
                CheckWait(MoveInfo);
            }
            if (MoveInfo.IsInWait)
            {
                return;
            }
            if (MoveInfo.IsStep(LineMoveStep.FO_01_StopDown))
            {
                MoveInfo.NextMoveStep(LineMoveStep.FO_02_WaitBoxLeave);
                LogInfo(" 等待容器离开入料工位");
                MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.AGV_BoxCheck, IO_VALUE.LOW));
                MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
            }
            else if (MoveInfo.IsStep(LineMoveStep.FO_02_WaitBoxLeave))
            {
                EquipBase equipBase = GetOutEquip();
                if (equipBase != null)
                {
                    if (equipBase.IsContainerArrived())
                    {
                        MoveInfo.NextMoveStep(LineMoveStep.FO_03_StopUp);
                        ClearSpecifiedWarnMsg($"等待容器到达下游{equipBase.Name}超时");
                        LogInfo(" 容器离开入料工位,阻挡上升,链条停止");
                        StopUp(MoveInfo);
                        LineStop(MoveInfo);
                    }
                    else if (MoveInfo.IsTimeOut(15))
                    {
                        SetWarnMsg($"等待容器到达下游{equipBase.Name}超时");
                    }
                }
                else
                {
                    MoveInfo.NextMoveStep(LineMoveStep.FO_03_StopUp);
                    LogInfo("不存在下游,直接结束");
                }
            }
            else if (MoveInfo.IsStep(LineMoveStep.FO_03_StopUp))
            {
                MoveEndS();
            }
        }

        public override bool StartInStoreMove(InOutParam param)
        {
            throw new NotImplementedException();
        }

        protected override void InStoreProcess()
        {
            if (MoveInfo.IsInWait)
            {
                CheckWait(MoveInfo);
            }
            if (MoveInfo.IsInWait)
            {
                return;
            }
        }
        public override bool IsIdle(int type = 0)
        {
            if (MoveInfo.MoveType.Equals(LineMoveType.None) && IOValue(IO_Type.AGV_BoxCheck).Equals(IO_VALUE.LOW))
            {
                if (CheckStopWatch(trayCheckLowWait, TrayWaitTime, false))
                {
                    return true;
                }
            }
            return false;
        }
        public override bool BoxCheck()
        {
            if (IOValue(IO_Type.AGV_BoxCheck).Equals(IO_VALUE.HIGH))
                return true;
            return false;
        }
    }
}