DischargeLine_Partial.cs 14.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;

namespace OnlineStore.DeviceLibrary
{
    partial class DischargeLine
    {
        protected override bool CheckWaitResult(LineMoveInfo moveInfo, WaitResultInfo wait)
        {
            if (wait.WaitType.Equals(WaitEnum.W301_DLineScanCode))
            {
                if (LastCodeList.Count > 0)
                {
                    return true;
                }
            }
            return false;
        }
        #region 是否可移栽料盘


        internal bool CanStartOut(int lineNum)
        {
            if (NoAlarm() || runStatus>LineRunStatus.HomeMoving)
            {
                if (lineNum.Equals(1) && TrayLine1.MoveInfo.MoveType.Equals(LineMoveType.None))
                {
                    return true;
                }
                if (lineNum.Equals(2) && TrayLine2.MoveInfo.MoveType.Equals(LineMoveType.None))
                {
                    return true;
                }
            }
           
            return false;
        }

        #endregion

        #region 料盘移栽处理
        public override bool StartOutStoreMove(InOutParam param)
        { 
            if (runStatus.Equals(LineRunStatus.Runing))
            {
                runStatus = LineRunStatus.Busy;
                MoveInfo.MoveParam = param;
                MoveInfo.NewMove(LineMoveType.OutStore);
                LogInfo(hengyiName+ "出口有料,NG气缸后退,等待1000后扫码");
                MoveInfo.NextMoveStep(LineMoveStep.DO_01_WaitTime);
                MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                ScanNgBack(MoveInfo);
                LastCodeList = new List<string>();
                LastWidth = 0;
                scanCodeCount = 0;
                return true;
            }
            else
            {
                LogUtil.error(Name + " 启动出料失败,当前 storeStatus=" + runStatus);
                return false;
            }
        }
        private List<string> LastCodeList = new List<string>();
        private int LastWidth = 0;
        private int  scanCodeCount=0;
        private void ScanCode()
        {
            MoveInfo.NextMoveStep(LineMoveStep.DO_02_ScanCode); 
            List<string> cameraList = Config.GetCameraList();
            if (cameraList.Count > 0)
            {
                scanCodeCount++;
                LogInfo(hengyiName + "出口有料,开始第【"+scanCodeCount+"】次扫码,皮带线停止转动");
                MoveInfo.OneWaitCanEndStep = true;
                MoveInfo.WaitList.Add(WaitResultInfo.WaitDLineScanCode());
                MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(6000));
                try
                {
                    Task<List<string>> scanTask = Task.Factory.StartNew(delegate
                    {

                        LastCodeList = CodeManager.CameraScan(Config.GetCameraList());
                        if (LastCodeList.Count <= 0)
                        {
                            LastCodeList = CodeManager.CameraScan(Config.GetCameraList());
                        }
                        return LastCodeList;
                    });
                }
                catch (Exception ex)
                {
                    LogUtil.error("FI_13_ScanCode扫码出错:",ex);
                }
            }
            else
            {
                LogInfo(hengyiName + "出口有料,未取到相机名称,不扫码,等待1000后继续");
                MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(6000));
            }
        }
        protected override void OutStoreProcess()
        {
            if (MoveInfo.IsInWait)
            {
                CheckWait(MoveInfo);
            }
            if (SecondMoveInfo.IsInWait)
            {
                CheckWait(SecondMoveInfo);
            }
            if (MoveInfo.IsInWait)
            {
                return;
            }
            if (MoveInfo.MoveStep.Equals(LineMoveStep.DO_01_WaitTime))
            {
                ScanCode();
            }
            else if (MoveInfo.MoveStep.Equals(LineMoveStep.DO_02_ScanCode))
            {
                MoveInfo.NextMoveStep(LineMoveStep.DO_03_GetTraySize);
                MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(3000));
                string lastCode = "";
                foreach (string code in LastCodeList)
                {
                    lastCode += code;
                }
                //如果未扫到条码,重新扫码3次
                if (scanCodeCount < 3 && lastCode.Equals("") && Config.GetCameraList().Count > 0)
                {
                    ScanCode();
                }
                else
                {
                    LastWidth = 0;
                    int robotIndex = 1;
                    if (DeviceID.Equals(301))
                    {
                        robotIndex = 2;
                    }
                    string result = SServerManager.GetTraySize(Name, robotIndex, LastCodeList, out LastWidth);
                    LogInfo(hengyiName + "出口有料,二维码[" + lastCode + "] 获取料盘尺寸【" + LastWidth + "】【" + result + "】");
                }
                //  MoveInfo.EndMove();
            }
            else if (MoveInfo.MoveStep.Equals(LineMoveStep.DO_03_GetTraySize))
            {
                MoveInfo.NextMoveStep(LineMoveStep.DO_04_SUpDownMove);
                if (LastWidth.Equals(7))
                {
                    LogInfo(hengyiName + "出口有料,料盘尺寸【" + LastWidth + "】上升分盘定位气缸");
                    CylinderMove(MoveInfo, IO_Type.SeparateDevice_Down, IO_Type.SeparateDevice_Up);                     
                }
                else if (LastWidth > 0)
                {
                    LogInfo(hengyiName + "出口有料,料盘尺寸【" + LastWidth + "】下降分盘定位气缸");
                    CylinderMove(MoveInfo, IO_Type.SeparateDevice_Up, IO_Type.SeparateDevice_Down);
                }
                else
                {
                    //NG料
                    if (TrayProcessCanStartLine())
                    {
                        MoveInfo.NextMoveStep(LineMoveStep.DO_11_NGToNextStation);
                        if (DeviceID.Equals(301))
                        { 
                            LogInfo(hengyiName + "扫码NG料, 先转动NG料到扫码后一个工位,需要停止接驳台皮带线");
                            SeparateStopRun(MoveInfo);
                          
                        }
                        else
                        { 
                            LogInfo(hengyiName + "扫码NG料, 先转动NG料到扫码后一个工位");
                        }
                        Line3Turn.StartLineRun(IO_Type.DLine_Run3, IO_Type.Location_Check3, Line3EndProcess);
                        MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(3000));
                        MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Location_Check3, IO_VALUE.HIGH));
                    }                  
                }
            }
            else if (MoveInfo.MoveStep.Equals(LineMoveStep.DO_04_SUpDownMove))
            {
                if (TrayProcessCanStartLine())
                {
                    MoveInfo.NextMoveStep(LineMoveStep.DO_05_LineRun1);
                    LogInfo(hengyiName + "出口有料,转动皮带线到扫码后一个工位,同时转动分盘装置");
                    IOMove(IO_Type.SeparateDevice_Run, IO_VALUE.HIGH);
                    Line3Turn.StartLineRun(IO_Type.DLine_Run3, IO_Type.Location_Check3, Line3EndProcess);

                    MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(3000));
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Location_Check3, IO_VALUE.HIGH));
                }
            }
            else if (MoveInfo.MoveStep.Equals(LineMoveStep.DO_05_LineRun1))
            {
                if (DeviceID.Equals(301))
                {
                    //如果是301可以直接结束
                    WaitSeparateCheck(); 
                }
                else
                {
                    //302需要再转一个工位
                    if (TrayProcessCanStartLine())
                    {
                        MoveInfo.NextMoveStep(LineMoveStep.DO_06_LineRun2);
                        LogInfo(hengyiName + "出口有料,转动皮带线到扫码后二个工位,同时转动分盘装置");
                        IOMove(IO_Type.SeparateDevice_Run, IO_VALUE.HIGH);
                        Line3Turn.StartLineRun(IO_Type.DLine_Run3, IO_Type.Location_Check3, Line3EndProcess);

                        MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(3000));
                        MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Location_Check3, IO_VALUE.HIGH));
                    }
                }
            }
            else if (MoveInfo.MoveStep.Equals(LineMoveStep.DO_06_LineRun2))
            {
                WaitSeparateCheck();
            }
            else if (MoveInfo.MoveStep.Equals(LineMoveStep.DO_07_SeparateCheck))
            {
                MoveInfo.NextMoveStep(LineMoveStep.DO_08_CRun);
                if (IOValue(IO_Type.SeparateDevice_Check).Equals(IO_VALUE.HIGH))
                {
                    int robotIndex = 1;
                    if (DeviceID.Equals(301))
                    {
                        robotIndex = 2;
                    }
                    LogInfo(hengyiName + "出口有料,转动接驳台皮带线2000 , 收到SeparateDevice_Check信号,调用arriveRobotLocation=" + robotIndex);

                    SServerManager.arriveRobotLocation(Name, robotIndex);
                }
                else
                {
                    LogInfo(hengyiName + "出口有料,转动接驳台皮带线2000 ,未收到SeparateDevice_Check信号");
                }
                IOMove(IO_Type.SeparateDevice_Run, IO_VALUE.HIGH);
                MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(2000));
            } 
            else if (MoveInfo.MoveStep.Equals(LineMoveStep.DO_08_CRun))
            {
                MoveEndS();
                //    IOMove(IO_Type.SeparateDevice_Run, IO_VALUE.LOW);
                LogInfo(hengyiName + "出口有料,送料结束 ");
            }
            #region NG料处理

            else if (MoveInfo.MoveStep.Equals(LineMoveStep.DO_11_NGToNextStation))
            {
                //如果是301,接驳台皮带倒转
                if (DeviceID.Equals(301))
                {
                    MoveInfo.NextMoveStep(LineMoveStep.DO_15_SeparateBackRun);
                    LogInfo(hengyiName + "扫码NG料,接驳台开始倒转");
                    SeparateBackRun(MoveInfo); 
                }
                //如果是302,NG气缸前进
                else
                {
                    MoveInfo.NextMoveStep(LineMoveStep.DO_12_NGCylinderForward);
                    LogInfo(hengyiName + "扫码NG料,NG气缸前进");
                    ScanNgForward(MoveInfo);
                    MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(3000));
                }
            }
            else if (MoveInfo.MoveStep.Equals(LineMoveStep.DO_12_NGCylinderForward))
            {
                MoveInfo.NextMoveStep(LineMoveStep.DO_13_NGCylinderWait);
                LogInfo(hengyiName + "扫码NG料,NG气缸等待1500后后退");
                MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1500));
            }
            else if (MoveInfo.MoveStep.Equals(LineMoveStep.DO_13_NGCylinderWait))
            {
                MoveInfo.NextMoveStep(LineMoveStep.DO_14_NGCylinderBack);
                LogInfo(hengyiName + "扫码NG料,NG气缸后退"); 
                ScanNgBack(MoveInfo);
            }
            else if (MoveInfo.MoveStep.Equals(LineMoveStep.DO_14_NGCylinderBack))
            {
                MoveEndS();
                LogInfo(hengyiName + "扫码NG料结束,NG气缸已后退 ");
            }         
            else if (MoveInfo.MoveStep.Equals(LineMoveStep.DO_15_SeparateBackRun))
            {
                MoveInfo.NextMoveStep(LineMoveStep.DO_16_SeparateBackRunWait);
                LogInfo(hengyiName + "扫码NG料,接驳台反转等待3000"); 
                MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(3000));
            }
            else if (MoveInfo.MoveStep.Equals(LineMoveStep.DO_16_SeparateBackRunWait))
            {
                MoveInfo.NextMoveStep(LineMoveStep.DO_17_SeparateStopRun);
                LogInfo(hengyiName + "扫码NG料,接驳台停止反转");
                SeparateStopRun(MoveInfo);
                MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(2000));
            }
            else if (MoveInfo.MoveStep.Equals(LineMoveStep.DO_17_SeparateStopRun))
            {
                MoveInfo.NextMoveStep(LineMoveStep.DO_18_SeparateRun);
                LogInfo(hengyiName + "扫码NG料,接驳台恢复正转");
                SeparateLineRun(MoveInfo);
            }
            else if (MoveInfo.MoveStep.Equals(LineMoveStep.DO_18_SeparateRun))
            {
                MoveEndS();
                LogInfo(hengyiName + "扫码NG料结束,皮带线已正转 ");
            }
            #endregion
        }
        private void WaitSeparateCheck()
        { 
            MoveInfo.NextMoveStep(LineMoveStep.DO_07_SeparateCheck);
            //  Line3LastTrayP++;
            LogInfo(hengyiName + "出口有料,等待料盘到达分盘装置位置,最多等待60000");
            MoveInfo.OneWaitCanEndStep = true;
            MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(60000));
            MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.SeparateDevice_Check, IO_VALUE.HIGH));

        }
        private bool TrayProcessCanStartLine()
        {
            if (TrayLine2.Line3CanRun && TrayLine1.Line3CanRun
                  && Line3TurnIsStop()
                  && Line3Turn.CanStart()
                  &&ScanNgIsBack())
            {
                return true;
            }
            return false;
        }
        #endregion 
    }
}