林豪 左 2 лет назад
Родитель
Сommit
79f4466ef1

+ 24 - 11
Projects/永冠/WCS.Service/Works/RGV/RGVWork.cs

@@ -205,7 +205,7 @@ namespace WCS.Service.Works
             {
                 var station_2390 = Device.Find("2390").Device<IStation521, IStation520>();
                 var arr = Device.Find("2390", "2391", "2392", "2393", "2394", "2395", "2396", "2397").Select(v => v.Device<IStation521, IStation520>()).ToArray();
-                int count = arr.Where(v=>v.Data.PH_STATUS && v.Data.TASKNUM>10000).Count();
+                int count = arr.Where(v => v.Data.PH_STATUS && v.Data.TASKNUM > 10000).Count();
                 if (!station_2390.Data.PH_STATUS && station_2390.Data.TASKNUM == 0 && count < 5)
                 {
                     DB.Do(db =>
@@ -258,7 +258,6 @@ namespace WCS.Service.Works
                                      case 2366: code = "2359"; break; //二车间
                                      case 2328: code = "2114"; break; //一车间
                                      case 2385: code = "2359"; break; //三车间
-                                     
                                  };
 
                                  var end = Device.Find(code).Device<IStation521>();
@@ -374,7 +373,7 @@ namespace WCS.Service.Works
                             //station_3060.Data2.TASKNUM = station_3060.Data.TASKNUM;
                             station_3060.Data2.GOODSEND = 3013;
                             station_3060.Data2.CONFIRM = true;
-                        }   
+                        }
                     });
                 }
             }
@@ -438,17 +437,31 @@ namespace WCS.Service.Works
                 }
             }
 
+            bool agvTaks = false;
+            if (dev.Entity.CODE == "RGV8")
+            {
+                DB.Do(db =>
+                {
+                    agvTaks = db.Default.Set<WCS_AGVTask>().Any(v => v.Status < AGVTaskStatus.完成 && v.Status >= AGVTaskStatus.确认 && v.Status != AGVTaskStatus.执行 && v.Station == "3001");
+                });
+            };
+
             //获取所有需要取货的站台
             //获取下一个地址为当前RGV的站台,此处不考虑一台车跑全程
             var validPickupPoints = Device.Where(v => v.ROUTES.Any(p => p.NEXT.CODE == dev.Entity.CODE)).ToList()
-                             .Select(v => v.Device<IStation521, IStation520, IStation523>())
-                             .Where(v => v.Data.PH_STATUS && v.Data.TASKNUM > 10000 && v.Data.GOODSEND != Convert.ToInt16(v.Entity.CODE))//需要取货的站点
-                             .Where(v => //是否可以进行取货,主要用于判断放货位是否有货
-                             {
-                                 var end = Device.Find(v.Data.GOODSEND.ToString()).Device<IStation521>();
-                                 var res = end.Data.TASKNUM == 0 && end.Data.PH_STATUS == false;
-                                 return res;
-                             });
+                            .Select(v => v.Device<IStation521, IStation520, IStation523>())
+                            .Where(v => v.Data.PH_STATUS && v.Data.TASKNUM > 10000 && v.Data.GOODSEND != Convert.ToInt16(v.Entity.CODE))//需要取货的站点
+                            .Where(v => //是否可以进行取货,主要用于判断放货位是否有货
+                            {
+                                var end = Device.Find(v.Data.GOODSEND.ToString()).Device<IStation521>();
+                                var res = end.Data.TASKNUM == 0 && end.Data.PH_STATUS == false;
+                                if (v.Entity.CODE == "3012")
+                                {
+                                    if (agvTaks) res = false;
+                                }
+                                return res;
+                            });
+
             if (!validPickupPoints.Any()) return;//不需要取货
 
             var validPickupPoint = validPickupPoints.OrderBy(v => v.UpdateTime).FirstOrDefault() ?? throw new Exception("没有站台需要取货");

+ 40 - 25
Projects/永冠/WCS.Service/Works/Stations/22车间.cs

@@ -28,25 +28,20 @@ namespace WCS.Service.Works.Stations
             var station = dev.Entity.CODE;
 
             short outTemp = 0, inTemp = 0;
-            bool flag = false;
+           
             Device<IStation521, IStation520>[] arr = null;
 
             string trafficControl = "";
 
             outTemp = 3001;
             inTemp = 3006;
-            trafficControl = "3012-3060-3005-3004";
-            arr = Device.Find("3012", "3060", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
-            var rgv = Device.Find("RGV8").Device<IRGV521, IRGV520>();
-            if (rgv.Data2.Trigger != 0) throw new Exception("RGV8任务触发中");
-            if (rgv.Data.DestPosition == 3060 && rgv.Data.SystemStatus != RGVRunStatus.空闲) flag = true;
+            trafficControl = "3060-3005-3004";
+            arr = Device.Find("3060", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
 
             if (arr.Any(v => v.Data2.CONFIRM)) throw new Exception($"设备集[{trafficControl}]存在确认信号,请检查是否为异常状况");
-
-            flag = arr.Where(v => v.Data.GOODSEND == outTemp).Any() || flag;
-
             var nextcode = next.Code();
-            if (flag) nextcode = inTemp;
+
+            if (arr.Where(v => v.Data.GOODSEND == outTemp || (v.Entity.CODE == "3060" && v.Data.PH_STATUS && v.Data.GOODSEND == 0)).Any()) nextcode = inTemp;
 
             DB.Do(db =>
             {
@@ -117,14 +112,10 @@ namespace WCS.Service.Works.Stations
             outTemp = 3001;
             inTemp = 3006;
             addrTo = 3001;
-            arr = Device.Find("3060", "3005", "3004", "3001", "3012").Select(v => v.Device<IStation521, IStation520>()).ToArray();
-
-            var rgv = Device.Find("RGV8").Device<IRGV521, IRGV520>();
-            if (rgv.Data2.Trigger != 0) throw new Exception("RGV8任务触发中");
-            if (rgv.Data.DestPosition == 3060 && rgv.Data.SystemStatus != RGVRunStatus.空闲 && rgv.Data.PH_Status) throw new Exception("交通管制,RGV8正在出库");
+            arr = Device.Find("3060", "3005", "3004", "3001").Select(v => v.Device<IStation521, IStation520>()).ToArray();
 
-            if (Ltc.Do(dev, v => v.Data.GOODSEND != inTemp))
-                return;
+            if (Ltc.Do(dev, v => v.Data.GOODSEND != inTemp)) return;
+               
 
             var inTempDev = Device.Find(inTemp.ToString()).Device<IStation521>();
             if (inTempDev.Data.TASKNUM < 10000)
@@ -132,11 +123,9 @@ namespace WCS.Service.Works.Stations
 
             if (!inTempDev.Data.PH_STATUS)
                 return;
-           
+
             //if (arr.Any(v => v.Data.TASKNUM > 10000 && v.Data.GOODSEND == 3001 ||v.Data.GOODSEND ==3060))
             //    return;
-          
-            
 
             if (arr.Any(v => v.Data2.CONFIRM))
                 return;
@@ -144,13 +133,11 @@ namespace WCS.Service.Works.Stations
             var toDev = Device.Find(addrTo.ToString()).Device<IStation521>();
             if (toDev.Data.PH_STATUS)
             {
-                if (toDev.Data.TASKNUM < 10000)
-                    return;
-                if (toDev.Data.GOODSEND != toDev.Entity.Code())
-                    return;
+                if (toDev.Data.TASKNUM < 10000)return;
+                if (toDev.Data.GOODSEND != toDev.Entity.Code() ) return;
             }
 
-            if (arr.Where(v => v.Data.GOODSEND == outTemp || v.Data.GOODSEND == addrTo).Any())
+            if (arr.Where(v => v.Data.GOODSEND == outTemp || (v.Entity.CODE == "3060" && v.Data.PH_STATUS && v.Data.GOODSEND == 0)).Any())
                 throw new Exception("交通管制");
 
             var station = dev.Entity.CODE;
@@ -180,4 +167,32 @@ namespace WCS.Service.Works.Stations
             return new string[] { "3006" }.Contains(dev.CODE);
         }
     }
+
+    [WorkTitle(typeof(ProductHandler), "_22车间入库缓存", true)]
+    public class 出库放行 : DeviceWork<Device<IStation521, IStation520>>
+    {
+        protected override void Do(Device<IStation521, IStation520> dev)
+        {
+            if (Ltc.Do(dev, v => v.Data2.CONFIRM == true)) return;
+            if (Ltc.Do(dev, v => v.Data.TASKNUM == 0)) return;
+            if (Ltc.Do(dev, v => v.Data.PH_STATUS == false)) return;
+
+            // 没有准备放货的入库任务
+            DB.Do(db =>
+            {
+                var agvtask = db.Default.Set<WCS_AGVTask>().Where(v => v.Status < AGVTaskStatus.完成)
+                                                           .Where(v => v.Status != AGVTaskStatus.新建 || v.Status == AGVTaskStatus.执行);
+                if (agvtask.Any()) return;
+            });
+
+            dev.Data2.TASKNUM = dev.Data.TASKNUM;
+            dev.Data2.GOODSEND = 3001;
+            dev.Data2.CONFIRM = true;
+        }
+
+        protected override bool SelectDevice(WCS_DEVICE dev)
+        {
+            return new string[] { "3060" }.Contains(dev.CODE);
+        }
+    }
 }

+ 17 - 1
Projects/永冠/WCS.Service/Works/Stations/AGV交互.cs

@@ -247,7 +247,23 @@ namespace WCS.Service.Works.Stations
                         }
                         else if (Ltc.Do(agvtask, v => v.Status < v.AGVStatus))
                         {
-                            if (Ltc.Do(agvtask, v => v.AGVStatus == AGVTaskStatus.请求_允许 || v.AGVStatus == AGVTaskStatus.请求_允许2))
+                            if (Ltc.Do(agvtask, v => v.AGVStatus == AGVTaskStatus.确认))
+                            {
+                                if (agvTasks.Any(v => v.Status >= AGVTaskStatus.确认 && v.Status != AGVTaskStatus.执行 && v.Station == "3001"))
+                                    throw new Exception($"同时放货任务数量最大为1");
+                                // 缓存位与取放货位没有光电 任务 去往缓存位任务   ,如果楼上没有出库任务,就不会有去往3006的任务
+                                var inTemp = Device.Find("3006", "3001").Select(v => v.Device<IStation521>());
+                                if (inTemp.Any(v => v.Data.PH_STATUS == true || v.Data.TASKNUM > 0 || v.Data.GOODSEND == 3006)) return;
+
+                                //3060没有出库任务
+                                var con3060 = Device.Find("3060").Device<IStation521>();
+                                if (con3060.Data.PH_STATUS && con3060.Data.GOODSEND is 3001 or 0) return;
+
+                                agvtask.Status = agvtask.AGVStatus;
+                                agvtask.UpdateTime = DateTime.Now;
+                                db.Default.SaveChanges();
+                            }
+                            else if (Ltc.Do(agvtask, v => v.AGVStatus == AGVTaskStatus.请求_允许 || v.AGVStatus == AGVTaskStatus.请求_允许2))
                             {
                                 if (Ltc.Do(dev, v => v.Data2.RES))
                                     continue;