Administrator 3 anni fa
parent
commit
721f202391

+ 7 - 5
Projects/永冠OPP/WCS.Service/Extensions/DeviceExtension.cs

@@ -163,7 +163,7 @@ namespace WCS.Service.Extensions
         /// <returns></returns>
         public float Distance(RGVDevice rgv)
         {
-            return Math.Abs((Position - rgv.Position + Length) % Length);
+            return Math.Abs((Position - rgv.Position) % Length);
         }
 
         /// <summary>
@@ -173,7 +173,7 @@ namespace WCS.Service.Extensions
         /// <returns></returns>
         public float Distance(StationDeviceGroup dev)
         {
-            return Math.Abs((Position - dev.Position + Length) % Length);
+            return Math.Abs((Position - dev.Position) % Length);
         }
 
         /// <summary>
@@ -317,7 +317,7 @@ namespace WCS.Service.Extensions
         {
             get
             {
-                return AllRGVList.Where(v => v.Entity.PROTOCOLS.Any(d => Entity.PROTOCOLS.Any(e => e.DB.ID == d.DB.ID)))
+                return AllRGVList.Where(v => v.Entity.PROTOCOLS.Any(d => Entity.PROTOCOLS.Any(e => e.DB.PLC.IP == d.DB.PLC.IP)))
                     .Where(v => v.Entity.CODE != Entity.CODE).ToList();
             }
         }
@@ -405,7 +405,7 @@ namespace WCS.Service.Extensions
         /// <returns></returns>
         public RGVDevice After()
         {
-            var arr = RGVList.OrderBy(v => v.Position);
+            var arr = RGVList.OrderByDescending(v => v.Position);
             var rgv = arr.FirstOrDefault(v => v.Position < Position);
             if (rgv == null)
                 rgv = arr.LastOrDefault(v => v.Position > Position);
@@ -419,7 +419,7 @@ namespace WCS.Service.Extensions
         /// <returns></returns>
         public float Distance(RGVDevice after)
         {
-            return Math.Abs((Position - after.Position + Length) % Length);
+            return Math.Abs((Position - after.Position) % Length);
         }
 
         /// <summary>
@@ -490,6 +490,8 @@ namespace WCS.Service.Extensions
             var target = rgv.Data2.DestPosition_1;
             //获取目标站台的设备组信息
             var station = Device.Find($"G{target}").Create<StationDeviceGroup>();
+            if (station.Position < Data2.Position && station.Entity.CODE != "G1") return false;
+
             //当前RGV与目标站台的距离小于传入RGV到达目标站台的距离
             return station.Distance(this) < station.Distance(rgv);
         }

+ 54 - 43
Projects/永冠OPP/WCS.Service/Works/RGV/RGVWorks.cs

@@ -92,47 +92,48 @@ namespace WCS.Service.Works.RGV
                     //是否有任务
                     if (rgv.Data.Trigger_1 != rgv.Data2.Trigger_1) throw new WarnException($"待执行任务{rgv.Data.TaskID_1}-{rgv.Data.TaskID_2}");
                     //检查取货点是否需要取货
-                    obj.WhetherToExecute();
+                    //obj.WhetherToExecute();
                     //筛选出有任务号和起始及目标地址的设备
-                    var dev = obj.RGVGetTaskedDevice();
-                    if (dev.Count > 0) //有需要取货的任务
+                    //var dev = obj.RGVGetTaskedDevice();
+                    int dev = 0;
+                    if (dev > 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());
-                            }
-                        });
+                        //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
                     {
@@ -153,11 +154,21 @@ namespace WCS.Service.Works.RGV
                                 //取小车的目标位置值
                                 var c = Device.Find($"G{a.Data2.DestPosition_1}").Create<StationDeviceGroup>();
                                 //计算目标位置最近的一个取货口
-                                var d = Device.Where(v => v.Is(DF.涂布RGV取货站台))
+                                var d = Device.Where(v => v.Is(DF.涂布RGV取货站台) && v.CODE != obj.Entity.CODE)
                                               .Select(v => v.Create<StationDeviceGroup>())
-                                              .Where(v => v.Position > c.Position)
-                                              .OrderBy(v => v.Position)
+                                              .OrderBy(v => obj.Distance(v))
                                               .FirstOrDefault();
+
+                                var cc = Device.Where(v => v.Is(DF.涂布RGV取货站台) && v.CODE != obj.Entity.CODE)
+                                              .Select(v => v.Create<StationDeviceGroup>())
+                                              .OrderBy(v => obj.Distance(v));
+
+                                var aa = Device.Where(v => v.Is(DF.涂布RGV取货站台) && v.CODE != obj.Entity.CODE)
+                                              .Select(v => v.Create<StationDeviceGroup>())
+                                              .Select(v =>
+                                              {
+                                                  return new Tuple<string, float>(v.Entity.CODE, obj.Distance(v));
+                                              });
                                 //写入移动任务
                                 rgv.Move(d);
                             }
@@ -173,8 +184,8 @@ namespace WCS.Service.Works.RGV
                 else //没车
                 {
                     //有没有目标地址是自己这的小车 任务未完成 未到站
-                    var moveRgv = obj.RgvList.Any(v => v.Data2.DestPosition_1 == obj.Entity.CODE.Replace("G", "").ToShort()
-                                                     && !v.Data2.Status_1.HasFlag(WCS.Entity.Protocol.RGVStatus.任务完成) && !v.Data2.Status_1.HasFlag(WCS.Entity.Protocol.RGVStatus.任务完成));
+                    var moveRgv = obj.RgvList.Any(v => v.Data2.DestPosition_1 == obj.Entity.CODE.Replace("G", "").ToShort());
+
                     if (moveRgv) return;
                     //找到一个空闲且离自己最近的一个RGV
                     var a = obj.RgvList.Where(v => v.Data2.SystemStatus == RGVRunStatus.空闲 && v.Data2.WorkMode == RGVMode.自动);