InputEquip_InStore.cs 15.8 KB
using Asa;
using DeviceLib;
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace OnlineStore.DeviceLibrary
{
    partial class InputEquip
    {
        protected override bool CheckWaitResult(RobotMoveInfo moveInfo, WaitResultInfo wait)
        {
            if (wait.WaitType.Equals(WaitEnum.W101_BatchAxisMove))
            {
            }
            else if (wait.WaitType.Equals(WaitEnum.W102_FeedScanCode))
            {

            }
            return false;
        }


        #region 取放料
        public override bool StartWorking(WorkParam param)
        {
            if (!NoAlarm())
            {
                WorkLog("报警中,无法开始取放料:" + param.ToStr());
                return false;
            }

            if (MoveInfo.MoveType.Equals(RobotMoveType.None))
            {
                MoveInfo.NewMove(RobotMoveType.Working, StepEnum.IW01_InoutToP1);
                MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
                MoveInfo.MoveParam = param;

                //如果升降轴,旋转轴,进出轴都在指定位置,直接进出轴前进
                if (InOutAxis.IsInPosition(Config.InoutAxis_P1))
                {
                    if (UpdownAxis.IsInPosition(Config.UpdownAxis_P1))
                    {
                        if (MiddleAxis.IsInPosition(MoveInfo.MoveParam.Get_Middle_P2(Config)))
                        {
                            IW04_InoutToP2();
                        }
                        else
                        {
                            IW03_MiddleToP2();
                        }
                    }
                    else
                    {
                        IW02_UpdownToP1();
                    }
                }
                else
                {
                    WorkLog("开始取料:" + param.ToStr() + ",进出轴返回待机点");
                    InOutAxis.AbsMove(MoveInfo, Config.InoutAxis_P1, Config.InoutAxis_P1Speed);
                }
                return true;
            }
            return false;
        }
        private void IW02_UpdownToP1()
        {
            MoveInfo.NextMoveStep(StepEnum.IW02_UpdownToP1);
            WorkLog("取料: 升降轴到待机点P1");
            UpdownAxis.AbsMove(MoveInfo, Config.UpdownAxis_P1, Config.UpdownAxis_P1Speed);
        }
        private void IW03_MiddleToP2()
        {
            MoveInfo.NextMoveStep(StepEnum.IW03_MiddleToP2);
            WorkLog("取料: 旋转轴到取料位置P2");
            MiddleAxis.AbsMove(MoveInfo, MoveInfo.MoveParam.Get_Middle_P2(Config), Config.MiddleAxis_P2Speed);
        }
        private void IW04_InoutToP2()
        {
            MoveInfo.NextMoveStep(StepEnum.IW04_InoutToP2);
            WorkLog("取料: 进出轴前进到P2");
            InOutAxis.AbsMove(MoveInfo, MoveInfo.MoveParam.Get_Inout_P2(Config), Config.InoutAxis_P2Speed);
        }
        protected override void WorkingProcess()
        {
            if (MoveInfo.IsInWait)
            {
                CheckWait(MoveInfo);
            }
            if (MoveInfo.IsInWait)
            {
                return;
            }

            #region 取料
            if (MoveInfo.IsStep(StepEnum.IW01_InoutToP1))
            {
                IW02_UpdownToP1();
            }
            else if (MoveInfo.IsStep(StepEnum.IW02_UpdownToP1))
            {
                IW03_MiddleToP2();
            }
            else if (MoveInfo.IsStep(StepEnum.IW03_MiddleToP2))
            {
                IW04_InoutToP2();
            }
            else if (MoveInfo.IsStep(StepEnum.IW04_InoutToP2))
            {
                MoveInfo.NextMoveStep(StepEnum.IW05_UpdownToP2);
                WorkLog("取料: 升降轴下降到P2");
                UpdownAxis.AbsMove(MoveInfo, MoveInfo.MoveParam.Get_Updown_P2(Config), Config.UpdownAxis_P2Speed);
            }
            else if (MoveInfo.IsStep(StepEnum.IW05_UpdownToP2))
            {
                MoveInfo.NextMoveStep(StepEnum.IW06_Clamping_Work);
                MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
                WorkLog("取料: 夹料气缸夹紧");
                CylinderMove(MoveInfo, IO_Type.Clamping_Relax, IO_Type.Clamping_Work);
            }
            else if (MoveInfo.IsStep(StepEnum.IW06_Clamping_Work))
            {
                if (CylinderIsOk(IO_Type.Clamping_Relax, IO_Type.Clamping_Work))
                {
                    MoveInfo.NextMoveStep(StepEnum.IW07_UpdownToP1);
                    WorkLog("取料: 升降轴到待机点P1");
                    UpdownAxis.AbsMove(MoveInfo, Config.UpdownAxis_P1, Config.UpdownAxis_P1Speed);
                }
                else
                {
                    MoveInfo.NextMoveStep(StepEnum.IW06_Clamping_Work);
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
                    WorkLog("取料: 夹料气缸夹紧");
                    CylinderMove(MoveInfo, IO_Type.Clamping_Relax, IO_Type.Clamping_Work);
                }
            }
            else if (MoveInfo.IsStep(StepEnum.IW07_UpdownToP1))
            {
                MoveInfo.NextMoveStep(StepEnum.IW08_WaitAxisCheck);
                WorkLog("取料: 等待伺服检测信号消失");
                if (MoveInfo.MoveParam.InPosType.Equals(1))
                {
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.L_AxisTrayCheck, IO_VALUE.LOW));
                }
                else
                {
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.R_AxisTrayCheck, IO_VALUE.LOW));
                }
            }
            else if (MoveInfo.IsStep(StepEnum.IW08_WaitAxisCheck))
            {
                MoveInfo.NextMoveStep(StepEnum.IW09_InoutToP1);
                WorkLog("取料: 进出轴返回P1");
                if (MoveInfo.MoveParam.InPosType.Equals(1))
                {
                    LeftBatchMove.GetTrayOK();
                }
                else
                {
                    RightBatchMove.GetTrayOK();
                }
                InOutAxis.AbsMove(MoveInfo, Config.InoutAxis_P1, Config.InoutAxis_P1Speed);
            }
            else if (MoveInfo.IsStep(StepEnum.IW09_InoutToP1))
            {
                bool isOk = MoveInfo.MoveParam.PlateH > 0 && MoveInfo.MoveParam.PlateW > 0;
                BatchMoveBean moveBean = MoveInfo.MoveParam.InPosType.Equals(1) ? LeftBatchMove : RightBatchMove;
                if (moveBean.LastHeight > 0 || isOk)
                {
                    MoveInfo.NextMoveStep(StepEnum.IW10_SaveSize);
                    MoveInfo.MoveParam.PlateH = moveBean.LastHeight;
                    MoveInfo.MoveParam.PlateW = GetWidth();
                    WorkLog("测高结束, 记录尺寸【"+ MoveInfo.MoveParam.PlateW + "X"+ MoveInfo.MoveParam.PlateH + "】,开始下一盘预扫码");
                  
                }
                else if (MoveInfo.IsTimeOut(60))
                {
                    WarnMsg =Name+ "等待" + moveBean.Name + "测高结束超时[" + MoveInfo.TimeOutSeconds + "]秒";
                    LogUtil.error(  WarnMsg, MoveInfo.ErrorLogType);
                    Alarm(AlarmType.IoSingleTimeOut);
                }
            }
            else if (MoveInfo.IsStep(StepEnum.IW10_SaveSize))
            {
                MoveInfo.NextMoveStep(StepEnum.IW11_GetTargetPosition);
                MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                if (String.IsNullOrEmpty(MoveInfo.MoveParam.WareCode))
                {
                    MoveInfo.MoveParam.IsNgReel = true;
                    MoveInfo.MoveParam.NgMsg = "无有效条码";
                    MoveInfo.MoveParam.TargetPosType = 1;
                    WorkLog(" 无有效条码,从XRay放到NG箱:" + MoveInfo.MoveParam.ToStr());
                }
                else if (SServerManager.CanConnect())
                {
                    Task task = Task.Factory.StartNew(delegate
                    {
                        int needPosition = 0;
                        string msg = SServerManager.Get_VMICheckRLC(Name, MoveInfo.MoveParam.WareCode, out needPosition);

                        if (needPosition >= 1 && needPosition <= 3)
                        {
                            MoveInfo.MoveParam.TargetPosType = needPosition;
                            WorkLog(" 【" + MoveInfo.MoveParam.WareCode + "】通过接口获取目标位置:" + needPosition);
                        }
                        //   else if (!msg.Equals("") || needPosition.Equals(0))
                        else
                        {
                            WorkLog(" 【" + MoveInfo.MoveParam.WareCode + "】获取是否测值失败:" + msg);
                            MoveInfo.MoveParam.TargetPosType = 1;
                            MoveInfo.MoveParam.IsNgReel = true;
                            MoveInfo.MoveParam.NgMsg = msg;
                        }
                    });
                }
                else
                {
                    if (MoveInfo.MoveParam.TargetPosType.Equals(0))
                    {
                        if (DefautTargetP > 0)
                        {
                            MoveInfo.MoveParam.TargetPosType = DefautTargetP;
                        }
                    }
                    WorkLog(" 根据条码获取目标位置:" + MoveInfo.MoveParam.ToStr());
                }
            }
            #endregion

            else if (MoveInfo.IsStep(StepEnum.IW11_GetTargetPosition))
            {
                if (MoveInfo.MoveParam.TargetPosType.Equals(0))
                {
                    if (SServerManager.CanConnect())
                    {
                        if (MoveInfo.IsTimeOut(120))
                        {
                            WarnMsg = Name + "等待" + MoveInfo.MoveParam.WareCode + "验证是否测值 超时[" + MoveInfo.TimeOutSeconds + "]秒";
                            LogUtil.error(  WarnMsg,MoveInfo.ErrorLogType);
                            Alarm(AlarmType.IoSingleTimeOut);
                        }
                        return;

                    }
                    else
                    {
                        //随机目标地址
                        Random r = new Random();
                        int targetP = r.Next(1, 100) % 3 + 1;
                        MoveInfo.MoveParam.TargetPosType = targetP;
                        WorkLog(" 随机放料目标:" + targetP);
                    }
                }
                if (MoveInfo.MoveParam.TargetPosType.Equals(1))
                {
                    MoveInfo.NextMoveStep(StepEnum.IW21_MiddleToP3);
                    WorkLog(" 开始放料到XRay入口,旋转轴到P3");
                    MiddleAxis.AbsMove(MoveInfo, Config.MiddleAxis_P3, Config.MiddleAxis_P3Speed);
                }
                else
                {
                    MoveInfo.NextMoveStep(StepEnum.IW31_MIddleToP4);
                    WorkLog(" 开始放料到测值工位,旋转轴到P4");
                    MiddleAxis.AbsMove(MoveInfo, Config.MiddleAxis_P4, Config.MiddleAxis_P4Speed);
                }
            }

            else if (MoveInfo.IsStep(StepEnum.IW21_MiddleToP3))
            {
                MoveInfo.NextMoveStep(StepEnum.IW22_UpdownToP3);
                WorkLog("->XRay: 升降轴到P3");
                UpdownAxis.AbsMove(MoveInfo, Config.UpdownAxis_P3, Config.UpdownAxis_P3Speed);
            }
            else if (MoveInfo.IsStep(StepEnum.IW22_UpdownToP3))
            {
                MoveInfo.NextMoveStep(StepEnum.IW23_InoutToP3);
                WorkLog("->XRay:进出轴到P3");
                InOutAxis.AbsMove(MoveInfo, Config.InoutAxis_P3, Config.InoutAxis_P3Speed);
            }
            else if (MoveInfo.IsStep(StepEnum.IW23_InoutToP3))
            {
                MoveInfo.NextMoveStep(StepEnum.IW24_WaitCanPut);
                WorkLog("->XRay:等待XRay可放料");
                MoveInfo.TimeOutSeconds = 120;
                //TODO
                MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.X_InLine_Check, IO_VALUE.LOW));
                MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.X_InLine_Run, IO_VALUE.LOW));
            }
            else if (MoveInfo.IsStep(StepEnum.IW24_WaitCanPut))
            {
                MoveInfo.NextMoveStep(StepEnum.IW41_Clamping_Relax);
                RobotManager.robot.XrayBean.In_ReelInfo = MoveInfo.MoveParam.GetReelInfo();
                WorkLog("->XRay:夹料气缸放松,更新XRay入口料盘:" + RobotManager.robot.XrayBean.In_ReelInfo.ToStr());
                CylinderMove(MoveInfo, IO_Type.Clamping_Work, IO_Type.Clamping_Relax);
            }

            else if (MoveInfo.IsStep(StepEnum.IW31_MIddleToP4))
            {
                MoveInfo.NextMoveStep(StepEnum.IW32_UpdownToP4);
                WorkLog("->测值工位:升降轴到P4");
                UpdownAxis.AbsMove(MoveInfo, MoveInfo.MoveParam.Get_Updown_PutP(Config), Config.UpdownAxis_P4Speed);
            }
            else if (MoveInfo.IsStep(StepEnum.IW32_UpdownToP4))
            {
                MoveInfo.NextMoveStep(StepEnum.IW33_InoutToP4);
                WorkLog("->测值工位:进出轴到P4");
                InOutAxis.AbsMove(MoveInfo, Config.InoutAxis_P4, Config.InoutAxis_P4Speed);
            }
            else if (MoveInfo.IsStep(StepEnum.IW33_InoutToP4))
            {
                MoveInfo.NextMoveStep(StepEnum.IW41_Clamping_Relax);
                WorkLog("->测值工位:夹料气缸放松");
                CylinderMove(MoveInfo, IO_Type.Clamping_Work, IO_Type.Clamping_Relax);
            }
            else if (MoveInfo.IsStep(StepEnum.IW41_Clamping_Relax))
            {
                MoveInfo.NextMoveStep(StepEnum.IW42_InoutToP1);
                WorkLog("放料完成:进出轴返回P1");
                InOutAxis.AbsMove(MoveInfo, Config.InoutAxis_P1, Config.InoutAxis_P1Speed);
            }
            else if (MoveInfo.IsStep(StepEnum.IW42_InoutToP1))
            {
                MoveInfo.NextMoveStep(StepEnum.IW43_UpdownToP1);
                WorkLog("放料完成:升降轴返回P1");
                UpdownAxis.AbsMove(MoveInfo, Config.UpdownAxis_P1, Config.UpdownAxis_P1Speed);
            }
            else if (MoveInfo.IsStep(StepEnum.IW43_UpdownToP1))
            {
                MoveInfo.NextMoveStep(StepEnum.IW44_MiddleToP2);
                WorkLog("放料完成:旋转轴返回P2");
                MiddleAxis.AbsMove(MoveInfo, MoveInfo.MoveParam.Get_Middle_P2(Config), Config.MiddleAxis_P2Speed);
            }
            else if (MoveInfo.IsStep(StepEnum.IW44_MiddleToP2))
            {
                MoveInfo.EndMove();
                WorkLog("放料完成");
            }
        }

        public int GetWidth()
        {
            int width = 15;
            if (IOValue(IO_Type.TrayCheck_15).Equals(IO_VALUE.HIGH))
            {
                width = 15;
            }
            else if (IOValue(IO_Type.TrayCheck_13).Equals(IO_VALUE.HIGH))
            {
                width = 13;
            }
            else if (IOValue(IO_Type.TrayCheck_11).Equals(IO_VALUE.HIGH))
            {
                width = 11;
            }
            else if (IOValue(IO_Type.TrayCheck_7).Equals(IO_VALUE.HIGH))
            {
                width = 7;
            }
            else
            {
                width = 7;
            }
            return width;
        }
        #endregion
        
        #region Label处理
        public override bool StartLabelling(WorkParam param)
        {
            return false;
        }

        protected override void LabellingProcess()
        {
        }

        #endregion

    }
}