diff --git a/Rs.SkyLine/Flow/WorkFlow.cs b/Rs.SkyLine/Flow/WorkFlow.cs index 8d991ee..4216a38 100644 --- a/Rs.SkyLine/Flow/WorkFlow.cs +++ b/Rs.SkyLine/Flow/WorkFlow.cs @@ -121,6 +121,9 @@ namespace Rs.MotionPlat.Flow int needGrabNum = 0;//需要拍照的吸嘴数量 int reGrabCount = 0;//重拍次数 ErrorCode errCode = ErrorCode.Ok; + string logInfo = ""; + List testLoadList = new List(); + List testUnLoadList = new List(); public override void Run() { switch (flowStep) @@ -132,14 +135,23 @@ namespace Rs.MotionPlat.Flow { if(LoadAndUnloadTask.Instance.GetTaskNum(ETaskMode.TestLoad)>0) { + logInfo = $"接收到测试工位上料任务"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); flowStep = EWorkFlowStep.测试工位上料; } else if(LoadAndUnloadTask.Instance.GetTaskNum( ETaskMode.TestUnload)>0) { + logInfo = $"接收到测试工位下料任务"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); flowStep = EWorkFlowStep.测试工位下料; } else { + logInfo = $"接收到排料任务"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); flowStep = EWorkFlowStep.到取料位上方; } } @@ -167,22 +179,29 @@ namespace Rs.MotionPlat.Flow curSlotPoint = null; if (curTask.FromType == TurnoverType.Turnover) { + logInfo = $"吸嘴{curTask.FromIndex + 1} 去周转盘 {curTask.FromIndex + 1} 号穴位取料"; curSlotPoint = TrayPointManager.GetSlotPoint(GlobalVar.CurRecipe, "Turnover", curTask.FromIndex + 1, EPointType.RUN); - MessageQueue.Instance.Insert($"吸嘴{curTask.FromIndex + 1} 去周转盘 {curTask.FromIndex + 1} 号穴位取料"); + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); } else if (curTask.FromType == TurnoverType.ToBeTested) { TraySlot slot = GlobalTray.InputTray.GetSlot(ESlotStatus.Have); if (slot != null) { + logInfo = $"吸嘴{curNozzle.NozzleIndex} 去Input盘 {slot.Index} 号穴位取料"; curSlotPoint = TrayPointManager.GetSlotPoint(GlobalVar.CurRecipe, "Input", slot.Index, EPointType.BASE); - MessageQueue.Instance.Insert($"吸嘴{curNozzle.NozzleIndex} 去Input盘 {slot.Index} 号穴位取料"); + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); } else { - // Msg.ShowInfo("Input料盘缺料,请手动切盘后点击确定"); - // GlobalTray.InputTray.ResetTray(); - // GlobalTray.InputTray.Fill(); + // Msg.ShowInfo("Input料盘缺料,请手动切盘后点击确定"); + // GlobalTray.InputTray.ResetTray(); + // GlobalTray.InputTray.Fill(); + logInfo = "检测到Input料盘无料,准备上料盘"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); TakeTrayFlow.Instance.Take(EStockType.Input, EStockType.Empty1, ELoadUnloadType.Unload); restoreFlowStep = EWorkFlowStep.到取料位上方; flowStep = EWorkFlowStep.等待Input料盘搬运完成; @@ -214,7 +233,10 @@ namespace Rs.MotionPlat.Flow } else { - Msg.ShowError("x y move isn't safe"); + logInfo = "x y move isn't safe"; + Msg.ShowError(logInfo); + LogHelper.Error(logInfo); + MessageQueue.Instance.Warn(logInfo); } } @@ -222,16 +244,20 @@ namespace Rs.MotionPlat.Flow case EWorkFlowStep.等待到取料位上方: if (Ops.IsStop("LoadX","LoadY", $"NozzleR{curNozzle.NozzleIndex}")) { + logInfo = "已运动到取料位上方"; Thread.Sleep(100); + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); flowStep = EWorkFlowStep.到取料位下方; - MessageQueue.Instance.Insert("已运动到取料位上方"); } break; case EWorkFlowStep.到取料位下方: if(AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").HomeStatus== EHomeStatus.Finished) { - MessageQueue.Instance.Insert("准备运动到取料位下方"); + logInfo = "准备运动到取料位下方"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); if (curTask.FromType == TurnoverType.Turnover) { errCode = AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").MovePos(GetVacOffsetHeight(FetchNum) + SysConfigParam.GetValue($"TurnoverNozzle{curNozzle.NozzleIndex}TakeHeight"), GlobalVar.WholeSpeed); @@ -247,49 +273,75 @@ namespace Rs.MotionPlat.Flow } else { - Msg.ShowError($"NozzleZ{curNozzle.NozzleIndex} 不在原点,请手动回原后点击确定"); + logInfo = $"NozzleZ{curNozzle.NozzleIndex} 不在原点,请手动回原后点击确定"; + Msg.ShowError(logInfo); + LogHelper.Error(logInfo); + } break; case EWorkFlowStep.等待到取料位下方: if (Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}")) { - Thread.Sleep(GlobalVar.AxisArrivedWaittime); - MessageQueue.Instance.Insert("已运动到取料位下方"); + logInfo = "已运动到取料位下方"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); flowStep = EWorkFlowStep.开真空; } break; case EWorkFlowStep.开真空: Ops.On($"{curNozzle.NozzleIndex}号吸嘴真空吸电磁阀"); - MessageQueue.Instance.Insert($"打开{curNozzle.NozzleIndex}号吸嘴真空吸"); Thread.Sleep(GlobalVar.LoadNozzleOpenVacSuctionDelaytime); + logInfo = $"打开{curNozzle.NozzleIndex}号吸嘴真空吸"; + MessageQueue.Instance.Insert(logInfo); + LogHelper .Debug(logInfo); if (curTask.FromType == TurnoverType.Turnover) { + logInfo = $"关闭周转盘{curTask.FromIndex + 1}号穴位真空吸"; Ops.Off($"周转盘{curTask.FromIndex+1}号穴位真空吸"); Thread.Sleep(GlobalVar.TurnoverTrayCloseVacSuctionDelaytime); + MessageQueue.Instance.Insert(logInfo); + LogHelper .Debug(logInfo); + logInfo = $"打开周转盘{curTask.FromIndex + 1}号穴位真空破"; Ops.On($"周转盘{curTask.FromIndex + 1}号穴位真空破"); Thread.Sleep(GlobalVar.TurnoverTrayOpenVacBreakDelaytime); + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); + logInfo = $"关闭周转盘{curTask.FromIndex + 1}号穴位真空破"; Ops.Off($"周转盘{curTask.FromIndex + 1}号穴位真空破"); Thread.Sleep(GlobalVar.TurnoverTrayCloseVacBreakDelaytime); + MessageQueue.Instance.Insert(logInfo); + LogHelper .Debug(logInfo); } flowStep = EWorkFlowStep.取料完成抬起; break; case EWorkFlowStep.取料完成抬起: + errCode = AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").MovePos(0, GlobalVar.WholeSpeed); if (errCode == ErrorCode.Ok) { + logInfo = "取料完成准备抬起"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug (logInfo); flowStep = EWorkFlowStep.等待取料完成抬起; } break; case EWorkFlowStep.等待取料完成抬起: if (Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}")) { + logInfo = "取料完成已运动到抬起位,准备真空检测"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); flowStep = EWorkFlowStep.取料真空检测; } break; case EWorkFlowStep.取料真空检测: if (Ops.IsOn($"{curNozzle.NozzleIndex}号吸嘴真空吸检测") || GlobalVar.RunSpace) { + FetchNum = 0; + logInfo = $"吸嘴{curNozzle.NozzleIndex}真空检测 OK"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); curNozzle.Status = ENozzleStatus.ToUnload; curNozzle.FromType = curTask.FromType; curNozzle.FromFloor = curTask.FromFloor; @@ -298,8 +350,6 @@ namespace Rs.MotionPlat.Flow curNozzle.ToIndex = curTask.ToIndex; curTask.SuckerNo = curNozzle.NozzleIndex ; curNozzle.TurnoverGUID = curTask.GUID; - - FetchNum = 0; if (curTask.FromType == TurnoverType.Turnover) { curNozzle.SN = curTask.SN; @@ -313,8 +363,12 @@ namespace Rs.MotionPlat.Flow } curNozzle.Update(); curTask.Dealed = true; - if (LoadAndUnloadTask.Instance.GetTaskNum(curTask.taskMode)>0 && NozzleManager.GetNozzlesByStatus(ENozzleStatus.IDLE).Count > 0) + int undoTaskNum = LoadAndUnloadTask.Instance.GetTaskNum(curTask.taskMode); + if (undoTaskNum > 0 && NozzleManager.GetNozzlesByStatus(ENozzleStatus.IDLE).Count > 0) { + logInfo = $"检测到还有{undoTaskNum}条任务未执行,继续执行"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); flowStep = EWorkFlowStep.到取料位上方; } else @@ -411,6 +465,9 @@ namespace Rs.MotionPlat.Flow case EWorkFlowStep.到下相机拍照起始位: if (XYCanMove()) { + logInfo = "到下相机拍照起始位"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); ImageProcess.ClearAutoTrigger(); HikCamera.Instance.SetExposure("locationCamera", GlobalVar.FlyGrabExposureTime); HikCamera.Instance.SetGain("locationCamera", GlobalVar.FlyGrabGain); @@ -432,6 +489,9 @@ namespace Rs.MotionPlat.Flow case EWorkFlowStep.等待到下相机拍照起始位: if (Ops.IsStop("LoadX", "LoadY")) { + logInfo = "已运动到下相机拍照起始位"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); Thread.Sleep(100); HikCamera.Instance.SetTrigger("locationCamera", ETriggerMode.Auto); List grabPoints = new List(); @@ -463,6 +523,9 @@ namespace Rs.MotionPlat.Flow case EWorkFlowStep.到下相机拍照结束位: if (XYCanMove()) { + logInfo = "到下相机拍照结束位"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); IoManager.Instance.WriteOut("下左相机光源触发", 1); Thread.Sleep(50); if (NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload)[0].ToType == TurnoverType.Turnover) @@ -483,6 +546,10 @@ namespace Rs.MotionPlat.Flow if (Ops.IsStop("LoadX")) { + logInfo = "已运动到下相机拍照结束位"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); + AxisControl.LoadX.ClearCompare(1); IoManager.Instance.WriteOut("下左相机光源触发", 0); flowStep = EWorkFlowStep.等待相机拍照完成; @@ -493,6 +560,10 @@ namespace Rs.MotionPlat.Flow imgs = ImageProcess.GetAutoImage(); if (imgs != null && imgs.Length == needGrabNum) { + logInfo = "相机拍照完成,准备处理照片"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); + if (NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload)[0].ToType == TurnoverType.Turnover) { imgs = imgs.Reverse().ToArray(); @@ -524,6 +595,9 @@ namespace Rs.MotionPlat.Flow mrs = VisionProcess.Instance.MatchDownCam(imgs); if (mrs != null && mrs.Count == imgs.Length && mrs.Where(m=>m.IsOK==true).Count()==imgs.Length) { + logInfo = "图片处理完成,准备放料"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); //foreach (Nozzle nozzle in NozzleManager.GetNozzles()) //{ // nozzle.SN = Guid.NewGuid().ToString(); @@ -585,6 +659,7 @@ namespace Rs.MotionPlat.Flow case EWorkFlowStep.到放料位上方: if (XYCanMove()) { + turnoverOffsetPoint.Reset(); tray = null; targetX = 0.0; @@ -596,15 +671,22 @@ namespace Rs.MotionPlat.Flow { if (curNozzle.ToType == TurnoverType.Turnover) { + logInfo = "到周转盘放料位上方"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); curSlotPoint = TrayPointManager.GetSlotPoint(GlobalVar.CurRecipe, "Turnover", curNozzle.ToIndex + 1, EPointType.RUN); turnoverOffsetPoint = TurnoverSlotOffset.GetOffsetPoint(curNozzle.ToIndex + 1); } else if (curNozzle.ToType == TurnoverType.ToBeTested) { + logInfo = "到input盘放料位上方"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); + downSlot = GlobalTray.InputTray.GetSlot(ESlotStatus.NotHave); if (downSlot != null) { - curSlotPoint = TrayPointManager.GetSlotPoint(GlobalVar.CurRecipe, "Input", downSlot.Index, EPointType.RUN); + curSlotPoint = TrayPointManager.GetSlotPoint(GlobalVar.CurRecipe, "Input", downSlot.Index, EPointType.BASE); } else { @@ -619,6 +701,10 @@ namespace Rs.MotionPlat.Flow } else if (curNozzle.ToType == TurnoverType.Passed) { + + logInfo = "到Pass盘放料位上方"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); //OK料仓切盘 downSlot = GlobalTray.OkTary.GetSlot(ESlotStatus.NotHave); if (downSlot != null) @@ -641,6 +727,10 @@ namespace Rs.MotionPlat.Flow } else if (curNozzle.ToType == TurnoverType.Failed) { + + logInfo = "到Ng盘放料位上方"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); downSlot = GlobalTray.NgTray.GetSlot(ESlotStatus.NotHave); if (downSlot != null) { @@ -660,6 +750,9 @@ namespace Rs.MotionPlat.Flow } else if (curNozzle.ToType == TurnoverType.Multifunction) { + logInfo = "到Multi盘放料位上方"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); downSlot = GlobalTray.MultiTray.GetSlot(ESlotStatus.NotHave); if (downSlot != null) { @@ -716,12 +809,17 @@ namespace Rs.MotionPlat.Flow if (Ops.IsStop("LoadX", "LoadY",$"NozzleR{curNozzle.NozzleIndex}")) { Thread.Sleep(100); + logInfo = "已运动到放料位上方"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); flowStep = EWorkFlowStep.到放料位下方; } break; case EWorkFlowStep.到放料位下方: - + logInfo = "到放料位下方"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); if (curNozzle.ToType == TurnoverType.Turnover) { errCode = AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").MovePos(SysConfigParam.GetValue($"TurnoverNozzle{curNozzle.NozzleIndex}TakeHeight"), GlobalVar.WholeSpeed); @@ -739,6 +837,9 @@ namespace Rs.MotionPlat.Flow case EWorkFlowStep.等待到放料位下方: if (Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}")) { + logInfo = "已运动到放料位下方"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); if (curNozzle.ToType== TurnoverType.Turnover) { Ops.On($"周转盘{curNozzle.ToIndex + 1}号穴位真空吸"); @@ -800,12 +901,18 @@ namespace Rs.MotionPlat.Flow errCode = AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").MovePos(0, GlobalVar.WholeSpeed); if (errCode == ErrorCode.Ok) { + logInfo = "放料完成抬起"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); flowStep = EWorkFlowStep.等待放料完成抬起; } break; case EWorkFlowStep.等待放料完成抬起: if (Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}")) { + logInfo = "放料完成已运动到抬起位,准备真空检测"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); flowStep = EWorkFlowStep.放料真空检测; } break; @@ -814,10 +921,17 @@ namespace Rs.MotionPlat.Flow { if (Ops.IsOn($"周转盘{curNozzle.ToIndex + 1}号穴位真空吸检测") || GlobalVar.RunSpace) { + logInfo = $"周转盘{curNozzle.ToIndex + 1}号穴位真空吸检测 OK"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); + flowStep = EWorkFlowStep.放料任务完成; } else { + logInfo = $"放料时周转盘{curNozzle.ToIndex + 1}号穴位真空吸异常"; + MessageQueue.Instance.Warn(logInfo); + LogHelper.Debug(logInfo); DialogResult dr = Msg.ShowError($"周转盘{curNozzle.ToIndex + 1}号穴位真空吸异常,点击确定后跳过"); if (dr == DialogResult.OK) { @@ -831,6 +945,9 @@ namespace Rs.MotionPlat.Flow } break; case EWorkFlowStep.放料任务完成: + logInfo = "放料任务完成"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").Home(); //Ops.HomeAndGoStartPos($"NozzleR{NozzleIndex}"); if (curNozzle.ToType == TurnoverType.Turnover) @@ -874,6 +991,9 @@ namespace Rs.MotionPlat.Flow break; case EWorkFlowStep.任务结束到安全位: + logInfo = "任务结束到安全位"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); errCode = AxisControl.LoadX.MovePos(SysConfigParam.GetValue("LoadXStartPos"), GlobalVar.WholeSpeed); if(errCode== ErrorCode.Ok) { @@ -887,16 +1007,27 @@ namespace Rs.MotionPlat.Flow case EWorkFlowStep.等待任务结束到安全位: if(Ops.IsStop("LoadX","LoadY")) { + logInfo = "任务结束已回到安全位"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); if (TestCenter.Instance.LoadResult()) { + logInfo = "通知中控任务完成"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); + LoadAndUnloadTask.Instance.Clear(); + logInfo = "任务完成,清除任务"; + MessageQueue.Instance.Insert(logInfo); + LogHelper.Debug(logInfo); } MachineManage.Instance.RunState = ERunState.Waiting; flowStep = EWorkFlowStep.等待任务; } break; case EWorkFlowStep.测试工位上料: - TurnoverFlow.Instance.PressLoad(LoadAndUnloadTask.Instance.GetTestLoadTasks()); + testLoadList = LoadAndUnloadTask.Instance.GetTestLoadTasks(); + TurnoverFlow.Instance.PressLoad(testLoadList); flowStep = EWorkFlowStep.等待测试工位上料完成; break; case EWorkFlowStep.等待测试工位上料完成: @@ -906,35 +1037,45 @@ namespace Rs.MotionPlat.Flow LoadAndUnloadTask.Instance.Clear(); MachineManage.Instance.RunState = ERunState.Waiting; //切换穴位状态 - for (int i = 1; i < 9; i++) + foreach (TurnoverInfo turnoverInfo in testLoadList) { - GlobalTray.TurnoverTray.ChangeStatus(i, ESlotStatus.NotHave); - } - for (int i = 17; i < 25; i++) - { - GlobalTray.TurnoverTray.ChangeStatus(i, ESlotStatus.NotHave); + GlobalTray.TurnoverTray.ChangeStatus(turnoverInfo.FromIndex, ESlotStatus.NotHave); } + //for (int i = 1; i < 9; i++) + //{ + // GlobalTray.TurnoverTray.ChangeStatus(i, ESlotStatus.NotHave); + //} + //for (int i = 17; i < 25; i++) + //{ + // GlobalTray.TurnoverTray.ChangeStatus(i, ESlotStatus.NotHave); + //} flowStep = EWorkFlowStep.等待任务; } break; case EWorkFlowStep.测试工位下料: - TurnoverFlow.Instance.PressUnload(LoadAndUnloadTask.Instance.GetTestUnLoadTasks()); + testUnLoadList = LoadAndUnloadTask.Instance.GetTestUnLoadTasks(); + TurnoverFlow.Instance.PressUnload(testUnLoadList); flowStep = EWorkFlowStep.等待测试工位下料完成; break; case EWorkFlowStep.等待测试工位下料完成: if (TurnoverFlow.Instance.UnloadFinished()) { + //logInfo = string.Join(",",testUnLoadList.Select(t=>t.ToIndex).ToList()); TestCenter.Instance.LoadTestUnLoadResult(); LoadAndUnloadTask.Instance.Clear(); //切换穴位状态 - for (int i = 9; i < 17; i++) + foreach (TurnoverInfo turnoverInfo in testUnLoadList) { - GlobalTray.TurnoverTray.ChangeStatus(i, ESlotStatus.Have); - } - for (int i = 25; i < 33; i++) - { - GlobalTray.TurnoverTray.ChangeStatus(i, ESlotStatus.Have); + GlobalTray.TurnoverTray.ChangeStatus(turnoverInfo.ToIndex, ESlotStatus.Have); } + //for (int i = 9; i < 17; i++) + //{ + // GlobalTray.TurnoverTray.ChangeStatus(i, ESlotStatus.Have); + //} + //for (int i = 25; i < 33; i++) + //{ + // GlobalTray.TurnoverTray.ChangeStatus(i, ESlotStatus.Have); + //} MachineManage.Instance.RunState = ERunState.Waiting; flowStep = EWorkFlowStep.等待任务; }