瀏覽代碼

优化AGV任务逻辑并添加定时ping操作

在 `PLC.cs` 文件中,添加了一个新的 `Task.Run` 任务,用于每秒钟执行一次 `ping` 操作,并将结果赋值给 `Ping` 变量。

在 `AgvSystems.cs` 文件中:
- 修改了 `Do` 方法中的条件判断,将 `obj.Entity.HasFlag(DeviceFlags.出库)` 改为 `obj.Entity.Code == "1018"`,将 `obj.Entity.HasFlag(DeviceFlags.入库)` 改为 `obj.Entity.Code == "1017"`。
- 在处理一楼入库任务时,新增了对 `agvInfo.WorkShop` 为 `1138` 的特殊处理逻辑。
- 删除了部分筛选站台和堆垛机的代码,并将其替换为新的逻辑。
- 修改了 `Select` 方法中的条件判断,将 `dev.Code is "1011" or "1012"` 改为 `dev.Code is "1017" or "1018"`。

在 `NoInteractionSystems.cs` 文件中:
- 在一楼下发AGV任务时,新增了对 `agv.Station` 的判断逻辑,如果 `agv.Station` 以 "HA" 开头且不包含 "HA01" 到 "HA05",则将 `agv.WorkShop` 设为 `1138`。
- 在获取AGV任务信息时,新增了对任务信息按添加时间排序并取前5个的逻辑。

在 `AgvApi.cs` 文件中:
- 修改了 `满轮入库` 方法中的逻辑,新增了对 `position` 的判断逻辑,如果 `position` 以 "HA" 开头且不包含 "HA01" 到 "HA05",则将 `tunCode` 设为 "HJLK4",`preCode` 设为 "1138"。
- 修改了 `一楼空轮出库下发AGV` 方法中的逻辑,新增了对 `position1` 的判断逻辑,如果 `position1` 包含 "101",则将 `code` 设为 "500",否则将 `code` 设为 "666",`tp` 设为 "02"。
林豪 左 1 年之前
父節點
當前提交
796a8d368e

+ 11 - 1
WCS.Core/PLC.cs

@@ -39,7 +39,17 @@ namespace WCS.Core
             }
             else
                 throw new Exception("Configs.PLCAccessorCreater未赋值");
-           
+
+            Task.Run(() =>
+            {
+                while (true)
+                {
+                    Ping = ping();
+                    Task.Delay(1000).Wait();
+                }
+                // ReSharper disable once FunctionNeverReturns
+            });
+
         }      
         public IPLCAccessor Accessor { get; private set; }
         private bool ping(int timeout = 300)

+ 66 - 33
WCS.WorkEngineering/Systems/AgvSystems.cs

@@ -42,7 +42,7 @@ namespace WCS.WorkEngineering.Systems
 
         public override void Do(Station obj)
         {
-            if (obj.Entity.HasFlag(DeviceFlags.出库))
+            if (obj.Entity.Code == "1018"/*.HasFlag(DeviceFlags.出库)*/)
             {
 
                 List<WCS_AgvTaskInfo> agvTaskInfos = new List<WCS_AgvTaskInfo>();
@@ -118,7 +118,7 @@ namespace WCS.WorkEngineering.Systems
                     //}
                 }
             }
-            else if (obj.Entity.HasFlag(DeviceFlags.入库))
+            else if (obj.Entity.Code == "1017"/*.HasFlag(DeviceFlags.入库)*/)
             {
                 List<WCS_AgvTaskInfo> agvTaskInfos = new List<WCS_AgvTaskInfo>();
                 //获取所有未结束的入库AGV任务
@@ -166,31 +166,67 @@ namespace WCS.WorkEngineering.Systems
                                     if (task.Floor == 1) //一楼
                                     {
                                         //一楼三个入库口 新增一个巷道,两个入库口
-                                        stations = devs.Where(v => v.Entity.Code is "1011" or "1013" or "1015" or "1117" or "1138").ToList();
-
-                                        //过滤有任务的站台
-                                        var taskinstations = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.TaskType == AGVTaskType.EnterDepot && v.Status < AGVTaskStatus.MissionCompleted && (v.Position == "1011" || v.Position == "1013" || v.Position == "1015" || v.Position == "1117" || v.Position == "1138")).SplitTable(v => v.Take(2)).Select(v => v.Position).ToList();
-                                        stations = stations.Where(p => !taskinstations.Contains(p.Entity.Code)).ToList();
-
-                                        //筛选出可用站台
-                                        stations = stations.Where(v => v.Data.VoucherNo == v.Data2.VoucherNo && v.Data3.Status.HasFlag(StatusEunm.Auto))
-                                                           .Where(v => !v.Data3.Status.HasFlag(StatusEunm.PH_Status) && !v.Data3.Status.HasFlag(StatusEunm.OT_Status))
-                                                           .Where(v => !v.Data3.Status.HasFlag(StatusEunm.Run)).ToList(); // 筛选出可用站台
-
-                                        //var putS = stations.Select(v => v.Entity.Code);
-                                        var dev = devs.Find(v => v.Entity.Code == "1138");
-                                        World.Log($"放货站台1138信号凭证号{dev.Data.VoucherNo}-{dev.Data2.VoucherNo}-自动{dev.Data3.Status.HasFlag(StatusEunm.Auto)}-光电{dev.Data3.Status.HasFlag(StatusEunm.PH_Status)}-有货光电{dev.Data3.Status.HasFlag(StatusEunm.OT_Status)}-{dev.Data3.Status.HasFlag(StatusEunm.Run)}");
-                                        //World.Log($"可用放货站台{JsonConvert.SerializeObject(putS)}");
-                                        this.ExRecord(obj.Entity.Code, $"AGV任务{agvInfo.ID},可用放货站台", stations.Select(v => v.Entity.Code).ToList());
-                                        //可用堆垛机
-                                        srm = stations.Select(v => v.Entity.Sources).SelectMany(v => v).Where(v => v.IsTunnel()) //上一个地址是巷道的
-                                                      .Select(v => v.Sources).SelectMany(v => v).Where(v => v.HasProtocol(typeof(ISRM520))) //筛选出堆垛机
-                                                      .Select(v => new SRM(v, this.World)) //转换为SRM
-                                                      .Where(v => v != null && !v.Data2.Status.HasFlag(SrmStatus.Alarm) && v.Data2.AutoStatus == SrmAutoStatus.Automatic) //筛选出可用堆垛机
-                                                      .Where(v => tunnelNo.Contains(v.Entity.Code)) //筛选出巷道优先级最高的堆垛机
-                                                      .MinBy(v => tunnelNo.IndexOf(v.Entity.Code));//按照巷道优先级排序
-
-                                     
+                                        //proline 6-12
+                                        if (agvInfo.WorkShop == 1138)
+                                        {
+                                            stations = devs.Where(v => v.Entity.Code is "1138").ToList();
+                                            //过滤有任务的站台
+                                            var taskinstations = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.TaskType == AGVTaskType.EnterDepot && v.Status < AGVTaskStatus.MissionCompleted && (v.Position == "1138")).SplitTable(v => v.Take(2)).Select(v => v.Position).ToList();
+                                            stations = stations.Where(p => !taskinstations.Contains(p.Entity.Code)).ToList();
+                                            //筛选出可用站台
+                                            stations = stations.Where(v => v.Data.VoucherNo == v.Data2.VoucherNo && v.Data3.Status.HasFlag(StatusEunm.Auto))
+                                                               .Where(v => !v.Data3.Status.HasFlag(StatusEunm.PH_Status) && !v.Data3.Status.HasFlag(StatusEunm.OT_Status))
+                                                               .Where(v => !v.Data3.Status.HasFlag(StatusEunm.Run)).ToList(); // 筛选出可用站台
+                                           
+                                            //可用堆垛机
+                                            srm = stations.Select(v => v.Entity.Sources).SelectMany(v => v).Where(v => v.IsTunnel()) //上一个地址是巷道的
+                                                          .Select(v => v.Sources).SelectMany(v => v).Where(v => v.HasProtocol(typeof(ISRM520))) //筛选出堆垛机
+                                                          .Select(v => new SRM(v, this.World)) //转换为SRM
+                                                          .Where(v => v != null && !v.Data2.Status.HasFlag(SrmStatus.Alarm) && v.Data2.AutoStatus == SrmAutoStatus.Automatic) //筛选出可用堆垛机
+                                                          .Where(v => tunnelNo.Contains(v.Entity.Code)) //筛选出巷道优先级最高的堆垛机
+                                                          .MinBy(v => tunnelNo.IndexOf(v.Entity.Code));//按照巷道优先级排序
+                                            if (srm == null)
+                                            {
+                                                stations = devs.Where(v => v.Entity.Code is "1011" or "1013" or "1015" or "1117").ToList();
+                                                //过滤有任务的站台
+                                                var taskinstations1 = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.TaskType == AGVTaskType.EnterDepot && v.Status < AGVTaskStatus.MissionCompleted && (v.Position == "1011" || v.Position == "1013" || v.Position == "1015" || v.Position == "1117")).SplitTable(v => v.Take(2)).Select(v => v.Position).ToList();
+                                                stations = stations.Where(p => !taskinstations1.Contains(p.Entity.Code)).ToList();
+                                                //筛选出可用站台
+                                                stations = stations.Where(v => v.Data.VoucherNo == v.Data2.VoucherNo && v.Data3.Status.HasFlag(StatusEunm.Auto))
+                                                                   .Where(v => !v.Data3.Status.HasFlag(StatusEunm.PH_Status) && !v.Data3.Status.HasFlag(StatusEunm.OT_Status))
+                                                                   .Where(v => !v.Data3.Status.HasFlag(StatusEunm.Run)).ToList(); // 筛选出可用站台
+
+                                                //可用堆垛机
+                                                srm = stations.Select(v => v.Entity.Sources).SelectMany(v => v).Where(v => v.IsTunnel()) //上一个地址是巷道的
+                                                              .Select(v => v.Sources).SelectMany(v => v).Where(v => v.HasProtocol(typeof(ISRM520))) //筛选出堆垛机
+                                                              .Select(v => new SRM(v, this.World)) //转换为SRM
+                                                              .Where(v => v != null && !v.Data2.Status.HasFlag(SrmStatus.Alarm) && v.Data2.AutoStatus == SrmAutoStatus.Automatic) //筛选出可用堆垛机
+                                                              .Where(v => tunnelNo.Contains(v.Entity.Code)) //筛选出巷道优先级最高的堆垛机
+                                                              .MinBy(v => tunnelNo.IndexOf(v.Entity.Code));//按照巷道优先级排序
+                                            }
+                                        }
+                                        else
+                                        {
+                                            stations = devs.Where(v => v.Entity.Code is "1011" or "1013" or "1015" or "1117").ToList();
+
+                                            //过滤有任务的站台
+                                            var taskinstations = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.TaskType == AGVTaskType.EnterDepot && v.Status < AGVTaskStatus.MissionCompleted && (v.Position == "1011" || v.Position == "1013" || v.Position == "1015" || v.Position == "1117")).SplitTable(v => v.Take(2)).Select(v => v.Position).ToList();
+                                            stations = stations.Where(p => !taskinstations.Contains(p.Entity.Code)).ToList();
+
+                                            //筛选出可用站台
+                                            stations = stations.Where(v => v.Data.VoucherNo == v.Data2.VoucherNo && v.Data3.Status.HasFlag(StatusEunm.Auto))
+                                                               .Where(v => !v.Data3.Status.HasFlag(StatusEunm.PH_Status) && !v.Data3.Status.HasFlag(StatusEunm.OT_Status))
+                                                               .Where(v => !v.Data3.Status.HasFlag(StatusEunm.Run)).ToList(); // 筛选出可用站台
+
+                                            this.ExRecord(obj.Entity.Code, $"AGV任务{agvInfo.ID},可用放货站台", stations.Select(v => v.Entity.Code).ToList());
+                                            //可用堆垛机
+                                            srm = stations.Select(v => v.Entity.Sources).SelectMany(v => v).Where(v => v.IsTunnel()) //上一个地址是巷道的
+                                                          .Select(v => v.Sources).SelectMany(v => v).Where(v => v.HasProtocol(typeof(ISRM520))) //筛选出堆垛机
+                                                          .Select(v => new SRM(v, this.World)) //转换为SRM
+                                                          .Where(v => v != null && !v.Data2.Status.HasFlag(SrmStatus.Alarm) && v.Data2.AutoStatus == SrmAutoStatus.Automatic) //筛选出可用堆垛机
+                                                          .Where(v => tunnelNo.Contains(v.Entity.Code)) //筛选出巷道优先级最高的堆垛机
+                                                          .MinBy(v => tunnelNo.IndexOf(v.Entity.Code));//按照巷道优先级排序
+                                        }                      
                                     }
                                     else //二楼
                                     {
@@ -229,11 +265,7 @@ namespace WCS.WorkEngineering.Systems
                                     this.ExRecord(obj.Entity.Code, $"AGV任务{agvInfo.ID},放货站台{nextPos}");
 
                                     bool flag = false;
-                                    //if (((task.BusType == "二楼湿拉线退料回立库" || task.BusType == "二楼湿拉线余料回立库") && task.Floor == 2))
-                                    //{
-                                    //    flag = true;
-                                    //    nextPos.Entity.Code = "1025";
-                                    //}
+                                    
                                     var agvs = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status < AGVTaskStatus.MissionCompleted && v.Position == nextPos.Entity.Code).SplitTable(v => v.Take(2)).ToList();
                                     if (agvs.Any())
                                     {
@@ -246,6 +278,7 @@ namespace WCS.WorkEngineering.Systems
                                     }
                                     //wcs任务状态卡控,防止因光电异常误判                                   
                                     if (db.Default.Queryable<WCS_TaskInfo>().Any(v => v.AddrNext == nextPos.Entity.Code && v.Status == Entity.TaskStatus.ConveyorExecution)) return;
+                                    //if (db.Default.Queryable<WCS_TaskDtl>().SplitTable(v => v.Take(2)).Any(v => v.NextPoint == nextPos.Entity.Code && v.Desc.Contains("任务分配至堆垛机"))) return;
 
 
                                     if (RedisHub.Default.Get("TaskTun:" + task.ID) != null && RedisHub.Default.Get("TaskTun:" + task.ID) != nextPos.Entity.Code)
@@ -352,7 +385,7 @@ namespace WCS.WorkEngineering.Systems
 
         public override bool Select(Device dev)
         {
-            return dev.Code is "1011" or "1012";
+            return dev.Code is "1017" or "1018";
         }
     }
 }

+ 5 - 0
WCS.WorkEngineering/Systems/NoInteractionSystems.cs

@@ -214,6 +214,10 @@ namespace WCS.WorkEngineering.Systems
                                         var res = AgvApi.满轮入库(wcs.BarCode, agv.Station, Guid.NewGuid().ToString().Replace("-", ""), "1");
                                         agv.Status = AGVTaskStatus.Confirm;
                                         agv.AgvID = res.data;
+                                        if (agv.Station.StartsWith("HA") && !(agv.Station.Contains("HA01") || agv.Station.Contains("HA02") || agv.Station.Contains("HA03") || agv.Station.Contains("HA04") || agv.Station.Contains("HA05")))
+                                        {
+                                            agv.WorkShop = 1138;
+                                        }
                                         db.Default.Updateable(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
                                         break;
 
@@ -261,6 +265,7 @@ namespace WCS.WorkEngineering.Systems
 
                 if (agvTaskInfos1.Any())
                 {
+                    agvTaskInfos1 = agvTaskInfos1.OrderBy(x=>x.AddTime).Take(5).ToList();
                     foreach (var item in agvTaskInfos1)
                     {
                         try

+ 19 - 9
WCS.WorkEngineering/WebApi/Controllers/AgvApi.cs

@@ -46,10 +46,13 @@ namespace WCS.WorkEngineering.WebApi.Controllers
         /// <returns></returns>
         public static GenAgvSchedulingTaskResponse 满轮入库(string ctnrCode, string position, string taskCode, string priority)
         {
-            if (position == "1017")
+            string tunCode = "HJLK";
+            string preCode = "1015";
+            if (position.StartsWith("HA") && !(position.Contains("HA01") || position.Contains("HA02") || position.Contains("HA03") || position.Contains("HA04") || position.Contains("HA05")))
             {
-                position = "40";
-            }
+                tunCode = "HJLK4";
+                preCode = "1138";
+            }            
             return GenAgvSchedulingTask("iwms_third", ctnrCode, "4", new List<positionCodeClass>()
             {
                 new positionCodeClass(){ //取货机台
@@ -57,11 +60,11 @@ namespace WCS.WorkEngineering.WebApi.Controllers
                     type="00"
                 },
                 new positionCodeClass(){ //巷道分配点
-                    positionCode="HJLK",
+                    positionCode=tunCode,
                     type="00"
                 },
                 new positionCodeClass(){ //预分配放货点
-                    positionCode="1015",
+                    positionCode=preCode,
                     type="00"
                 }
             }, priority, taskCode, "ZTGT03", "1");
@@ -166,9 +169,16 @@ namespace WCS.WorkEngineering.WebApi.Controllers
         /// <returns></returns>
         public static GenAgvSchedulingTaskResponse 一楼空轮出库下发AGV(string ctnrCode, string position1, string position2, string taskCode, string priority)
         {
-            if (position1 == "1018")
+            string code = "500";
+            string tp = "04";
+            if (position1.Contains("101"))
             {
-                position1 = "41";
+                code = "500";
+            }
+            else
+            {
+                code = "666";
+                tp = "02";
             }
             return GenAgvSchedulingTask2("iwms", ctnrCode, "4", new List<positionCodeClass>()
             {
@@ -177,8 +187,8 @@ namespace WCS.WorkEngineering.WebApi.Controllers
                     type="00"
                 },
                 new positionCodeClass(){ //放货机台
-                    positionCode="500",
-                    type="04"
+                    positionCode=code,
+                    type=tp
                 }
             }, priority, taskCode, "ZTGT22", "-1");
         }