PackageLine.cs 7.9 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("开启产线 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 void packageLineProcess(object sender, ElapsedEventArgs e)
        {
            if (mainStep.IsStep(MAIN_STEP.RUN))
            {
                try
                {
                    //ProcessA3Agv();
                    //ProcessA4Agv();
                    //ProcessInShelf();
                    //ProcessPkgStation();
                    //ProcessS2Station();
                    ProcessBenQLeftEnter();
                    ProcessBenQRightEnter();
                    ProcessBenQLeave();
                    //BenQ 右侧入料
                    ProcessBenQEnterFromOut();
                    CheckA5State();
                    CheckA6State();
                }
                catch(Exception ex)
                {                    
                    LogUtil.error("packageLineProcess " + ex.ToString());
                }
            }
            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("停止产线 AGV服务");
                agvClient_Dbline.Dispose();
            }
            catch(Exception ex)
            {
                LogUtil.error("停止产线 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 + "]已停止,重新转动");
            }
        }

    }

   
}