|
@@ -347,7 +347,7 @@ namespace WCS.Service.Works.RGV
|
|
|
//是否需要取货
|
|
|
if (devs != null && devs.Count() > 0)
|
|
|
{
|
|
|
- if (devs.Count!= devs[0].Data2.Goodsnum) throw new WarnException($"取货位货物数量不一致");
|
|
|
+ if (devs.Count != devs[0].Data2.Goodsnum) throw new WarnException($"取货位货物数量不一致");
|
|
|
if (obj.Data2.TaskType_1 != RGVTaskType.移动) throw new WarnException($"RGV正在执行{obj.Data2.TaskType_1}");
|
|
|
if (obj.Data2.Status_1.HasFlag(WCS.Entity.Protocol.RGVStatus.光电)) throw new WarnException("RGV有光电,无法取货,请检查实际情况");
|
|
|
if (!obj.Data2.Status_1.HasFlag(WCS.Entity.Protocol.RGVStatus.RGV到站)) throw new WarnException("RGV无到站状态,请检查RGV实际状态");
|
|
@@ -409,7 +409,9 @@ namespace WCS.Service.Works.RGV
|
|
|
if (obj.Data2.WorkMode != RGVMode.自动) throw new WarnException($"RGV状态{obj.Data2.WorkMode},无法分配巷道");
|
|
|
if (obj.Data2.SystemStatus != RGVRunStatus.空闲) throw new WarnException($"rgv状态为{obj.Data2.SystemStatus},无法分配巷道");
|
|
|
if (!obj.Data2.Status_1.HasFlag(WCS.Entity.Protocol.RGVStatus.光电)) throw new WarnException("RGV无光电,无法分配巷道");
|
|
|
+
|
|
|
#region 开始分配巷道
|
|
|
+
|
|
|
var taskIds = new List<int>() { obj.Data2.TaskID_1, obj.Data2.TaskID_2 };
|
|
|
taskIds = taskIds.Where(v => v > 10000).ToList(); //筛选出有效的任务
|
|
|
|
|
@@ -428,55 +430,80 @@ namespace WCS.Service.Works.RGV
|
|
|
|
|
|
foreach (var item in tunnels)
|
|
|
{
|
|
|
- //当前巷道的取货点
|
|
|
- var allIn = Device.Where(v => v.Is(DF.SRMBOPP取货))
|
|
|
- .Where(v => v.ROUTES.Any(p => p.NEXT == item)) //下一个点为当前巷道的取货点
|
|
|
- .Select(v => v.CODE)
|
|
|
- .ToList();
|
|
|
- //下一个目标地址包含取货点的设备,此时获得的数据是旋转台
|
|
|
- var turntable = Device.Where(v => v.IsConv() && v.ROUTES.Any(p => p.NEXT != null && allIn.Contains(p.NEXT.CODE))).Select(v => v.CODE);
|
|
|
//获得RGV的交货点
|
|
|
- StationDevice rgvDeliveryPoint = null;
|
|
|
+ StationDeviceGroup rgvDeliveryPoint = null;
|
|
|
if (item.CODE == "TY1")
|
|
|
{
|
|
|
- rgvDeliveryPoint = Device.Where(v => v.IsConv() && v.ROUTES.Any(p => p.NEXT != null && turntable.Contains(p.NEXT.CODE)))
|
|
|
- .Select(v => v.Create<StationDevice>()) //取所有可以到达取货点设备的信息
|
|
|
- .Where(v => v.Data3.Status.HasFlag(StationStatus.自动))//筛选出空闲的路径点,此处因输送机都是一个动力,因此可以先找路径点再找设备组
|
|
|
- .Distinct()
|
|
|
- .FirstOrDefault();//去一次重
|
|
|
+ var deviceGroup = Device.Find("G16").Create<StationDeviceGroup>();
|
|
|
+ if (deviceGroup.Items.Count(v => v.Data3.Status.HasFlag(StationStatus.自动)) == 2) //设备组中两个设备都是自动状态时表示当前设备可用
|
|
|
+ {
|
|
|
+ rgvDeliveryPoint = deviceGroup;
|
|
|
+ }
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- rgvDeliveryPoint = Device.Where(v => v.IsConv() && v.ROUTES.Any(p => p.NEXT != null && turntable.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
|
|
|
- && v.Data3.Status.HasFlag(StationStatus.自动))//筛选出空闲的路径点,此处因输送机都是一个动力,因此可以先找路径点再找设备组
|
|
|
- .Distinct()
|
|
|
- .FirstOrDefault();//去一次重
|
|
|
+ StationDeviceGroup deviceGroup = null;
|
|
|
+
|
|
|
+ #region 根据巷道获取放货设备组编号
|
|
|
+
|
|
|
+ if (item.CODE == "TY2")
|
|
|
+ {
|
|
|
+ deviceGroup = Device.Find("G15").Create<StationDeviceGroup>();
|
|
|
+ }
|
|
|
+ else if (item.CODE is "TY3" or "TY4")
|
|
|
+ {
|
|
|
+ deviceGroup = Device.Find("G14").Create<StationDeviceGroup>();
|
|
|
+ }
|
|
|
+ else if (item.CODE is "TY5" or "TY6")
|
|
|
+ {
|
|
|
+ deviceGroup = Device.Find("G13").Create<StationDeviceGroup>();
|
|
|
+ }
|
|
|
+ else if (item.CODE is "TY7" or "TY8")
|
|
|
+ {
|
|
|
+ deviceGroup = Device.Find("G12").Create<StationDeviceGroup>();
|
|
|
+ }
|
|
|
+
|
|
|
+ #endregion 根据巷道获取放货设备组编号
|
|
|
+
|
|
|
+ if (deviceGroup != null && deviceGroup.Items.Count(v => !v.Data3.Status.HasFlag(StationStatus.运行状态位)
|
|
|
+ && !v.Data2.Status.HasFlag(IstationStatus.光电状态)
|
|
|
+ && v.Data2.Tasknum < 10000
|
|
|
+ && v.Data3.Status.HasFlag(StationStatus.自动)) == 2) // 设备组中两个设备都可用
|
|
|
+ {
|
|
|
+ rgvDeliveryPoint = deviceGroup;
|
|
|
+ }
|
|
|
}
|
|
|
if (rgvDeliveryPoint == null) continue;
|
|
|
- var taskInStation = Device.Where(p => p.CODE.StartsWith("G") && p.DEVICEGROUP.Any(d => d.MEMBER == rgvDeliveryPoint.Entity)).MinBy(p => p.CODE);
|
|
|
+
|
|
|
//只能有一组任务的下一个地址是交货点
|
|
|
- if (db.Default.Set<WCS_TASK>().Any(v => v.ADDRNEXT == taskInStation.CODE && v.STATUS < TaskStatus.已完成)) continue;
|
|
|
+ if (db.Default.Set<WCS_TASK>().Any(v => v.ADDRNEXT == rgvDeliveryPoint.Entity.CODE && v.STATUS < TaskStatus.已完成)) continue;
|
|
|
//RGV是否有正在前往这个地址的任务
|
|
|
var rgvList = Device.Where(v => v.Is(DF.BOPPRGV)).Select(v => v.Create<RGVDevice>());
|
|
|
|
|
|
var rgvTaskCount = ProtocolProxy.YGWMS150Redis.Get("BoppRgvTaskCount").ToInt();
|
|
|
if (rgvList.Count(v => (!v.Data2.SystemStatus.HasFlag(WCS.Entity.Protocol.RGV.RGVRunStatus.空闲) || !v.Data2.WorkMode.HasFlag(WCS.Entity.Protocol.RGV.RGVMode.自动))
|
|
|
- && v.Data2.TaskType_1 == WCS.Entity.Protocol.RGV.RGVTaskType.放货
|
|
|
- && v.Data2.DestPosition_1 == taskInStation?.CODE.Replace("G", "").ToShort()) > rgvTaskCount) continue;
|
|
|
+ && v.Data2.TaskType_1 == WCS.Entity.Protocol.RGV.RGVTaskType.放货
|
|
|
+ && v.Data2.DestPosition_1 == rgvDeliveryPoint.Entity.CODE.Replace("G", "").ToShort()) >= rgvTaskCount) continue;
|
|
|
tunnelInfos.Add(new TunnelInfo
|
|
|
{
|
|
|
Tunnel = item,
|
|
|
- taskIN = taskInStation, //找到放货点设备所在组
|
|
|
+ taskIN = rgvDeliveryPoint.Entity, //找到放货点设备所在组
|
|
|
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.Entity.CODE == "SRM1"; } catch { return false; } }).MinBy(v => tunnelNo.IndexOf(v.Tunnel.CODE));
|
|
|
+ var tunnelInfo = tunnelInfos.Where(v =>
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ return (v.SRM.Data3.SCAlarm == 0 && v.SRM.Data2.SRMMode == SCMode.远程) || v.SRM.Entity.CODE == "SRM1";
|
|
|
+ }
|
|
|
+ catch
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }).MinBy(v => tunnelNo.IndexOf(v.Tunnel.CODE));
|
|
|
|
|
|
if (tunnelInfo == null) throw new WarnException("无可用巷道");
|
|
|
|
|
@@ -499,10 +526,9 @@ namespace WCS.Service.Works.RGV
|
|
|
obj.Data.TaskType_1 = RGVTaskType.放货;
|
|
|
obj.Data.DestPosition_1 = tunnelInfo.taskIN.CODE.Replace("G", "").ToShort();
|
|
|
obj.Data.Trigger_1++;
|
|
|
-
|
|
|
});
|
|
|
|
|
|
- #endregion
|
|
|
+ #endregion 开始分配巷道
|
|
|
}
|
|
|
|
|
|
#endregion 上一个任务为移动
|