DischargeLine.cs 8.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 DischargeLine_Config Config;

        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");
        }

        /// <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()
        {
            ResetClearData();
            lineStatus = LineStatus.ResetMove;
            MoveInfo.NextMoveStep(LineMoveStep.DL_R_CylinderDown);
            CylinderMove(MoveInfo, IO_Type.SeparateDevice_Up, IO_Type.SeparateDevice_Down);
            IOMove(IO_Type.DLine_RunStatus, IO_VALUE.HIGH);
            IOMove(IO_Type.DLine_RunAlarm, IO_VALUE.LOW);
            if (IsDebug)
            {
                mainTimer.Start();
            }
            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;
                        MoveInfo.EndMove();
                        SecondMoveInfo.EndMove();
                        break;
                  
                    default: break;
                }
            }

        }

        /// <summary>
        /// 停止运动
        /// </summary>
        internal override void StopMove()
        { 
            runStatus = LineRunStatus.Busy;
            MoveInfo.EndMove();
            SecondMoveInfo.EndMove();
            StopLineRun();
            LogInfo("停止运动:(定位气缸下降,皮带线停转 )开始 ");
            CylinderMove(null, IO_Type.SeparateDevice_Up, IO_Type.SeparateDevice_Down);

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

        public override void TimerProcess()
        {
            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 (alarmType.Equals(LineAlarmType.None))
                {
                    if (MoveInfo.MoveType.Equals(LineMoveType.None))
                    {
                        LogUtil.error(Name + "收到复位信号,当前无报警,不需要复位");
                    }
                    else
                    {
                        LogUtil.error(Name + "收到复位信号,当前无报警,正在" + MoveInfo.MoveType + "处理中,不需要复位");
                    }
                }
                else
                {
                    LogUtil.info(Name + "收到复位信号,开始复位");
                    Reset();
                }
                return;
            }

            BusyMoveProcess();
            //判断流水线打开了才可以运行 

            if (runStatus.Equals(LineRunStatus.Runing) && alarmType.Equals(LineAlarm.None))
            {
                //判断是否需要入库  
                if (IOValue(IO_Type.DLine_Exit_Check3).Equals(IO_VALUE.LOW) && LineRuning.Equals(false))
                {
                    //皮带3入口或者中间有料盘,出口无料盘,转动皮带三
                    if ((IOValue(IO_Type.DLine_Entry_Check3).Equals(IO_VALUE.HIGH) || IOValue(IO_Type.DLine_Middle_Check3).Equals(IO_VALUE.HIGH)))
                    {
                        StartLineRun(IO_Type.DLine_Run3, IO_Type.DLine_Location_Check3);
                    }
                }
                if (IOValue(IO_Type.DLine_Entry_Check3).Equals(IO_VALUE.LOW) && LineRuning.Equals(false) && MoveInfo.MoveType.Equals(LineMoveType.None))
                {
                    if ((IOValue(IO_Type.DLine_Entry_Check1).Equals(IO_VALUE.HIGH) || IOValue(IO_Type.DLine_Exit_Check1).Equals(IO_VALUE.HIGH)))
                    {
                        StartLineRun(IO_Type.DLine_Run1, IO_Type.DLine_Location_Check1);
                    }
                }
                if (IOValue(IO_Type.DLine_Middle_Check3).Equals(IO_VALUE.LOW) && LineRuning.Equals(false) && SecondMoveInfo.MoveType.Equals(LineMoveType.None))
                {
                    if ((IOValue(IO_Type.DLine_Entry_Check2).Equals(IO_VALUE.HIGH) || IOValue(IO_Type.DLine_Exit_Check2).Equals(IO_VALUE.HIGH)))
                    {
                        StartLineRun(IO_Type.DLine_Run2, IO_Type.DLine_Location_Check2);
                    }
                }
                //皮带1皮带2先转动,到达位置后,皮带3再转动
            }
            IOTimeOutProcess();

            //判断红灯状态
            if (alarmType.Equals(LineAlarmType.None))
            {
                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);
            }
        }
         
        public override bool  StartInStoreMove(InOutParam param)
        {
            return false; 
        } 
        protected override void InStoreProcess()
        { 
        }

        protected override void CheckFixtureProcess()
        {
        }
    }
}