Browse Source

一楼分配巷道启用稳定本

林豪 左 3 years ago
parent
commit
79648b9669

+ 0 - 2
Projects/永冠OPP/WCS.Service/Extensions/DeviceExtension.cs

@@ -786,8 +786,6 @@ namespace WCS.Service.Extensions
         /// <returns></returns>
         /// <returns></returns>
         public SrmFork GetFork(Task task, int index)
         public SrmFork GetFork(Task task, int index)
         {
         {
-            short maxCol = (short)(Entity.CODE == "SRM1" ? 112 : 102);
-            short min = 1;
             if (index > 1) throw new WarnException("一次最多下发两个任务");
             if (index > 1) throw new WarnException("一次最多下发两个任务");
             //如果索引是1,直接返回货叉2
             //如果索引是1,直接返回货叉2
             if (index == 1) return SrmFork.货叉2;
             if (index == 1) return SrmFork.货叉2;

+ 110 - 110
Projects/永冠OPP/WCS.Service/Works/Station/一楼入库.cs

@@ -158,6 +158,107 @@ namespace WCS.Service.Works.Station
         }
         }
     }
     }
 
 
+    [WorkTitle(typeof(ProductHandler), "一楼分配巷道")]
+    internal class 巷道分配 : Work<StationDeviceGroup>
+    {
+        protected override bool SelectDevice(WCS_DEVICE dev)
+        {
+            return dev.CODE == "G1030";
+        }
+
+        protected override void Do(StationDeviceGroup obj)
+        {
+            obj.EX(obj =>
+            {
+                var code = obj.Entity.CODE;
+                //当前组有一个运行的设备就停止执行
+                foreach (var item in obj.Items)
+                {
+                    var dev = Device.Find(item.Entity.CODE).Create<StationDevice>();
+                    if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态)) throw new DoException("无光电");
+                    if (dev.Data.VoucherNo != dev.Data2.VoucherNo)
+                        throw new WarnException($"等待任务[{dev.Data2.Tasknum}]执行--凭证号不一致[{dev.Data.VoucherNo}][{dev.Data2.VoucherNo}]");
+                    if (dev.Data3.Status.HasFlag(StationStatus.运行状态位)) throw new WarnException("设备运行中");
+                    if (dev.Data2.Tasknum > 10000 && dev.Data2.Request != IstationRequest.请求分配目标地址)
+                        throw new WarnException("有任务无请求");
+                }
+
+                //获取需要进行巷道分配的设备
+                var devs = obj.TaskedDeviceGetNextAddress() ?? throw new WarnException("无可用任务");
+
+                DB.Do(db =>
+                {
+                    var taskIds = devs.Select(p => p.Data2.Tasknum);
+                    var tasks = db.Default.Set<WCS_TASK>().Where(p => taskIds.Any(v => v == p.ID)).ToList();
+                    var res = WMS.GetTunnelList(tasks.Select(v => v.WMSTASK.ToString()).ToList(), code);
+                    if (string.IsNullOrEmpty(res.TunnelNum)) throw new WarnException($"WMS未返回巷道");
+                    var tunnelNo = res.TunnelNum.Split(',').Select(v => "TY" + v).ToList();
+
+                    var tunnels = Device.Where(v => tunnelNo.Contains(v.CODE)).ToList();
+
+                    List<TunnelInfo> tunnelInfos = new List<TunnelInfo>();
+                    foreach (var item in tunnels)
+                    {
+                        //当前巷道的取货点
+                        var allIn = Device.Where(v => v.Is(DF.SRM二级品取货)) //一楼所有取货点
+                                          .Where(v => v.ROUTES.Any(p => p.NEXT == item)) //下一个点为当前巷道的取货点
+                                          .Select(v => v.CODE)
+                                          .ToList();
+                        var putStation = Device.Where(v => v.IsConv() && v.ROUTES.Any(p => p.NEXT != null && allIn.Contains(p.NEXT.CODE))) //下一个目标地址包含取货点的设备
+                                      .Select(v => v.Create<StationDevice>()) //取所有可以到达取货点设备的信息
+                                      .Where(v => !v.Data3.Status.HasFlag(StationStatus.运行状态位) && !v.Data2.Status.HasFlag(IstationStatus.光电状态) && v.Data2.Tasknum < 10000)//筛选出空闲的路径点,此处因输送机都是一个动力,因此可以先找路径点再找设备组
+                                      .Distinct()
+                                      .FirstOrDefault();//去一次重
+                        if (putStation == null) continue;
+                        var taskInStation = Device.Where(p => p.CODE.StartsWith("G") && p.DEVICEGROUP.Any(d => d.MEMBER == putStation.Entity)).OrderBy(p => p.CODE).FirstOrDefault();
+                        //RGV是否有正在前往这个地址的任务
+                        var rgv8 = Device.Find("RGV8").Create<RGVDevice>();
+                        if (!rgv8.Data2.SystemStatus.HasFlag(WCS.Entity.Protocol.RGV.RGVRunStatus.空闲)
+                          && !rgv8.Data2.WorkMode.HasFlag(WCS.Entity.Protocol.RGV.RGVMode.自动)
+                          && rgv8.Data2.DestPosition_1 == taskInStation.CODE.Replace("G", "").ToShort()) continue;
+                        tunnelInfos.Add(new TunnelInfo
+                        {
+                            Tunnel = item,
+                            taskIN = taskInStation, //找到放货点设备所在组
+                            SRM = Device.Where(p => p.IsSC()).FirstOrDefault(p => item.ROUTES.Any(d => d.NEXT.CODE == p.CODE)).Create<SRMDevice>()
+                        });
+                    }
+                    //筛选出优先级最高的可用巷道
+                    var tunnelInfo = tunnelInfos.Where(v => { try { return v.SRM.Data3.SCAlarm == 0 && v.SRM.Data2.SRMMode == SCMode.远程 && v.SRM.Data2.SRMStatus == SCRunStatus.空闲; } catch { return false; } })
+                                                .Where(v => !db.Default.Set<WCS_TASK>().Any(p => p.Priority > 0 && p.DEVICE == v.SRM.Entity.CODE && p.STATUS < TaskStatus.堆垛机完成))
+                                                .OrderBy(v => tunnelNo.IndexOf(v.Tunnel.CODE)).FirstOrDefault();
+                    if (tunnelInfo == null) throw new WarnException("无可用巷道");
+
+                    //开始向设备中写入任务信息
+                    foreach (var item in devs)
+                    {
+                        var dev = Device.Find(item.Entity.CODE).Create<StationDevice>();
+                        var task = tasks.FirstOrDefault(p => p.ID == dev.Data2.Tasknum);
+                        if (task == null) throw new WarnException($"WCS无该任务{dev.Data2.Tasknum}--{dev.Entity.CODE}");
+
+                        task.DEVICE = tunnelInfo.SRM.Entity.CODE;
+                        task.TUNNEL = tunnelInfo.Tunnel.CODE;
+                        task.ADDRNEXT = tunnelInfo.taskIN.CODE;
+                        task.TaskGroupKey = res.WMSTaskGroupKey;
+                        task.ADDRTO = task.DEVICE;
+                        db.Default.SaveChanges();
+
+                        var msg = $"下达从1030移动至{dev.Data.Goodsend}的PLC指令。同时将任务分配至[{ task.TUNNEL }]-[{task.DEVICE}]";
+                        msg += $"[{dev.Data.Tasknum}][1030][{dev.Data.Goodsend}][{tunnelInfo.SRM.Entity.CODE}][{dev.Data.VoucherNo}[{dev.Data2.VoucherNo}]";
+
+                        task.CreateStatusLog(db, msg, this.GetType());
+
+                        dev.Data.Tasknum = task.ID;
+                        dev.Data.Goodsstart = 1030;
+                        dev.Data.Goodsend = tunnelInfo.taskIN.CODE.Replace("G", "").ToShort();
+                        dev.Data.CmdType = IstationCmdType.分配目标地址;
+                        dev.Data.VoucherNo++;
+                    }
+                });
+            });
+        }
+    }
+
     //[WorkTitle(typeof(ProductHandler), "一楼分配巷道")]
     //[WorkTitle(typeof(ProductHandler), "一楼分配巷道")]
     //internal class 巷道分配 : Work<StationDeviceGroup>
     //internal class 巷道分配 : Work<StationDeviceGroup>
     //{
     //{
@@ -171,25 +272,19 @@ namespace WCS.Service.Works.Station
     //        obj.EX(obj =>
     //        obj.EX(obj =>
     //        {
     //        {
     //            var code = obj.Entity.CODE;
     //            var code = obj.Entity.CODE;
-    //            //当前组有一个运行的设备就停止执行
-    //            foreach (var item in obj.Items)
-    //            {
-    //                var dev = Device.Find(item.Entity.CODE).Create<StationDevice>();
-    //                if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态)) throw new DoException("无光电");
-    //                if (dev.Data.VoucherNo != dev.Data2.VoucherNo)
-    //                    throw new WarnException($"等待任务[{dev.Data2.Tasknum}]执行--凭证号不一致[{dev.Data.VoucherNo}][{dev.Data2.VoucherNo}]");
-    //                if (dev.Data3.Status.HasFlag(StationStatus.运行状态位)) throw new WarnException("设备运行中");
-    //                if (dev.Data2.Tasknum > 10000 && dev.Data2.Request != IstationRequest.请求分配目标地址)
-    //                    throw new WarnException("有任务无请求");
-    //            }
+    //            //两个设备都必须满足的条件
+    //            if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) return;
+    //            if (obj.Items.Any(v => !v.Data2.Status.HasFlag(IstationStatus.光电状态))) return;
+    //            if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) return;
 
 
-    //            //获取需要进行巷道分配的设备
-    //            var devs = obj.TaskedDeviceGetNextAddress() ?? throw new WarnException("无可用任务");
+    //            //成功分配巷道的任务的任务
+    //            var finishTaskList = new List<Tuple<int, StationDevice>>();
 
 
     //            DB.Do(db =>
     //            DB.Do(db =>
     //            {
     //            {
-    //                var taskIds = devs.Select(p => p.Data2.Tasknum);
+    //                var taskIds = obj.Items.Select(v => v.Data2.Tasknum > 10000 && 5);
     //                var tasks = db.Default.Set<WCS_TASK>().Where(p => taskIds.Any(v => v == p.ID)).ToList();
     //                var tasks = db.Default.Set<WCS_TASK>().Where(p => taskIds.Any(v => v == p.ID)).ToList();
+
     //                var res = WMS.GetTunnelList(tasks.Select(v => v.WMSTASK.ToString()).ToList(), code);
     //                var res = WMS.GetTunnelList(tasks.Select(v => v.WMSTASK.ToString()).ToList(), code);
     //                if (string.IsNullOrEmpty(res.TunnelNum)) throw new WarnException($"WMS未返回巷道");
     //                if (string.IsNullOrEmpty(res.TunnelNum)) throw new WarnException($"WMS未返回巷道");
     //                var tunnelNo = res.TunnelNum.Split(',').Select(v => "TY" + v).ToList();
     //                var tunnelNo = res.TunnelNum.Split(',').Select(v => "TY" + v).ToList();
@@ -212,7 +307,7 @@ namespace WCS.Service.Works.Station
     //                    if (putStation == null) continue;
     //                    if (putStation == null) continue;
     //                    var taskInStation = Device.Where(p => p.CODE.StartsWith("G") && p.DEVICEGROUP.Any(d => d.MEMBER == putStation.Entity)).OrderBy(p => p.CODE).FirstOrDefault();
     //                    var taskInStation = Device.Where(p => p.CODE.StartsWith("G") && p.DEVICEGROUP.Any(d => d.MEMBER == putStation.Entity)).OrderBy(p => p.CODE).FirstOrDefault();
     //                    //RGV是否有正在前往这个地址的任务
     //                    //RGV是否有正在前往这个地址的任务
-    //                    var rgv8 = Device.Find(RGV8).Create<RGVDevice>();
+    //                    var rgv8 = Device.Find("RGV8").Create<RGVDevice>();
     //                    if (!rgv8.Data2.SystemStatus.HasFlag(WCS.Entity.Protocol.RGV.RGVRunStatus.空闲)
     //                    if (!rgv8.Data2.SystemStatus.HasFlag(WCS.Entity.Protocol.RGV.RGVRunStatus.空闲)
     //                      && !rgv8.Data2.WorkMode.HasFlag(WCS.Entity.Protocol.RGV.RGVMode.自动)
     //                      && !rgv8.Data2.WorkMode.HasFlag(WCS.Entity.Protocol.RGV.RGVMode.自动)
     //                      && rgv8.Data2.DestPosition_1 == taskInStation.CODE.Replace("G", "").ToShort()) continue;
     //                      && rgv8.Data2.DestPosition_1 == taskInStation.CODE.Replace("G", "").ToShort()) continue;
@@ -259,101 +354,6 @@ namespace WCS.Service.Works.Station
     //    }
     //    }
     //}
     //}
 
 
-    [WorkTitle(typeof(ProductHandler), "一楼分配巷道")]
-    internal class 巷道分配 : Work<StationDeviceGroup>
-    {
-        protected override bool SelectDevice(WCS_DEVICE dev)
-        {
-            return dev.CODE == "G1030";
-        }
-
-        protected override void Do(StationDeviceGroup obj)
-        {
-            obj.EX(obj =>
-            {
-                var code = obj.Entity.CODE;
-                //两个设备都必须满足的条件
-                if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) return;
-                if (obj.Items.Any(v => !v.Data2.Status.HasFlag(IstationStatus.光电状态))) return;
-                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) return;
-
-                //成功分配巷道的任务的任务
-                var finishTaskList = new List<Tuple<int, StationDevice>>();
-
-                DB.Do(db =>
-                {
-                    var taskIds = obj.Items.Select(v => v.Data2.Tasknum > 10000 && 5);
-                    var tasks = db.Default.Set<WCS_TASK>().Where(p => taskIds.Any(v => v == p.ID)).ToList();
-
-                    var res = WMS.GetTunnelList(tasks.Select(v => v.WMSTASK.ToString()).ToList(), code);
-                    if (string.IsNullOrEmpty(res.TunnelNum)) throw new WarnException($"WMS未返回巷道");
-                    var tunnelNo = res.TunnelNum.Split(',').Select(v => "TY" + v).ToList();
-
-                    var tunnels = Device.Where(v => tunnelNo.Contains(v.CODE)).ToList();
-
-                    List<TunnelInfo> tunnelInfos = new List<TunnelInfo>();
-                    foreach (var item in tunnels)
-                    {
-                        //当前巷道的取货点
-                        var allIn = Device.Where(v => v.Is(DF.SRM二级品取货)) //一楼所有取货点
-                                          .Where(v => v.ROUTES.Any(p => p.NEXT == item)) //下一个点为当前巷道的取货点
-                                          .Select(v => v.CODE)
-                                          .ToList();
-                        var putStation = Device.Where(v => v.IsConv() && v.ROUTES.Any(p => p.NEXT != null && allIn.Contains(p.NEXT.CODE))) //下一个目标地址包含取货点的设备
-                                      .Select(v => v.Create<StationDevice>()) //取所有可以到达取货点设备的信息
-                                      .Where(v => !v.Data3.Status.HasFlag(StationStatus.运行状态位) && !v.Data2.Status.HasFlag(IstationStatus.光电状态) && v.Data2.Tasknum < 10000)//筛选出空闲的路径点,此处因输送机都是一个动力,因此可以先找路径点再找设备组
-                                      .Distinct()
-                                      .FirstOrDefault();//去一次重
-                        if (putStation == null) continue;
-                        var taskInStation = Device.Where(p => p.CODE.StartsWith("G") && p.DEVICEGROUP.Any(d => d.MEMBER == putStation.Entity)).OrderBy(p => p.CODE).FirstOrDefault();
-                        //RGV是否有正在前往这个地址的任务
-                        var rgv8 = Device.Find("RGV8").Create<RGVDevice>();
-                        if (!rgv8.Data2.SystemStatus.HasFlag(WCS.Entity.Protocol.RGV.RGVRunStatus.空闲)
-                          && !rgv8.Data2.WorkMode.HasFlag(WCS.Entity.Protocol.RGV.RGVMode.自动)
-                          && rgv8.Data2.DestPosition_1 == taskInStation.CODE.Replace("G", "").ToShort()) continue;
-                        tunnelInfos.Add(new TunnelInfo
-                        {
-                            Tunnel = item,
-                            taskIN = taskInStation, //找到放货点设备所在组
-                            SRM = Device.Where(p => p.IsSC()).FirstOrDefault(p => item.ROUTES.Any(d => d.NEXT.CODE == p.CODE)).Create<SRMDevice>()
-                        });
-                    }
-                    //筛选出优先级最高的可用巷道
-                    var tunnelInfo = tunnelInfos.Where(v => { try { return v.SRM.Data3.SCAlarm == 0 && v.SRM.Data2.SRMMode == SCMode.远程 && v.SRM.Data2.SRMStatus == SCRunStatus.空闲; } catch { return false; } })
-                                                .Where(v => !db.Default.Set<WCS_TASK>().Any(p => p.Priority > 0 && p.DEVICE == v.SRM.Entity.CODE && p.STATUS < TaskStatus.堆垛机完成))
-                                                .OrderBy(v => tunnelNo.IndexOf(v.Tunnel.CODE)).FirstOrDefault();
-                    if (tunnelInfo == null) throw new WarnException("无可用巷道");
-
-                    //开始向设备中写入任务信息
-                    foreach (var item in devs)
-                    {
-                        var dev = Device.Find(item.Entity.CODE).Create<StationDevice>();
-                        var task = tasks.FirstOrDefault(p => p.ID == dev.Data2.Tasknum);
-                        if (task == null) throw new WarnException($"WCS无该任务{dev.Data2.Tasknum}--{dev.Entity.CODE}");
-
-                        task.DEVICE = tunnelInfo.SRM.Entity.CODE;
-                        task.TUNNEL = tunnelInfo.Tunnel.CODE;
-                        task.ADDRNEXT = tunnelInfo.taskIN.CODE;
-                        task.TaskGroupKey = res.WMSTaskGroupKey;
-                        task.ADDRTO = task.DEVICE;
-                        db.Default.SaveChanges();
-
-                        var msg = $"下达从{Conv_1030}移动至{dev.Data.Goodsend}的PLC指令。同时将任务分配至[{ task.TUNNEL }]-[{task.DEVICE}]";
-                        msg += $"[{dev.Data.Tasknum}][{Conv_1030}][{dev.Data.Goodsend}][{tunnelInfo.SRM.Entity.CODE}][{dev.Data.VoucherNo}[{dev.Data2.VoucherNo}]";
-
-                        task.CreateStatusLog(db, msg, this.GetType());
-
-                        dev.Data.Tasknum = task.ID;
-                        dev.Data.Goodsstart = Conv_1030.ToShort();
-                        dev.Data.Goodsend = tunnelInfo.taskIN.CODE.Replace("G", "").ToShort();
-                        dev.Data.CmdType = IstationCmdType.分配目标地址;
-                        dev.Data.VoucherNo++;
-                    }
-                });
-            });
-        }
-    }
-
     [WorkTitle(typeof(ProductHandler), "一楼RGV放货结束分配目标地址")]
     [WorkTitle(typeof(ProductHandler), "一楼RGV放货结束分配目标地址")]
     internal class 一楼RGV放货结束分配目标地址 : DeviceWork<StationDevice>
     internal class 一楼RGV放货结束分配目标地址 : DeviceWork<StationDevice>
     {
     {