DischargeLine.cs 13.5 KB
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace OnlineStore.DeviceLibrary
{
    /// <summary>
    /// 流水线自动料仓-出料装置类
    /// </summary>
    public partial class DischargeLine : EquipBase
    {
        public int Line3MaxPosition = 13;
        public DischargeLine_Config Config;
        public  OutTrayLineBean TrayLine1 = null;
        public OutTrayLineBean TrayLine2 = null;
        internal LineTurnBean Line3Turn = null;
        //皮带线3最后一盘料的位置
        public  int Line3LastTrayP = 0;
        public DischargeLine(string cid, DischargeLine_Config config)
        {
            baseConfig = config;
            this.DeviceID = config.Id;
            this.Config = config;
            IsDebug = config.IsDebug.Equals(1);
            baseConfig = config;
            Name = (" " + "_出料皮带线_" + DeviceID % 100 + " ").ToUpper();
            Init();
            UseAxis = false;
            MoveInfo = new LineMoveInfo(DeviceID, "出料皮带线-" + DeviceID + "-MoveInfo");
            SecondMoveInfo = new LineMoveInfo(DeviceID, "出料皮带线-" + DeviceID + "-SecondMoveInfo");
            int id = DeviceID % 100;
            TrayLine1 = new OutTrayLineBean("皮带线" + id + "-" + (id - 1) * 3 + 1, IO_Type.EntryLocation_Check1, IO_Type.ExitLocation_Check1, IO_Type.ExitTray_Check1, IO_Type.DLine_Run1, IO_Type.EntryTray_Check3, this.DeviceID);
            TrayLine2 = new OutTrayLineBean("皮带线" + id + "-" + (id - 1) * 3 + 2, IO_Type.EntryLocation_Check2, IO_Type.ExitLocation_Check2, IO_Type.ExitTray_Check2, IO_Type.DLine_Run2, IO_Type.MiddleTray_Check3, this.DeviceID);
            Line3Turn = new LineTurnBean(DeviceID);
            if((DeviceID%100).Equals(1))
            {
                Line3MaxPosition = 13;
            }
            else
            {
                Line3MaxPosition = 22;
            }
            TimerMaxSeconds = 2;
        }

        /// <summary>
        /// 开始运行
        /// </summary>
        public override bool StartRun(bool isDebug = false)
        { 
            if (CanStartRun().Equals(false))
            {
                return false ;
            }

            mainTimer.Stop();
            MoveInfo.EndMove();
            SecondMoveInfo.EndMove();
            lineStatus = LineStatus.StoreOnline; 
            runStatus = LineRunStatus.HomeMoving;
            LogInfo("开始原点返回:  (重置灯状态,关闭所有皮带线,定位气缸下降  )开始");
            MoveInfo.NewMove(LineMoveType.ReturnHome);
            StartReset(); 
            if (  isDebug)
            {
                mainTimer.Enabled = true;
            }
            return true ;
        }
         
        /// <summary>
        /// 出料装置重置
        /// </summary>
        public override bool Reset()
        { 
            StopMove();
            LogInfo("开始重置: (重置灯状态,关闭所有皮带线,定位气缸下降  )开始;");
            runStatus = LineRunStatus.Reset;
            MoveInfo.NewMove(LineMoveType.Reset);
            StartReset();
            return true;
        }
        private void StartReset()
        {
            //复位时默认为有托盘
            TrayLine1.LastTrayPosition = 1;
            TrayLine2.LastTrayPosition = 1; 
            Line3LastTrayP = 1;
            ResetClearData();
            lineStatus = LineStatus.ResetMove;
            MoveInfo.NextMoveStep(LineMoveStep.DL_R_CylinderDown);
            CylinderMove(null, IO_Type.SeparateDevice_Up, IO_Type.SeparateDevice_Down);
            IOMove(IO_Type.DLine_RunStatus, IO_VALUE.HIGH);
            IOMove(IO_Type.DLine_RunAlarm, IO_VALUE.LOW);


            CheckAndMove(IO_Type.DLine_Run1, IO_VALUE.LOW);
            CheckAndMove(IO_Type.DLine_Run2, IO_VALUE.LOW);
            CheckAndMove(IO_Type.DLine_Run3, IO_VALUE.LOW);
            CheckAndMove(IO_Type.SeparateDevice_Run, IO_VALUE.LOW);
            if (IsDebug)
            {
                mainTimer.Start();
            }
            //三个流水线都转动到定位亮

            //TrayLine1.LineStartTurn();
            //TrayLine2.LineStartTurn();
            //Line3Turn.StartLineRun(IO_Type.DLine_Run3, IO_Type.Location_Check3, Line3EndProcess);
            isInPro = false;
        }
       
        /// <summary>
        /// 复位处理
        /// </summary>
        protected override void ResetProcess()
        {
            if (MoveInfo.IsInWait)
            {
                CheckWait(MoveInfo);
            }
            else if (SecondMoveInfo.IsInWait)
            {
                CheckWait(SecondMoveInfo);
            }
            if (!MoveInfo.IsInWait && !SecondMoveInfo.IsInWait)
            {
                switch (MoveInfo.MoveStep)
                {
                    case LineMoveStep.DL_R_CylinderDown:  
                        LogInfo(MoveInfo.MoveType + "完成!");
                        runStatus = LineRunStatus.Runing;
                        lineStatus = LineStatus.StoreOnline;
                        MoveInfo.EndMove();
                        SecondMoveInfo.EndMove();
                        break;
                  
                    default: break;
                }
            }
        }

        /// <summary>
        /// 停止运动
        /// </summary>
        internal override void StopMove()
        { 
            runStatus = LineRunStatus.Busy;
            MoveInfo.EndMove();
            SecondMoveInfo.EndMove();

            TrayLine1.StopRun();
            TrayLine2.StopRun(); 
            Line3Turn.StopLineRun(); 

            LogInfo("停止运动:(定位气缸下降,皮带线停转 )开始 ");
            CylinderMove(null, IO_Type.SeparateDevice_Up, IO_Type.SeparateDevice_Down);

            CheckAndMove(IO_Type.DLine_Run1, IO_VALUE.LOW);
            CheckAndMove(IO_Type.DLine_Run2, IO_VALUE.LOW);
            CheckAndMove(IO_Type.DLine_Run3, IO_VALUE.LOW);
            CheckAndMove(IO_Type.SeparateDevice_Run, IO_VALUE.LOW);
        }
         
        /// <summary>
        /// 停止运行
        /// </summary>
        public override void StopRun()
        {
            if (mainTimer != null)
            {
                mainTimer.Enabled = false;
            }
            StopMove();
            //停止运行时,把所有IO 置零
            CheckAndMove(IO_Type.DLine_RunStatus, IO_VALUE.LOW);
            CheckAndMove(IO_Type.DLine_RunAlarm, IO_VALUE.LOW);
            CheckAndMove(IO_Type.DLine_Run1, IO_VALUE.LOW);
            CheckAndMove(IO_Type.DLine_Run2, IO_VALUE.LOW);
            CheckAndMove(IO_Type.DLine_Run3, IO_VALUE.LOW);
            CheckAndMove(IO_Type.SeparateDevice_Run, IO_VALUE.LOW);
            CheckAndMove(IO_Type.SeparateDevice_Up, IO_VALUE.LOW);
            CheckAndMove(IO_Type.SeparateDevice_Down, IO_VALUE.LOW);
            runStatus = LineRunStatus.Wait;
        }

        protected override void BaseTimerProcess()
        {
            if (IOValue(IO_Type.DLine_SuddenStop).Equals(IO_VALUE.LOW))
            {
                SetWarnMsg( Name + "收到急停信号");
            
                Alarm(LineAlarmType.SuddenStop);
                return;
            }

            if (IOValue(IO_Type.DLine_Reset).Equals(IO_VALUE.HIGH))
            {
                if (NoAlarm())
                {
                    if (MoveInfo.MoveType.Equals(LineMoveType.None))
                    {
                        LogUtil.error(Name + "收到复位信号,当前无报警,不需要复位");
                    }
                    else
                    {
                        LogUtil.error(Name + "收到复位信号,当前无报警,正在" + MoveInfo.MoveType + "处理中,不需要复位");
                    }
                }
                else
                {
                    LogUtil.info(Name + "收到复位信号,开始复位");
                    Reset();
                }
                return;
            }

            BusyMoveProcess();

            if(TrayLine1.MoveInfo.MoveType.Equals(LineMoveType.OutStore))
            {
                TrayLine1.OutStoreProcess();
            }

            if (TrayLine2.MoveInfo.MoveType.Equals(LineMoveType.OutStore))
            {
                TrayLine2.OutStoreProcess(); 
            }

            //判断流水线打开了才可以运行 
            if (runStatus.Equals(LineRunStatus.Runing) && NoAlarm() && MoveInfo.MoveType.Equals(LineMoveType.None))
            { 
                //皮带线3出口有料,分盘定位装置无料
                if (Line3Turn.InTurn.Equals(false) && IOValue(IO_Type.ExitTray_Check3).Equals(IO_VALUE.HIGH) && IOValue(IO_Type.SeparateDevice_Check).Equals(IO_VALUE.LOW))
                {
                    //开始扫码然后送出料盘
                    //1.扫码,
                    //2.从服务器获取尺寸
                    //3.顶升或下降定位气缸
                    //皮带线3转动,分料皮带转动,
                    //等待料盘到达工位。

                    StartOutStoreMove(new InOutParam()); 
                }
            }
            if (runStatus >= (LineRunStatus.HomeMoving) && NoAlarm())
            {
                TrayLine1.TimerPro();
                TrayLine2.TimerPro();
                Line3TimerPro();
            }
            IOTimeOutProcess();

            //判断红灯状态
            if (NoAlarm())
            {
                IOMove(IO_Type.DLine_RunAlarm, IO_VALUE.LOW);
            }
            else if (IOValue(IO_Type.DLine_RunAlarm).Equals(IO_VALUE.LOW))
            {
                IOMove(IO_Type.DLine_RunAlarm, IO_VALUE.HIGH);
            }
        }

        private void Line3TimerPro()
        {  
            //判断皮带线3出口无料,皮带线无操作
            if (Line3Turn.InTurn.Equals(false) && 
                Line3Turn.CanStart()&&
                MoveInfo.MoveType.Equals(LineMoveType.None) &&
                TrayLine1.Line3CanRun &&
                TrayLine2.Line3CanRun &&
                IOValue(IO_Type.ExitTray_Check3).Equals(IO_VALUE.LOW) &&
                Line3HasTray())
            {
                //判断皮带三还有料盘,需要转动一个工位 
                UpdateLastP();
                LogUtil.debug("皮带线3空闲,且流水线还有料盘,转动一个工位");
                Line3Turn.StartLineRun(IO_Type.DLine_Run3, IO_Type.Location_Check3, Line3EndProcess);
            }

        }
        private void UpdateLastP()
        {
            if (IOValue(IO_Type.EntryTray_Check3).Equals(IO_VALUE.HIGH))
            {
                Line3LastTrayP = 1;
            }
            else if (IOValue(IO_Type.MiddleTray_Check3).Equals(IO_VALUE.HIGH))
            {
                if (DeviceID.Equals(301))
                {
                    if (Line3LastTrayP < 1 || Line3LastTrayP > 12)
                    {
                        Line3LastTrayP = 12;
                    }
                }
                else if (DeviceID.Equals(302))
                {
                    if (Line3LastTrayP < 1 || Line3LastTrayP > 11)
                    {
                        Line3LastTrayP = 11;
                    }
                }
            }
        }

        private bool Line3HasTray()
        {
            if (Line3LastTrayP > 0 && Line3LastTrayP <= Line3MaxPosition)
            {
                return true;
            }
            if (IOValue(IO_Type.EntryTray_Check3).Equals(IO_VALUE.HIGH))
            {
                return true;
            }
            if (IOValue(IO_Type.MiddleTray_Check3).Equals(IO_VALUE.HIGH))
            {
                return true;
            }
            return false;
        }

        /// <summary>
        /// 转动结束,最后一盘料的位置+1
        /// </summary>
        /// <param name="result"></param>
        public void Line3EndProcess(bool result)
        {
            if (result)
            {
                if (Line3LastTrayP > 0)
                {
                    Line3LastTrayP++;
                }
            }
        }
        public virtual string GetMoveStr()
        {
            string msg = "";
            int tLength = 15;
            msg += "runStatus:".PadRight(tLength, ' ') + runStatus + "\n";
            msg += "lineStatus:".PadRight(tLength, ' ') + lineStatus + "\n";
            msg += "MoveType:".PadRight(tLength, ' ') + MoveInfo.MoveType + "\n";
            msg += "MoveStep:".PadRight(tLength, ' ') + MoveInfo.SLog + "\n";

            msg += "Line1-Move:".PadRight(tLength, ' ') + TrayLine1.MoveInfo.MoveType +"    " + TrayLine1.MoveInfo.MoveStep + "\n";
            msg += "Line2-Move:".PadRight(tLength, ' ') + TrayLine2.MoveInfo.MoveType + "    " + TrayLine2.MoveInfo.MoveStep + "\n";
            msg += "LastTrayP:".PadRight(tLength, ' ') + TrayLine1.LastTrayPosition+"    " + TrayLine2.LastTrayPosition + "    " + Line3LastTrayP + "    " + "\n";
            msg += "IsInRun:".PadRight(tLength, ' ') + TrayLine1.IsInTurn() + "    " + TrayLine2.IsInTurn() + "    "  +Line3Turn.InTurn + "    " +"\n";
            msg += "Line3CanRun:".PadRight(tLength, ' ') + TrayLine1.Line3CanRun + "    " + TrayLine2.Line3CanRun + "    " + "\n";
            return msg;
        }
        public override bool  StartInStoreMove(InOutParam param)
        {
            return false; 
        } 
        protected override void InStoreProcess()
        { 
        }

        protected override void CheckFixtureProcess()
        {
        }
    }
}