| 
					
				 | 
			
			
				@@ -20,8 +20,8 @@ namespace WCS.Service.Works.RGV 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             rgv.EX(rgv => 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 //RGV是自动且空闲的 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (rgv.Data2.WorkMode != WCS.Entity.Protocol.RGV.RGVMode.自动) return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (rgv.Data2.SystemStatus != WCS.Entity.Protocol.RGV.RGVRunStatus.空闲) return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (rgv.Data2.WorkMode != RGVMode.自动) return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (rgv.Data2.SystemStatus != RGVRunStatus.空闲) return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 var obj = Device.Find(ConvGroup_1030).Create<StationDeviceGroup>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -86,7 +86,89 @@ namespace WCS.Service.Works.RGV 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 var rgv = obj.CurrentRGV(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 if (rgv != null) //有车 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    //是否有取货任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    //RGV是自动且空闲的 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (rgv.Data2.WorkMode != RGVMode.自动) return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (rgv.Data2.SystemStatus != RGVRunStatus.空闲) return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    //是否有任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (rgv.Data.Trigger_1 != rgv.Data2.Trigger_2) throw new WarnException($"待执行任务{rgv.Data.TaskID_1}-{rgv.Data.TaskID_2}"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    //检查取货点是否需要取货 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    obj.WhetherToExecute(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    //筛选出有任务号和起始及目标地址的设备 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    var dev = obj.RGVGetTaskedDevice(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (dev.Count > 0) //有需要取货的任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        //开始下达取货任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        DB.Do(db => 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            var taskids = dev.Select(v => v.Data2.Tasknum); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            var tasks = db.Default.Set<WCS_TASK>().Where(p => taskids.Contains(p.ID)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            if (tasks.GroupBy(p => p.TaskGroupKey).Count() > 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                throw new WarnException("任务组ID不一致"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            if (!tasks.GroupBy(p => p.TaskGroupKey).Any()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                throw new WarnException("无任务组ID"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            var gw1 = obj.Items.ToArray()[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            var gw2 = obj.Items.ToArray()[1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            if (gw1.Data2.Tasknum != 0 && gw2.Data2.Tasknum != 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                if (gw1.Data2.Goodsend != gw2.Data2.Goodsend) throw new WarnException($"{obj.Entity.Code}目标地址不一致"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            rgv.Data.TaskID_1 = gw1.Data2.Tasknum; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            rgv.Data.TaskID_2 = gw2.Data2.Tasknum; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            rgv.Data.TaskType_1 = RGVTaskType.取货; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            if (gw1.Data2.Tasknum != 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                rgv.Data.DestPosition_1 = gw1.Data2.Goodsend; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                rgv.Data.DestPosition_1 = gw2.Data2.Goodsend; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            rgv.Data.Trigger_1++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            foreach (var task in tasks) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                var msg = $"下达从{rgv.Data.StartPosition_1}移动至{ rgv.Data.DestPosition_1}的RGV PLC指令。"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                msg += $"[{ task.ID}][{rgv.Data.StartPosition_1}][{rgv.Data.DestPosition_1}[{ rgv.Data.Trigger_1}]"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                task.CreateStatusLog(db, msg, this.GetType()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        //检查RGV自身是否有任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        var b = false; //暂时默认无任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (b) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            //找到自己的后一个小车 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            var a = rgv.After(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            //后面的小车是否在执行任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            if (a.Data2.WorkMode == RGVMode.自动 && a.Data2.SystemStatus == RGVRunStatus.空闲) return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            //自己是否阻挡了该小车 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            if (rgv.StopedByMe(a)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                //取小车的目标位置值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                var c = Device.Find($"G{a.Data2.DestPosition_1}").Create<StationDeviceGroup>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                //计算目标位置最近的一个取货口 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                var d = Device.Where(v => v.Is(DF.涂布RGV取货站台)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                              .Select(v => v.Create<StationDeviceGroup>()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                              .Where(v => v.Position > c.Position) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                              .OrderBy(v => v.Position) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                              .FirstOrDefault(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                //写入移动任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                rgv.Move(d); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ///检查是否阻挡了其他RGV 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ////找到所有自动不空闲的小车 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            //var rgvs = rgv.RGVList.Where(v => v.Data2.WorkMode == RGVMode.自动 && v.Data2.SystemStatus != RGVRunStatus.空闲); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ////找到不空闲且离自己最近的 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            //var a = rgvs.OrderBy(v => v.Distance(rgv)).FirstOrDefault(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 else //没车 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 { 
			 |