PackageLine.cs 8.1 KB
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
namespace OnlineStore.DeviceLibrary
{
    public partial class PackageLine : RobotBase
    {
        DoubleLineConfig Config;

        static String agvServerIp = ConfigAppSettings.GetValue(Setting_Init.AgvServerIp);
        Asa.AgvClient agvClient = new Asa.AgvClient(agvServerIp);
        AgvClient_Dbline agvClient_Dbline = new AgvClient_Dbline();

        public PackageLine(DoubleLineConfig config) : base(config)
        {
            this.Config = config;
            agvClient.CancelState = false;
            agvClient.Log += AgvClient_Log;
            agvClient.Ready += AgvClient_Ready;

            agvClient.CloseDoor += AgvClient_CloseDoor;
            mainTimer.Elapsed += packageLineProcess;
            agvClient_Dbline.Init();
        }


        public enum MAIN_STEP
        {
            NONE, RESET, RUN
        }

        StepInfo<MAIN_STEP> mainStep = new StepInfo<MAIN_STEP>(MAIN_STEP.NONE);

        public override void Reset()
        {
            LogUtil.info("包装线体开始复位");
            mainStep = new StepInfo<MAIN_STEP>(MAIN_STEP.NONE);

            agvA3Step = new StepInfo<AGV_ENTER_A3_STEP>(AGV_ENTER_A3_STEP.NONE);
            agvA4Step = new StepInfo<AGV_LEAVE_A4_STEP>(AGV_LEAVE_A4_STEP.NONE);
            inStep = new StepInfo<IN_SHELF>(IN_SHELF.NONE);
            pkgStationStep = new StepInfo<PKG_STATION_STEP>(PKG_STATION_STEP.NONE);
            s2StationStep = new StepInfo<S2_STATION_STEP>(S2_STATION_STEP.NONE);

            benQInStepLeft = new StepInfo<BenQ_IN_STEP>(BenQ_IN_STEP.NONE);
            benQInStepRight = new StepInfo<BenQ_IN_STEP>(BenQ_IN_STEP.NONE);
            benQOutStep = new StepInfo<BenQ_OUT_STEP>(BenQ_OUT_STEP.NONE);

            //判断机器人是否连接,若未连接,直接连接
            //if (!ABBControl.IsConnected(Config.ABB3_IP))
            //{
            //    ABBControl.StartABBControl(Config.ABB3_IP);
            //}

            if (!agvClient.IsConn)
            {
                LogUtil.info("开始连接AGV服务");
                agvClient.Connect();
            }
            if (!agvClient_Dbline.ISConnected())
            {
                agvClient_Dbline.agvClient.Connect();
                LogUtil.info("开启BenQ AGV 连接");
            }
            //包装线体工位下降
            CylinderMove(null, IO_Type.Pkg_Station_SOL_UP, IO_Type.Pkg_Station_SOL_Down);

            //阻挡1下降 2上升 3上升 4上升
            IOMove(IO_Type.Pkg_Stop1_Down, IO_VALUE.HIGH);
            IOMove(IO_Type.Pkg_Stop2_Down, IO_VALUE.LOW);
            IOMove(IO_Type.Pkg_Stop3_Down, IO_VALUE.LOW);
            IOMove(IO_Type.Pkg_Out_Stop_Down, IO_VALUE.LOW);

            //双层线上层阻挡
            IOMove(IO_Type.RHigh_StopCylinder1, IO_VALUE.HIGH);
            IOMove(IO_Type.RHigh_StopCylinder2, IO_VALUE.LOW);

            //
            LogUtil.info(Name + " 线体复位:线体转30秒");
            int lineRunTime = 30000;
            IOMove(IO_Type.Pkg_Line1_Forward, IO_VALUE.HIGH, lineRunTime);
            IOMove(IO_Type.Pkg_Line2_Forward, IO_VALUE.HIGH, lineRunTime);
            IOMove(IO_Type.Pkg_Line3_Forward, IO_VALUE.HIGH, lineRunTime);
            IOMove(IO_Type.RHigh_LineRun, IO_VALUE.HIGH, lineRunTime);

            //S2工位
            IOMove(IO_Type.S2_StopCylinder1, IO_VALUE.LOW);
            IOMove(IO_Type.S2_StopCylinder2, IO_VALUE.LOW);

            //双层线出料口
            IOMove(IO_Type.R_StopCylinder1, IO_VALUE.HIGH);
            IOMove(IO_Type.R_LeftStopCylinder, IO_VALUE.LOW);
            IOMove(IO_Type.R_StopCylinder2, IO_VALUE.LOW);

            //升降机运转关
            IOMove(IO_Type.R_OutLineRun, IO_VALUE.LOW);

            IOMove(IO_Type.R_LineRun, IO_VALUE.HIGH, lineRunTime);

            mainStep.ToNextStep(MAIN_STEP.RESET);
            mainStep.AddTimeWait(lineRunTime+5000);
            mainTimer.Enabled = true;
        }

        private object packLock = new object();
        private void packageLineProcess(object sender, ElapsedEventArgs e)
        {
            if (mainStep.IsStep(MAIN_STEP.RUN))
            {
                if(Monitor.TryEnter(packLock))
                {
                    try
                    {
                        //ProcessA3Agv();
                        //ProcessA4Agv();
                        ProcessInShelf();
                        ProcessPkgStation();
                        ProcessS2Station();
                        ProcessBenQLeftEnter();
                        ProcessBenQRightEnter();
                        ProcessBenQLeave();
                        //BenQ 右侧入料
                        ProcessRBufferTranverse();
                        ProcessBenQEnterFromOut();
                        CheckA5State();
                        CheckA6State();
                    }
                    catch (Exception ex)
                    {
                        LogUtil.error("packageLineProcess " + ex.ToString());
                    }
                    finally
                    {
                        Monitor.Exit(packLock);
                    }
                }

            }
            else if (mainStep.IsStep(MAIN_STEP.RESET))
            {
                if (mainStep.IsFinished())
                {
                    LogUtil.info("包装线体复位完成");
                    mainStep.ToNextStep(MAIN_STEP.RUN);
                }
            }
        }

        public override bool StartRun()
        {
            LogUtil.info(Name + "包装线开始启动,启动时间:" + DateTime.Now);
            Reset();
            return true;
        }

        public override void StopMove()
        {
            mainStep.ToNextStep(MAIN_STEP.NONE);
            LogUtil.info(Name + " 包装线体停止");
            //包装线体工位下降
            CylinderMove(null, IO_Type.Pkg_Station_SOL_UP, IO_Type.Pkg_Station_SOL_Down);

            IOMove(IO_Type.Pkg_Stop1_Down, IO_VALUE.LOW);
            IOMove(IO_Type.Pkg_Stop2_Down, IO_VALUE.LOW);
            IOMove(IO_Type.Pkg_Stop3_Down, IO_VALUE.LOW);
            IOMove(IO_Type.Pkg_Out_Stop_Down, IO_VALUE.LOW);

            //
            IOMove(IO_Type.Pkg_Line1_Forward, IO_VALUE.LOW);
            IOMove(IO_Type.Pkg_Line2_Forward, IO_VALUE.LOW);
            IOMove(IO_Type.Pkg_Line3_Forward, IO_VALUE.LOW);

            //S2工位
            IOMove(IO_Type.S2_StopCylinder1, IO_VALUE.LOW);
            IOMove(IO_Type.S2_StopCylinder2, IO_VALUE.LOW);

            //双层线出料口
            IOMove(IO_Type.R_StopCylinder1, IO_VALUE.HIGH);
            IOMove(IO_Type.R_LeftStopCylinder, IO_VALUE.LOW);
            IOMove(IO_Type.R_StopCylinder2, IO_VALUE.LOW);
            //右侧上层阻挡
            IOMove(IO_Type.RHigh_StopCylinder1, IO_VALUE.HIGH);
            IOMove(IO_Type.RHigh_StopCylinder2, IO_VALUE.LOW);

            IOMove(IO_Type.R_LineRun, IO_VALUE.LOW);

            try
            {
                if (!agvClient.IsConn)
                {
                    LogUtil.info("停止AGV服务");
                    agvClient.Close();
                }
            }
            catch (Exception ex)
            {
                LogUtil.error("停止AGV服务出错", ex);
            }

            try
            {
                LogUtil.info("停止BenQ AGV服务");
                agvClient_Dbline.Dispose();
            }
            catch(Exception ex)
            {
                LogUtil.error("停止BenQ AGV服务出错", ex);
            }
        }

        public override void StopRun()
        {
            mainTimer.Enabled = false;
            StopMove();
        }

        /// <summary>
        /// 保持线体持续转动
        /// </summary>
        private void KeepLineRun(String lineIoType)
        {
            bool isLineStop = IOValue(lineIoType).Equals(IO_VALUE.LOW);
            if (isLineStop)
            {
                IOMove(lineIoType, IO_VALUE.HIGH);
                LogUtil.info("线体[" + lineIoType + "]已停止,重新转动");
            }
        }

    }

   
}