GoLineForRecyJob.cs 19.4 KB
using Common;
using DeviceLibrary.bean;
using DeviceLibrary.manager;
using System;

namespace DeviceLibrary
{
    /// <summary>
    /// 去产线回收治具
    /// </summary>
    public class GoLineForRecyJob : Job
    {
        /// <summary>
        /// 去空料架任务点
        /// </summary>
        public GoLineForRecyJob(JobParam jobParam) : base(jobParam)
        {
            JobName = "治具回收任务";
        }
        int WaitTimeOut = AppConfigHelper.GetIntValue(SettingString.WaitTimeout);
        /// <summary>
        /// 料架回收任务
        /// </summary>
        /// <param name="agv"></param>
        public override Job Run(Agv_Info agv)
        {
            Node node = NodeManager.GetNodeByName(JobParam.TargetNode.Name);
            if (JobRunStep.IsStep(RunStep.NONE))
            {
                JobRunStep.ToNextStep(RunStep.ADJUST_WIDTH);
                runInfo = "准备去" + JobParam.TargetNode + ",先调宽";
                JobRunStep.Msg = runInfo;
                SetPlc(agv, 52, 0);
                AdjustWidth(agv, JobParam.FixMissionInfo.Type);
            }
            else if (JobRunStep.IsStep(RunStep.ADJUST_WIDTH))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    if (JobParam.SrcNode.Area.Equals(Area.Air_C) && !JobParam.TargetNode.Area.Equals(Area.Air_C))//4C风淋门内->风淋门外
                    {
                        JobRunStep.ToNextStep(RunStep.WAIT_OUT_AIR_DOOR);
                        runInfo = "去" + JobParam.TargetNode + ",先过风淋门";
                        JobRunStep.Msg = runInfo;
                        AllocateTask(agv, SettingString.DoorAirOut);
                    }
                    else if (!JobParam.SrcNode.Area.Equals(Area.Air_C) && JobParam.TargetNode.Area.Equals(Area.Air_C))//4C风淋门外->风淋门内
                    {
                        if (JobParam.SrcNode.Area.Equals(Area.C) && !JobParam.TargetNode.Area.Equals(Area.C))//4C->4C
                        {
                            if (AGVManager.CheckRoomCTarget(agv, JobParam.TargetNode.Name))//被占用
                            {
                                JobRunStep.ToNextStep(RunStep.RECY_TO_WAIT_REACH_TEMP_PLACE);
                                runInfo = "目的地" + JobParam.TargetNode + "有小车占用,先到临时待机位";
                                JobRunStep.Msg = runInfo;
                                AGVManager.MoveToRoomCStandy(agv);
                            }
                            else
                            {
                                JobRunStep.ToNextStep(RunStep.WAIT_IN_AIR_DOOR);
                                runInfo = "去" + JobParam.TargetNode + ",先过风淋门";
                                JobRunStep.Msg = runInfo;
                                AllocateTask(agv, SettingString.DoorAirIn);
                            }
                        }
                        else if ((JobParam.SrcNode.Area.Equals(Area.D)) && (JobParam.TargetNode.Area.Equals(Area.C)))//4D->4C
                        {
                            JobRunStep.ToNextStep(RunStep.WAIT_IN_ROOM_C);
                            runInfo = "去" + JobParam.TargetNode + ",先过门";
                            JobRunStep.Msg = runInfo;
                            AllocateTask(agv, SettingString.DoorDToC);
                        }
                    }
                    else//起始与目的地在风淋门同一侧
                    {
                        if (JobParam.SrcNode.Area.Equals(Area.Air_C) && JobParam.TargetNode.Equals(Area.Air_C))//都在风淋门内
                        {
                            if (AGVManager.CheckRoomCTarget(agv, JobParam.TargetNode.Name))//被占用
                            {
                                JobRunStep.ToNextStep(RunStep.WAIT_OUT_AIR_DOOR);
                                runInfo = "目的地" + JobParam.TargetNode + "有小车占用,先过风淋门,再到临时待机位";
                                JobRunStep.Msg = runInfo;
                                AllocateTask(agv, SettingString.DoorAirOut);
                            }
                            else
                            {
                                JobRunStep.ToNextStep(RunStep.RECY_TO_ASSIGN_AGV_TASK);
                                runInfo = "开始回收任务";
                                JobRunStep.Msg = runInfo;
                            }
                        }
                        else if (!JobParam.SrcNode.Area.Equals(Area.Air_C) && !JobParam.TargetNode.Area.Equals(Area.Air_C))//都在风淋门外
                        {
                            if (JobParam.SrcNode.Area.Equals(Area.C) && JobParam.TargetNode.Area.Equals(Area.C))//4C->4C
                            {
                                if (AGVManager.CheckRoomCTarget(agv, JobParam.TargetNode.Name))//被占用
                                {
                                    JobRunStep.ToNextStep(RunStep.RECY_TO_WAIT_REACH_TEMP_PLACE);
                                    runInfo = "目的地" + JobParam.TargetNode + "有小车占用,先到临时待机位";
                                    JobRunStep.Msg = runInfo;
                                    AGVManager.MoveToRoomCStandy(agv);
                                }
                                else
                                {
                                    JobRunStep.ToNextStep(RunStep.RECY_TO_ASSIGN_AGV_TASK);
                                    runInfo = "开始回收任务";
                                    JobRunStep.Msg = runInfo;
                                }
                            }
                            else if (JobParam.SrcNode.Area.Equals(Area.C) && JobParam.TargetNode.Area.Equals(Area.D))//4C->4D
                            {
                                JobRunStep.ToNextStep(RunStep.WAIT_IN_ROOM_D);
                                runInfo = "去" + JobParam.TargetNode + ",先过门";
                                JobRunStep.Msg = runInfo;
                                AllocateTask(agv, SettingString.DoorCToD);
                            }
                            else if (JobParam.SrcNode.Area.Equals(Area.D) && JobParam.TargetNode.Area.Equals(Area.C))//4D->4C
                            {
                                JobRunStep.ToNextStep(RunStep.WAIT_IN_ROOM_C);
                                runInfo = "去产线" + JobParam.TargetNode + ",先过门";
                                JobRunStep.Msg = runInfo;
                                AllocateTask(agv, SettingString.DoorDToC);
                            }

                            else//4D->4D
                            {
                                JobRunStep.ToNextStep(RunStep.RECY_TO_ASSIGN_AGV_TASK);
                                runInfo = "开始回收任务";
                                JobRunStep.Msg = runInfo;
                            }
                        }

                    }
                }
            }
            else if (JobRunStep.IsStep(RunStep.WAIT_OUT_AIR_DOOR))
            {
                if (agv.TaskRunState.CheckTaskFinished())
                {
                    //4C风淋门内->风淋门外,到达风淋门外
                    if (JobParam.SrcNode.Area.Equals(Area.C) && JobParam.TargetNode.Area.Equals(Area.C))//4C->4C
                    {
                        if (AGVManager.CheckRoomCTarget(agv, JobParam.TargetNode.Name))//被占用
                        {
                            JobRunStep.ToNextStep(RunStep.RECY_TO_WAIT_REACH_TEMP_PLACE);
                            runInfo = "到风淋门外,目的地" + JobParam.TargetNode + "有小车占用,先到临时待机位";
                            JobRunStep.Msg = runInfo;
                            AGVManager.MoveToRoomCStandy(agv);
                        }
                        else
                        {
                            JobRunStep.ToNextStep(RunStep.RECY_TO_ASSIGN_AGV_TASK);
                            runInfo = "到风淋门外,开始回收任务";
                            JobRunStep.Msg = runInfo;
                        }
                    }
                    else if (JobParam.SrcNode.Area.Equals(Area.C) && JobParam.TargetNode.Area.Equals(Area.D))//4C->4D
                    {
                        JobRunStep.ToNextStep(RunStep.WAIT_IN_ROOM_D);
                        runInfo = "到风淋门外,去" + JobParam.TargetNode + ",先过门";
                        JobRunStep.Msg = runInfo;
                        AllocateTask(agv, SettingString.DoorCToD);
                    }
                    //都在风淋门内,到达风淋门外
                    else
                    {
                        JobRunStep.ToNextStep(RunStep.RECY_TO_WAIT_REACH_TEMP_PLACE);
                        runInfo = "到风淋门外,目的地" + JobParam.TargetNode + "有小车占用,先到临时待机位";
                        JobRunStep.Msg = runInfo;
                        AGVManager.MoveToRoomCStandy(agv);
                    }
                }
            }
            else if (JobRunStep.IsStep(RunStep.WAIT_IN_AIR_DOOR))
            {
                if (agv.TaskRunState.CheckTaskFinished())
                {
                    //4C风淋门外->风淋门内
                    JobRunStep.ToNextStep(RunStep.RECY_TO_ASSIGN_AGV_TASK);
                    runInfo = "到达风淋门内,开始回收任务";
                    JobRunStep.Msg = runInfo;
                }
            }
            else if (JobRunStep.IsStep(RunStep.WAIT_IN_ROOM_C))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    if (AGVManager.CheckRoomCTarget(agv, JobParam.TargetNode.Name))//被占用
                    {
                        JobRunStep.ToNextStep(RunStep.RECY_TO_WAIT_REACH_TEMP_PLACE);
                        runInfo = "目的地" + JobParam.TargetNode + "有小车占用,先到临时待机位";
                        JobRunStep.Msg = runInfo;
                        AGVManager.MoveToRoomCStandy(agv);
                    }
                    else
                    {
                        if (JobParam.TargetNode.Area.Equals(Area.Air_C))
                        {
                            JobRunStep.ToNextStep(RunStep.WAIT_IN_AIR_DOOR);
                            runInfo = "去" + JobParam.TargetNode + ",先过风淋门";
                            JobRunStep.Msg = runInfo;
                            AllocateTask(agv, SettingString.DoorAirIn);
                        }
                        else
                        {
                            JobRunStep.ToNextStep(RunStep.RECY_TO_ASSIGN_AGV_TASK);
                            runInfo = "开始回收任务";
                            JobRunStep.Msg = runInfo;
                        }
                    }
                }
            }
            else if (JobRunStep.IsStep(RunStep.RECY_TO_WAIT_REACH_TEMP_PLACE))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    if (!AGVManager.CheckRoomCTarget(agv, JobParam.TargetNode.Name))//未占用
                    {
                        JobRunStep.ToNextStep(RunStep.RECY_TO_ASSIGN_AGV_TASK);
                        runInfo = "开始回收任务";
                        JobRunStep.Msg = runInfo;
                        //AGVManager.DeleteStandyInfo(agv);
                    }
                }
            }
            else if (JobRunStep.IsStep(RunStep.WAIT_IN_ROOM_D))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.RECY_TO_ASSIGN_AGV_TASK);
                    runInfo = "开始回收任务";
                    JobRunStep.Msg = runInfo;
                }
            }
            else if (JobRunStep.IsStep(RunStep.RECY_TO_ASSIGN_AGV_TASK))
            {

                if (node != null)
                {
                    JobRunStep.ToNextStep(RunStep.RECY_TO_BACK_WAIT_AGV_START_TASK);
                    runInfo = "移动到" + JobParam.TargetNode;
                    JobRunStep.Msg = runInfo;
                    AllocateTask(agv, JobParam.TargetNode.Name);
                }
                else
                {
                    runInfo = JobParam.TargetNode + " 不存在或未开启调用";
                    JobRunStep.Msg = runInfo;
                }
            }
            else if (JobRunStep.IsStep(RunStep.RECY_TO_BACK_WAIT_AGV_START_TASK))
            {
                if (agv.TaskRunState.CheckAllocateOk())
                {
                    JobRunStep.ToNextStep(RunStep.RECY_TO_WAIT_REACH_PLACE);
                    WarehouseSigManager.TargetWithFix.CurPlace = JobParam.TargetNode.Name;
                }
            }
            else if (JobRunStep.IsStep(RunStep.RECY_TO_WAIT_REACH_PLACE))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    //设置音效类型
                    SetPlcWithToInstore(agv);
                    AllocateTask(agv, SettingString.PlaySound);
                    if (JobParam.OpType.Equals(OpType.ComToLine))
                    {
                        JobRunStep.ToNextStep(RunStep.RECY_TO_WAIT_LINE_RESPONSE);
                        runInfo = "到达 " + JobParam.TargetNode + " 向线体发送出料架请求";
                        JobRunStep.Msg = runInfo;
                        if (node == null)
                        {
                            runInfo = JobParam.TargetNode + " 未开启调用";
                            JobRunStep.Msg = runInfo;
                            return this;
                        }
                        OpManager.ServerToClient.ReadyLeave(JobParam.TargetNode.Name, JobParam.Shelf == null ? "" : JobParam.Shelf.RFID);
                    }
                    else
                    {
                        JobRunStep.ToNextStep(RunStep.RECY_TO_WAIT_Manual_Operation);
                        runInfo = "到达" + JobParam.TargetNode + ",并等待人员操作";
                        JobRunStep.Msg = runInfo;
                    }

                }
            }
            else if (JobRunStep.IsStep(RunStep.RECY_TO_WAIT_Manual_Operation))
            {
                if (JobParam.OpType.Equals(OpType.Mannual))
                {
                    if (agv.GetInput(2, 0))
                    {
                        runInfo = "人员在" + JobParam.TargetNode + "操作完成";
                        JobRunStep.Msg = runInfo;
                        JobRunStep.EndJob();
                        return new FixToInStoreJob(new JobParam(JobParam.TargetNode, null, JobParam.Shelf==null?null:JobParam.Shelf.ToCopy(),JobParam.FixMissionInfo));
                    }
                }
                else if (JobParam.OpType.Equals(OpType.RequestAPI))
                {
                    if (OpManager.Info.GetTransfer(out string target))
                    {
                        if (target.Equals(SettingString.Cancel))
                        {
                            JobRunStep.ToNextStep(RunStep.END);
                            runInfo = "到达" + JobParam.TargetNode + ",该任务被取消";
                            JobRunStep.Msg = runInfo;
                            //关闭音效
                            CloseSound(agv);
                            AllocateTask(agv, SettingString.StopSound);
                            System.Threading.Thread.Sleep(5000);
                        }
                        else if(agv.IsExistShelf)
                        {
                            runInfo = "人员在" + JobParam.TargetNode + "操作完成";
                            JobRunStep.Msg = runInfo;
                            JobRunStep.EndJob();
                            //关闭音效
                            CloseSound(agv);
                            AllocateTask(agv, SettingString.StopSound);
                            System.Threading.Thread.Sleep(5000);
                            return new FixToInStoreJob(new JobParam(JobParam.TargetNode, NodeManager.GetNodeByName(target), JobParam.Shelf==null?null:JobParam.Shelf.ToCopy(), JobParam.FixMissionInfo));
                        }

                    }
                    else if(JobRunStep.IsTimeOut(WaitTimeOut*60,out TimeSpan timeSpan) && !agv.IsExistShelf)
                    {
                        JobRunStep.ToNextStep(RunStep.END);
                        runInfo = "到达" + JobParam.TargetNode + $",该任务超时{WaitTimeOut}分钟,自动取消";
                        JobRunStep.Msg = runInfo;
                        //关闭音效
                        CloseSound(agv);
                        AllocateTask(agv, SettingString.StopSound);
                        System.Threading.Thread.Sleep(5000);
                    }
                }
                else if (JobParam.OpType.Equals(OpType.MaulAndAPI))
                {
                    if (agv.GetInput(2,0) || OpManager.Info.GetUnlock(JobParam.Shelf.RFID))
                    {
                        runInfo = "人员在" + JobParam.TargetNode + "操作完成";
                        JobRunStep.Msg = runInfo;
                        JobRunStep.EndJob();
                        return new FixToInStoreJob(new JobParam(JobParam.TargetNode, null, JobParam.Shelf==null?null:JobParam.Shelf.ToCopy(), JobParam.FixMissionInfo));
                    }
                }
            }
            else if (JobRunStep.IsStep(RunStep.RECY_TO_WAIT_LINE_RESPONSE))
            {
                if (node == null)
                {
                    runInfo = JobParam.TargetNode + " 未开启调用";
                    JobRunStep.Msg = runInfo;
                    return this;
                }
                if (node.StateEquals(NodeStatus.MayLeave))
                {
                    agv.HasError = false;
                    JobRunStep.ToNextStep(RunStep.RECY_TO_WAIT_TAKE_EMPTY_SHELF);
                    runInfo = "收到线体对出料请求的响应," + JobParam.TargetNode + "出料架";
                    JobRunStep.Msg = runInfo;
                    AllocateTask(agv, SettingString.Enter);

                }
                else if (JobRunStep.IsTimeOut(15, out TimeSpan timeOutValue))
                {
                    agv.HasError = true;
                    agv.SetErrorMsg($"线体{JobParam.TargetNode}对出料请求无响应", timeOutValue.TotalMinutes.ToString("f2"));
                }
            }
            else if (JobRunStep.IsStep(RunStep.RECY_TO_WAIT_TAKE_EMPTY_SHELF))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    agv.HasError = false;
                    JobRunStep.EndJob();
                    return new FixToInStoreJob(new JobParam(JobParam.TargetNode.ToCopy()));

                }
                else if (JobRunStep.IsTimeOut(120, out TimeSpan timeOutValue))
                {
                    //链条停止
                    runInfo = "空料架在[" + JobParam.TargetNode + "]进入小车超时";
                    agv.HasError = true;
                    agv.SetErrorMsg("空料架在[" + JobParam.TargetNode + "]进入小车超时", timeOutValue.TotalMinutes.ToString("f2"));
                }
            }
            else if (JobRunStep.IsStep(RunStep.END))
            {
                JobRunStep.EndJob();
                return null;
            }
            return this;
        }
    }

}