AutomaticBaiting.cs 13.9 KB
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace OnlineStore.DeviceLibrary
{
    public partial class AutomaticBaiting
    {
        public static int LastHeight = 0;
        public static int LastSize = 0;
        public static string LastCode = "";
        public static int AxisChangeValue = ConfigAppSettings.GetIntValue(Setting_Init.AxisChangeValue);
        public static string WarnMsg = "";
        public static  string Name = "自动上下料";
        public static  StoreMoveInfo StoreMove = null;
        public static StoreRunStatus AutoBaitingStatus = StoreRunStatus.Wait;
        /// <summary>
        /// 门状态,0=位初始化,1=关闭,2=打开,
        /// </summary>
        public static int AutoDoorSatus = 0;
        /// <summary>
        /// 初始化数据
        /// </summary>
        public static void Init()
        {
            StoreMove = new StoreMoveInfo(Name);
        }
        /// <summary>
        /// 定时处理
        /// </summary>
        public static void TimerProcess()
        {
            if (AutoBaitingStatus >= StoreRunStatus.Wait)
            {
                if (StoreMove.MoveType.Equals(StoreMoveType.StoreReset))
                {
                    ResetProcess();
                }
                else if (StoreMove.MoveType.Equals(StoreMoveType.InStore))
                {
                    InStoreProcess();
                }
                else if (StoreMove.MoveType.Equals(StoreMoveType.OutStore))
                {
                    OutStoreProcess();
                }
            }
        }

        /// <summary>
        /// 判断是否可以启动
        /// </summary>
        /// <returns></returns>
        public static string  CanStart()
        {
            string msg = "";
            //需要判断门关闭
            if (!DoorIsClose())
            {
                msg = "上料机构门未关闭"; 
                return msg;
            }
            //吸盘压力确认
            if (KND.IOValue(IO_Type.SuckingDisc_Air).Equals(IO_VALUE.LOW))
            {
                msg = "吸盘压力无信号"; 
                return msg;
            }
            return msg;
        }

        public static bool StartReset()
        {
            string msg = CanStart();
            if (!String.IsNullOrEmpty(msg))
            {
                LogUtil.info(Name+"复位失败:"+msg);
                return false;
            }
            AutoBaitingStatus = StoreRunStatus.Reset;
            StoreMove.NewMove(StoreMoveType.StoreReset);
            StoreMove.NextMoveStep(StoreMoveStep.AUTO_R01_CloseDoor);
            //关闭门,轴回原点,检测
            AutoDoorClose(true);
            KND.IOMove(IO_Type.SuckingDisc_Work, IO_VALUE.LOW);
            LogUtil.info(Name + "复位中:关闭门锁");
            return true;
        }

        private static void ResetProcess()
        {

            if (StoreMove.IsInWait)
            {
                CheckWait();
            }
            if (StoreMove.IsInWait)
            {
                return;
            }
            switch (StoreMove.MoveStep)
            {
                case StoreMoveStep.AUTO_R01_CloseDoor:
                    StoreMove.NextMoveStep(StoreMoveStep.AUTO_R02_AutoAxisHome);
                    LogUtil.info(Name + "复位中:自动轴原点返回");
                    ACAxisHomeMove(StoreManager.Config.Auto_Axis);
                    break;
                case StoreMoveStep.AUTO_R02_AutoAxisHome:
                    StoreMove.NextMoveStep(StoreMoveStep.AUTO_R03_AutoAxisHome); 
                    LogUtil.info(Name + "复位中:匀速向上运动,检测 是否有料盘");
                    ACAxisSpeedMove(StoreManager.Config.Auto_Axis, StoreManager.Config.Auto_Axis.TargetSpeed);
                    break;
                case StoreMoveStep.AUTO_R03_AutoAxisHome:

                    if (KND.IOValue(IO_Type.TrayCheck_LoadMaterial).Equals(IO_VALUE.LOW))
                    {
                        LogUtil.info(Name + "复位中: 没有料盘,不需要上料,上料轴回0点");
                        StoreMove.NextMoveStep(StoreMoveStep.AUTO_R04_AutoBack); 
                        ACAxisHomeMove(StoreManager.Config.Auto_Axis);
                    }
                    else
                    {
                        LogUtil.info(Name + "复位完成,有料盘,需要开始自动入料");
                        StoreMove.EndMove();
                        AutoBaitingStatus = StoreRunStatus.Runing;
                        //TODO
                        StartInOut();
                    } 
                    break; 
                case StoreMoveStep.AUTO_R04_AutoBack:
                    LogUtil.info(Name + "复位完成");
                    StoreMove.EndMove();
                    AutoBaitingStatus = StoreRunStatus.Runing;
                    WarnMsg = "";
                    break;
                default: break;
            }
        }
        public static bool StartInOut()
        {
           
            if (AutoBaitingStatus == StoreRunStatus.Runing)
            {
                AutoBaitingStatus = StoreRunStatus.Busy;
                StoreMove.NewMove(StoreMoveType.InStore);
                StoreMove.NextMoveStep(StoreMoveStep.AUTO_I01_MoveToUp);
                if (KND.IOValue(IO_Type.TrayCheck_LoadMaterial).Equals(IO_VALUE.HIGH))
                { 
                    LogUtil.error(Name + " 启动入料 ,已检测到料盘,轴不需要上升" );
                }
                else
                {
                    LogUtil.error(Name + " 启动入料 ,轴上升到检测到料盘");
                    ACAxisSpeedMove(StoreManager.Config.Auto_Axis, StoreManager.Config.Auto_Axis.TargetSpeed);
                }
                return true;
            }
            else
            {
                LogUtil.error(Name + " 启动入料出错,当前状态,AutoBaitingStatus=" + AutoBaitingStatus);
                return false;
            }
        }
        private static void InStoreProcess()
        {

            if (StoreMove.IsInWait)
            {
                CheckWait();
            }
            if (StoreMove.IsInWait)
            {
                return;
            }

            if (StoreMove.MoveStep.Equals(StoreMoveStep.AUTO_I01_MoveToUp))
            {
                 SuckingDiscWork(); 
            }else if (StoreMove.MoveType.Equals(StoreMoveStep.AUTO_I02_SuckingDisc_Down))
            {
                StoreMove.NextMoveStep(StoreMoveStep.AUTO_I03_SuckingDisc_Work);
                LogUtil.info(Name + "入料: 开始吸料盘");
                KND.IOMove(IO_Type.SuckingDisc_Work, IO_VALUE.HIGH);
                StoreMove.WaitList.Add(WaitResultInfo.WaitTime(200));
            }
            else if (StoreMove.MoveType.Equals(StoreMoveStep.AUTO_I03_SuckingDisc_Work))
            {
                StoreMove.NextMoveStep(StoreMoveStep.AUTO_I04_SuckingDisc_Up);
                LogUtil.info(Name + "入料: 吸盘上升,同时上料轴也上升");
                CylinderMove(IO_Type.SuckingDisc_Up,IO_Type.SuckingDisc_Down, true);
                ACAxisSpeedMove(StoreManager.Config.Auto_Axis, StoreManager.Config.Auto_Axis.TargetSpeed);
            }
            else if (StoreMove.MoveType.Equals(StoreMoveStep.AUTO_I04_SuckingDisc_Up))
            {
                //需要料仓没有出入库才可以扫码
                if (StoreManager.Store.CanStarInOut())
                {
                    LastHeight = 0;
                    LastSize = 0;
                    LastCode = "";
                    StoreMove.NextMoveStep(StoreMoveStep.AUTO_I05_ScanCode);
                    //计算高度
                    EndMovePosition = ACServerManager.GetActualtPosition(StoreManager.Config.Auto_Axis.DeviceName, StoreManager.Config.Auto_Axis.GetAxisValue());
                    int height = Math.Abs(EndMovePosition - StartMovePosition) / AxisChangeValue;
                    int size = GetSize();
                    LogUtil.info(Name + "入料: 开始扫码,料盘尺寸:【" + size + "*" + height + "】");
                    LastHeight = height;
                    LastSize = size;
                    StoreMove.WaitList.Add(WaitResultInfo.WaitCodeOK());
                    StoreMove.WaitList.Add(WaitResultInfo.WaitTime(2000));
                    StoreMove.OneWaitCanEndStep = true;
                }
            }
            else if (StoreMove.MoveType.Equals(StoreMoveStep.AUTO_I05_ScanCode))
            {
                if (LastCode.Equals(""))
                {
                    StoreMove.NextMoveStep(StoreMoveStep.AUTO_I07_OpenDoor);
                    LogUtil.info(Name + "入料: 未扫到二维码,打开仓门");
                    CylinderMove(IO_Type.Door_Up, IO_Type.Door_Down, true);
                }
                else
                {
                    StoreMove.NextMoveStep(StoreMoveStep.AUTO_I06_WaitTrayLeave);
                    LogUtil.info(Name + "入料: 开始入料,等待料盘拿走");
                    StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.SuckingDisc_Work, IO_VALUE.LOW));
                    StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.WidthCheck1, IO_VALUE.LOW));
                    StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.WidthCheck2, IO_VALUE.LOW));
                }
            }else if (StoreMove.MoveType.Equals(StoreMoveStep.AUTO_I06_WaitTrayLeave))
            {
                SuckingDiscWork();
            } else if (StoreMove.MoveType.Equals(StoreMoveStep.AUTO_I07_OpenDoor)){
                StoreMove.NextMoveStep(StoreMoveStep.AUTO_I08_WaitTakeTray);
                LogUtil.info(Name + "入料: 未扫到二维码,等待拿走料盘");
                StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.SuckingDisc_Work, IO_VALUE.LOW));
                StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.WidthCheck1, IO_VALUE.LOW));
                StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.WidthCheck2, IO_VALUE.LOW));
            }
            else if (StoreMove.MoveType.Equals(StoreMoveStep.AUTO_I08_WaitTakeTray))
            {
                StoreMove.NextMoveStep(StoreMoveStep.AUTO_I09_TrayLeaveWaitTime);
                LogUtil.info(Name + "入料: 未扫到二维码,料盘已拿走,等待1秒后关门");
                StoreMove.WaitList.Add(WaitResultInfo.WaitTime(1000));
            }
            else if (StoreMove.MoveType.Equals(StoreMoveStep.AUTO_I09_TrayLeaveWaitTime))
            {
                StoreMove.NextMoveStep(StoreMoveStep.AUTO_I10_CloseDoor);
                LogUtil.info(Name + "入料: 未扫到二维码,料盘已拿走,关闭仓门");
                CylinderMove(IO_Type.Door_Down, IO_Type.Door_Up, true);
            }else if (StoreMove.MoveType.Equals(StoreMoveStep.AUTO_I10_CloseDoor))
            {
                SuckingDiscWork();
            }
            else
            {
                LogUtil.error(Name+"未找到步骤:"+StoreMove.MoveType);
            }
        }
        /// <summary>
        /// 吸盘下降开始吸走料盘
        /// </summary>
        private static void SuckingDiscWork()
        {
            if (KND.IOValue(IO_Type.TrayCheck_LoadMaterial).Equals(IO_VALUE.HIGH))
            {
                StoreMove.NextMoveStep(StoreMoveStep.AUTO_I02_SuckingDisc_Down);
                LogUtil.info(Name + "入料: 检测到料盘, 吸盘开始下降");
                CylinderMove(IO_Type.SuckingDisc_Down,IO_Type.SuckingDisc_Up, true);
            }
            else
            {
                //TODO 
                LogUtil.info(Name + "入料:已经没有料盘,入料结束");
                StoreMove.EndMove();
                AutoBaitingStatus = StoreRunStatus.Runing;
            }
        }
        public static void  OutStoreProcess()
        {

        }





















      
        public static bool DoorIsClose()
        {
            if (KND.IOValue(IO_Type.DoorClose_LoadMaterial).Equals(IO_VALUE.HIGH)) 
            {
                return true;
            }
            return false;
        }
        public static void AutoDoorOpen (bool isWait)
        {
            KND.IOMove(IO_Type.AutoDoor_Close, IO_VALUE.LOW);
            KND.IOMove(IO_Type.AutoDoor_Open, IO_VALUE.HIGH);
            if (isWait)
            {
                StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.AutoDoor_Close, IO_VALUE.LOW));
                StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.AutoDoor_Open, IO_VALUE.HIGH));
            }
        }
        public static void AutoDoorClose(bool isWait)
        {
            if (isWait)
            {
                StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.AutoDoor_Open, IO_VALUE.LOW));
                StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.AutoDoor_Close, IO_VALUE.HIGH));
            }
            KND.IOMove(IO_Type.AutoDoor_Open, IO_VALUE.LOW);
            KND.IOMove(IO_Type.AutoDoor_Close, IO_VALUE.HIGH);
        }

        //public static void SuckingDiscDown(bool isWait)
        //{
        //    if (isWait)
        //    {
        //        StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.SuckingDisc_Up, IO_VALUE.LOW));
        //        StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.SuckingDisc_Down, IO_VALUE.HIGH));
        //    }
        //    KND.IOMove(IO_Type.SuckingDisc_Up, IO_VALUE.LOW);
        //    KND.IOMove(IO_Type.SuckingDisc_Down, IO_VALUE.HIGH);
        //}
        //public static void SuckingDiscUp(bool isWait)
        //{
        //    if (isWait)
        //    {
        //        StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.SuckingDisc_Down, IO_VALUE.LOW));
        //        StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.SuckingDisc_Up, IO_VALUE.HIGH));
        //    }
        //    KND.IOMove(IO_Type.SuckingDisc_Down, IO_VALUE.LOW);
        //    KND.IOMove(IO_Type.SuckingDisc_Up, IO_VALUE.HIGH);
        //}
    }
}