|
@@ -160,6 +160,146 @@ namespace WCS.WorkEngineering.Systems
|
|
|
});
|
|
|
if (isDP) //直接码垛
|
|
|
{
|
|
|
+ //获取当前机械臂所有的取货站台
|
|
|
+ var pickUpDevices = obj.Entity.Sources.Where(x => x.HasFlag(DeviceFlags.输送机)).Where(x => x.DeviceGroup.Any()).Select(
|
|
|
+ x =>
|
|
|
+ {
|
|
|
+ var group = x.DeviceGroup.Select(s => new Device<IStation523, IStation524>(s, World)).ToList();
|
|
|
+ return new Tuple<Device<IStation523, IStation524>, List<Device<IStation523, IStation524>>>(new Device<IStation523, IStation524>(x, World), group);
|
|
|
+ }).ToList();
|
|
|
+
|
|
|
+ if (!pickUpDevices.Any()) throw new KnownException($"机械臂{obj.Entity.Code}无取货路径点", LogLevelEnum.High);
|
|
|
+
|
|
|
+ //获取取货设备的设备组中都是停止运行的
|
|
|
+ var arrIn = pickUpDevices.Where(x => x.Item2.All(a => !a.Data.Status.HasFlag(StationStatus.Run)))
|
|
|
+ .Where(x =>
|
|
|
+ {
|
|
|
+ var inStock = x.Item2.Any(a => a.Data2.TaskNumber > 0 && a.Data.Status.HasFlag(StationStatus.PH_Status));
|
|
|
+ var minDevice = x.Item2.OrderBy(o => o.Entity.Code.ToShort()).First();
|
|
|
+ return minDevice.Data2.TaskNumber > 0 && minDevice.Data.Status.HasFlag(StationStatus.PH_Status) && minDevice.Data2.CmdType.HasFlag(StationCmd.Res7) && inStock;
|
|
|
+ }).ToList();
|
|
|
+ //.OrderBy(x => x.Item1.Data2.TaskNumber)
|
|
|
+
|
|
|
+ if (!arrIn.Any())
|
|
|
+ {
|
|
|
+ World.Log($"[{obj.Entity.Code}]等待入库任务输送到位");
|
|
|
+ obj.Entity.SetFlag("InQuantity", inMaxQuantity + 100); //在无货物的情况下,只检查一次,下次直接查询是否有出库任务,避免无效检查周期的产生
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ //先按可取货位数量排序,再按任务号排序
|
|
|
+ var devGroup = arrIn.OrderByDescending(x => x.Item2.Count(i => i.Data2.TaskNumber > 0 && i.Data.Status.HasFlag(StationStatus.PH_Status)))
|
|
|
+ .ThenByDescending(x =>
|
|
|
+ {
|
|
|
+ int number;
|
|
|
+ List<Device<IStation523, IStation524>> devices = new List<Device<IStation523, IStation524>>();
|
|
|
+ var deviceCodes = GetDeviceCodeList(x.Item1.Entity.Code);
|
|
|
+ devices = Device.All.Where(x => deviceCodes.Contains(x.Code)).Select(x => new Device<IStation523, IStation524>(x, World)).ToList();
|
|
|
+ number = devices.Count(x => x.Data2.TaskNumber > 0 && x.Data.Status.HasFlag(StationStatus.PH_Status) && !x.Data.Status.HasFlag(StationStatus.Run));
|
|
|
+ return number;
|
|
|
+ }).First().Item2
|
|
|
+ .Where(x => x.Data2.TaskNumber > 0 && x.Data.Status.HasFlag(StationStatus.PH_Status));
|
|
|
+
|
|
|
+ var taskList = new List<Tuple<WCS_TaskInfo, Device<IStation523, IStation524>>>();
|
|
|
+ SqlSugarHelper.Do(db =>
|
|
|
+ {
|
|
|
+ foreach (var dev in devGroup)
|
|
|
+ {
|
|
|
+ var task = db.Default.Queryable<WCS_TaskInfo>().First(v => v.Type == TaskType.SetPlate && v.Status == Entity.TaskStatus.FinishOfShunt && dev.Data2.TaskNumber == v.ID);
|
|
|
+ if (task == null) continue;
|
|
|
+
|
|
|
+ task.Status = Entity.TaskStatus.StackerExecution;
|
|
|
+ task.LastInteractionPoint = dev.Entity.Code;
|
|
|
+ task.SrmStation = dev.Entity.Code;
|
|
|
+ task.Device = obj.Entity.Code;
|
|
|
+ task.EditWho = "WCS";
|
|
|
+ db.Default.UpdateableRowLock(task).UpdateColumns(x => new { x.Status, x.AddrTo, x.Line, x.Col, x.Layer, x.Depth, x.LastInteractionPoint, x.SrmStation, x.Device, x.EditWho }).ExecuteCommand();
|
|
|
+ task.AddWCS_TASK_DTL(db.Default, dev.Entity.Code, task.AddrTo, "任务下发机械臂执行");
|
|
|
+ taskList.Add(new(task, dev));
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ if (!taskList.Any()) return;
|
|
|
+
|
|
|
+ switch (taskList.Count)
|
|
|
+ {
|
|
|
+ case 1:
|
|
|
+ var task = taskList.FirstOrDefault().Item1;
|
|
|
+ var dev = taskList.FirstOrDefault().Item2;
|
|
|
+ //下发任务
|
|
|
+ obj.Data.TaskNumber1 = task.ID;
|
|
|
+ obj.Data.SLine1 = dev.Entity.Code.ToShort();
|
|
|
+ obj.Data.SCol1 = 0;
|
|
|
+ obj.Data.SLayer1 = 0;
|
|
|
+ obj.Data.SDepth1 = 0;
|
|
|
+ obj.Data.ELine1 = task.Line.ToShort();
|
|
|
+ obj.Data.ECol1 = task.Col.ToShort();
|
|
|
+ obj.Data.ELayer1 = task.Layer.ToShort();
|
|
|
+ obj.Data.EDepth1 = task.Depth.ToShort();
|
|
|
+ obj.Data.TaskNumber2 = 0;
|
|
|
+ obj.Data.SLine2 = 0;
|
|
|
+ obj.Data.SCol2 = 0;
|
|
|
+ obj.Data.SLayer2 = 0;
|
|
|
+ obj.Data.SDepth2 = 0;
|
|
|
+ obj.Data.ELine2 = 0;
|
|
|
+ obj.Data.ECol2 = 0;
|
|
|
+ obj.Data.ELayer2 = 0;
|
|
|
+ obj.Data.EDepth2 = 0;
|
|
|
+ obj.Data.TaskSum = taskList.Count.ToShort();
|
|
|
+ obj.Data.GoodsType = task.GoodsType switch
|
|
|
+ {
|
|
|
+ 18 => 1,
|
|
|
+ 34 => 2,
|
|
|
+ 50 => 3,
|
|
|
+ _ => 0
|
|
|
+ };
|
|
|
+ obj.Data.TaskType = 3;
|
|
|
+ obj.Data.VoucherNo++;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 2:
|
|
|
+ taskList = taskList.OrderBy(x => x.Item1.Depth).ToList();
|
|
|
+ //一工位取深度较大的任务
|
|
|
+ var taskInfo = taskList[1];
|
|
|
+ task = taskInfo.Item1;
|
|
|
+ dev = taskInfo.Item2;
|
|
|
+ obj.Data.TaskNumber1 = task.ID;
|
|
|
+ obj.Data.SLine1 = dev.Entity.Code.ToShort();
|
|
|
+ obj.Data.SCol1 = 0;
|
|
|
+ obj.Data.SLayer1 = 0;
|
|
|
+ obj.Data.SDepth1 = 0;
|
|
|
+ obj.Data.ELine1 = task.Line.ToShort();
|
|
|
+ obj.Data.ECol1 = task.Col.ToShort();
|
|
|
+ obj.Data.ELayer1 = task.Layer.ToShort();
|
|
|
+ obj.Data.EDepth1 = task.Depth.ToShort();
|
|
|
+ //二工位取深度较少的值
|
|
|
+ taskInfo = taskList[0];
|
|
|
+ task = taskInfo.Item1;
|
|
|
+ dev = taskInfo.Item2;
|
|
|
+ obj.Data.TaskNumber2 = task.ID;
|
|
|
+ obj.Data.SLine2 = dev.Entity.Code.ToShort();
|
|
|
+ obj.Data.SCol2 = 0;
|
|
|
+ obj.Data.SLayer2 = 0;
|
|
|
+ obj.Data.SDepth2 = 0;
|
|
|
+ obj.Data.ELine2 = task.Line.ToShort();
|
|
|
+ obj.Data.ECol2 = task.Col.ToShort();
|
|
|
+ obj.Data.ELayer2 = task.Layer.ToShort();
|
|
|
+ obj.Data.EDepth2 = task.Depth.ToShort();
|
|
|
+ obj.Data.TaskSum = taskList.Count.ToShort();
|
|
|
+ obj.Data.GoodsType = task.GoodsType switch
|
|
|
+ {
|
|
|
+ 18 => 1,
|
|
|
+ 34 => 2,
|
|
|
+ 50 => 3,
|
|
|
+ _ => 0
|
|
|
+ };
|
|
|
+ obj.Data.TaskType = 3;
|
|
|
+ obj.Data.VoucherNo++;
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ throw new KnownException($"无法执行多个任务", LogLevelEnum.Mid);
|
|
|
+ }
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -262,10 +402,10 @@ namespace WCS.WorkEngineering.Systems
|
|
|
obj.Data.SCol1 = 0;
|
|
|
obj.Data.SLayer1 = 0;
|
|
|
obj.Data.SDepth1 = 0;
|
|
|
- obj.Data.ELine1 = task.Line.ToShort();
|
|
|
- obj.Data.ECol1 = task.Col.ToShort();
|
|
|
- obj.Data.ELayer1 = task.Layer.ToShort();
|
|
|
- obj.Data.EDepth1 = task.Depth.ToShort();
|
|
|
+ obj.Data.ELine1 = task.AddrTo.ToShort();
|
|
|
+ obj.Data.ECol1 = task.WmsTask.ToShort();
|
|
|
+ obj.Data.ELayer1 = 0;
|
|
|
+ obj.Data.EDepth1 = 0;
|
|
|
obj.Data.TaskNumber2 = 0;
|
|
|
obj.Data.SLine2 = 0;
|
|
|
obj.Data.SCol2 = 0;
|
|
@@ -288,7 +428,10 @@ namespace WCS.WorkEngineering.Systems
|
|
|
break;
|
|
|
|
|
|
case 2:
|
|
|
- taskList = taskList.OrderBy(x => x.Item1.Depth).ToList();
|
|
|
+
|
|
|
+ taskList = taskList.OrderByDescending(x => x.Item2.Entity.Code.ToInt()).ToList();
|
|
|
+ var maxWmsTask = taskList.Max(x => x.Item1.WmsTask).ToShort();
|
|
|
+ var minWmsTask = taskList.Min(x => x.Item1.WmsTask).ToShort();
|
|
|
//一工位取深度较大的任务
|
|
|
var taskInfo = taskList[1];
|
|
|
task = taskInfo.Item1;
|
|
@@ -298,10 +441,10 @@ namespace WCS.WorkEngineering.Systems
|
|
|
obj.Data.SCol1 = 0;
|
|
|
obj.Data.SLayer1 = 0;
|
|
|
obj.Data.SDepth1 = 0;
|
|
|
- obj.Data.ELine1 = task.Line.ToShort();
|
|
|
- obj.Data.ECol1 = task.Col.ToShort();
|
|
|
- obj.Data.ELayer1 = task.Layer.ToShort();
|
|
|
- obj.Data.EDepth1 = task.Depth.ToShort();
|
|
|
+ obj.Data.ELine1 = task.AddrTo.ToShort();
|
|
|
+ obj.Data.ECol1 = task.WarehouseCode.Contains("N") ? minWmsTask : maxWmsTask;
|
|
|
+ obj.Data.ELayer1 = 0;
|
|
|
+ obj.Data.EDepth1 = 0;
|
|
|
//二工位取深度较少的值
|
|
|
taskInfo = taskList[0];
|
|
|
task = taskInfo.Item1;
|
|
@@ -311,10 +454,10 @@ namespace WCS.WorkEngineering.Systems
|
|
|
obj.Data.SCol2 = 0;
|
|
|
obj.Data.SLayer2 = 0;
|
|
|
obj.Data.SDepth2 = 0;
|
|
|
- obj.Data.ELine2 = task.Line.ToShort();
|
|
|
- obj.Data.ECol2 = task.Col.ToShort();
|
|
|
- obj.Data.ELayer2 = task.Layer.ToShort();
|
|
|
- obj.Data.EDepth2 = task.Depth.ToShort();
|
|
|
+ obj.Data.ELine2 = task.AddrTo.ToShort();
|
|
|
+ obj.Data.ECol2 = task.WarehouseCode.Contains("N") ? maxWmsTask : minWmsTask;
|
|
|
+ obj.Data.ELayer2 = 0;
|
|
|
+ obj.Data.EDepth2 = 0;
|
|
|
obj.Data.TaskSum = taskList.Count.ToShort();
|
|
|
obj.Data.GoodsType = task.GoodsType switch
|
|
|
{
|