|
@@ -1,7 +1,7 @@
|
|
|
-using PlcSiemens.Core.Extension;
|
|
|
+using Newtonsoft.Json;
|
|
|
+using PlcSiemens.Core.Extension;
|
|
|
using ServiceCenter.Extensions;
|
|
|
using ServiceCenter.Logs;
|
|
|
-using ServiceCenter.Redis;
|
|
|
using ServiceCenter.SqlSugars;
|
|
|
using System.ComponentModel;
|
|
|
using WCS.Core;
|
|
@@ -31,185 +31,197 @@ namespace WCS.WorkEngineering.Systems
|
|
|
|
|
|
public override void Do(Device<IStation520> obj)
|
|
|
{
|
|
|
- RedisHub.Do(obj.Entity.Code, redis =>
|
|
|
+ var taskInfos = new List<int>();
|
|
|
+ World.Log($"进入处理");
|
|
|
+ SqlSugarHelper.Do(db =>
|
|
|
{
|
|
|
- var taskInfos = new List<WCS_TaskInfo>();
|
|
|
- SqlSugarHelper.Do(db =>
|
|
|
- {
|
|
|
- //获取所有的新建任务,组盘任务不需要
|
|
|
- taskInfos = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.Status == Entity.TaskStatus.NewBuild && !(t.Type == TaskType.SetPlate && t.AddrFrom == "Robot")).ToList();
|
|
|
- });
|
|
|
- if (!taskInfos.Any()) return;
|
|
|
- foreach (var item in taskInfos)
|
|
|
+ //获取所有的新建任务,组盘任务不需要
|
|
|
+ World.Log($"开始查询新建任务");
|
|
|
+ //taskInfos = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.Status == Entity.TaskStatus.NewBuild && !(t.Type == TaskType.SetPlate && t.AddrFrom == "Robot")).Select(x => x.ID).ToList();
|
|
|
+ taskInfos = db.Default.Queryable<WCS_TaskInfo>().Where(x => x.Status == 0).ToList().Where(x => x.Type != TaskType.SetPlate || (x.Type == TaskType.SetPlate && x.AddrFrom != "Robot")).Select(x => x.ID).ToList();
|
|
|
+ World.Log($"查询结束");
|
|
|
+ });
|
|
|
+ if (!taskInfos.Any())
|
|
|
+ {
|
|
|
+ World.Log($"无可用执行任务");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ World.Log($"准备更新任务:{JsonConvert.SerializeObject(taskInfos)}");
|
|
|
+ foreach (var item in taskInfos)
|
|
|
+ {
|
|
|
+ try
|
|
|
{
|
|
|
- try
|
|
|
+ SqlSugarHelper.Do(db =>
|
|
|
{
|
|
|
- SqlSugarHelper.Do(db =>
|
|
|
+ //Console.WriteLine($"开始处理任务{item}");
|
|
|
+ var task = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.ID == item).First() ?? throw new Exception($"未找到对应的WCS任务[{item}]");
|
|
|
+ switch (task.Type)
|
|
|
{
|
|
|
- var task = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.ID == item.ID).First() ?? throw new Exception($"未找到对应的WCS任务[{item.ID}]");
|
|
|
- switch (task.Type)
|
|
|
- {
|
|
|
- case TaskType.SetPlate:
|
|
|
- if (task.AddrFrom != "Robot")
|
|
|
- {
|
|
|
- //更新任务状态
|
|
|
- task.Status = TaskStatus.WaitingToExecute;
|
|
|
- db.Default.Updateable(task).ExecuteCommand();
|
|
|
- task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化入库任务信息");
|
|
|
- }
|
|
|
- break;
|
|
|
-
|
|
|
- case TaskType.EnterDepot:
|
|
|
+ case TaskType.SetPlate:
|
|
|
+ if (task.AddrFrom != "Robot")
|
|
|
+ {
|
|
|
//更新任务状态
|
|
|
- task.Status = Entity.TaskStatus.WaitingToExecute;
|
|
|
- task.Device = task.WarehouseCode switch
|
|
|
- {
|
|
|
- "1N" => "SRM1",
|
|
|
- "1S" => "SRM2",
|
|
|
- "2N" => "SRM3",
|
|
|
- "2S" => "SRM4",
|
|
|
- "3N" => "SRM5",
|
|
|
- "3S" => "SRM6",
|
|
|
- _ => task.Device
|
|
|
- };
|
|
|
-
|
|
|
- task.Device = task.AddrFrom switch
|
|
|
- {
|
|
|
- "1666" or "1661" => "SRM1",
|
|
|
- "1681" or "1676" => "SRM2",
|
|
|
- "1696" or "1691" => "SRM3",
|
|
|
- "1711" or "1706" => "SRM4",
|
|
|
- "1726" or "1721" => "SRM5",
|
|
|
- "1741" or "1736" => "SRM6",
|
|
|
- _ => task.Device
|
|
|
- };
|
|
|
-
|
|
|
- //计算下一个地址
|
|
|
- var path1 = DevicePath.GetPath(task.AddrFrom, task.Device);
|
|
|
- task.AddrNext = path1.Points[1].Code;
|
|
|
- task.SrmStation = task.BarCode.Contains("TPA") || task.BarCode.Contains("TPB") ? task.AddrFrom : path1.Points[2].Code;
|
|
|
-
|
|
|
+ task.Status = TaskStatus.WaitingToExecute;
|
|
|
+ World.Log($"准备更新任务:{task.ID}");
|
|
|
db.Default.Updateable(task).ExecuteCommand();
|
|
|
+ World.Log($"更新任务:{task.ID}");
|
|
|
task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化入库任务信息");
|
|
|
- break;
|
|
|
-
|
|
|
- case TaskType.OutDepot:
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case TaskType.EnterDepot:
|
|
|
+ //更新任务状态
|
|
|
+ task.Status = Entity.TaskStatus.WaitingToExecute;
|
|
|
+ task.Device = task.WarehouseCode switch
|
|
|
+ {
|
|
|
+ "1N" => "SRM1",
|
|
|
+ "1S" => "SRM2",
|
|
|
+ "2N" => "SRM3",
|
|
|
+ "2S" => "SRM4",
|
|
|
+ "3N" => "SRM5",
|
|
|
+ "3S" => "SRM6",
|
|
|
+ _ => task.Device
|
|
|
+ };
|
|
|
+
|
|
|
+ task.Device = task.AddrFrom switch
|
|
|
+ {
|
|
|
+ "1666" or "1661" => "SRM1",
|
|
|
+ "1681" or "1676" => "SRM2",
|
|
|
+ "1696" or "1691" => "SRM3",
|
|
|
+ "1711" or "1706" => "SRM4",
|
|
|
+ "1726" or "1721" => "SRM5",
|
|
|
+ "1741" or "1736" => "SRM6",
|
|
|
+ _ => task.Device
|
|
|
+ };
|
|
|
+
|
|
|
+ //计算下一个地址
|
|
|
+ var path1 = DevicePath.GetPath(task.AddrFrom, task.Device);
|
|
|
+ task.AddrNext = path1.Points[1].Code;
|
|
|
+ task.SrmStation = task.BarCode.Contains("TPA") || task.BarCode.Contains("TPB") ? task.AddrFrom : path1.Points[2].Code;
|
|
|
+
|
|
|
+ db.Default.Updateable(task).ExecuteCommand();
|
|
|
+ task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化入库任务信息");
|
|
|
+ break;
|
|
|
+
|
|
|
+ case TaskType.OutDepot:
|
|
|
+ {
|
|
|
+ if (task.Device.Contains("Robot"))
|
|
|
{
|
|
|
- if (task.Device.Contains("Robot"))
|
|
|
- {
|
|
|
- var pos = task.AddrFrom.Split("-");
|
|
|
- task.Status = Entity.TaskStatus.WaitingToExecute;
|
|
|
- task.Line = pos[0].ToShort();
|
|
|
- task.Col = pos[1].ToShort();
|
|
|
- task.Layer = pos[2].ToShort();
|
|
|
- task.Depth = pos[3].ToShort();
|
|
|
- db.Default.Updateable(task).ExecuteCommand();
|
|
|
- task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化出库任务信息,放货站台:{task.SrmStation}");
|
|
|
- }
|
|
|
- else
|
|
|
+ var pos = task.AddrFrom.Split("-");
|
|
|
+ task.Status = Entity.TaskStatus.WaitingToExecute;
|
|
|
+ task.Line = pos[0].ToShort();
|
|
|
+ task.Col = pos[1].ToShort();
|
|
|
+ task.Layer = pos[2].ToShort();
|
|
|
+ task.Depth = pos[3].ToShort();
|
|
|
+ db.Default.Updateable(task).ExecuteCommand();
|
|
|
+ task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化出库任务信息,放货站台:{task.SrmStation}");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (task.SrmStation == "1")
|
|
|
{
|
|
|
- if (task.SrmStation == "1")
|
|
|
+ var srmStation = new string[2];
|
|
|
+ switch (task.Device)
|
|
|
{
|
|
|
- var srmStation = new string[2];
|
|
|
- switch (task.Device)
|
|
|
- {
|
|
|
- case "SRM1":
|
|
|
- srmStation[0] = "2534";
|
|
|
- srmStation[1] = "2533";
|
|
|
- break;
|
|
|
-
|
|
|
- case "SRM2":
|
|
|
- srmStation[0] = "2734";
|
|
|
- srmStation[1] = "2733";
|
|
|
- break;
|
|
|
- case "SRM3":
|
|
|
- srmStation[0] = "2934";
|
|
|
- srmStation[1] = "2933";
|
|
|
- break;
|
|
|
- case "SRM4":
|
|
|
- srmStation[0] = "3134";
|
|
|
- srmStation[1] = "3133";
|
|
|
-
|
|
|
-
|
|
|
- break;
|
|
|
- case "SRM5":
|
|
|
- srmStation[0] = "3334";
|
|
|
- srmStation[1] = "3333";
|
|
|
- break;
|
|
|
- case "SRM6":
|
|
|
- srmStation[0] = "3534";
|
|
|
- srmStation[1] = "3533";
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- //TODO:暂时不考虑入库卡控
|
|
|
- //开始计算当前这个任务要从哪个站台出
|
|
|
- //计算两个站台小于取货完成数量的AGV任务
|
|
|
- var agv1 = db.Default.Queryable<WCS_AgvTaskInfo>().SplitTable(x => x.Take(2)).Count(x => x.Status <= AGVTaskStatus.LeaveGet && x.Station == srmStation[0]);
|
|
|
- var agv2 = db.Default.Queryable<WCS_AgvTaskInfo>().SplitTable(x => x.Take(2)).Count(x => x.Status <= AGVTaskStatus.LeaveGet && x.Station == srmStation[1]);
|
|
|
- task.SrmStation = "";
|
|
|
- task.AddrTo = agv1 > agv2 ? srmStation[1] : srmStation[0];
|
|
|
+ case "SRM1":
|
|
|
+ srmStation[0] = "2534";
|
|
|
+ srmStation[1] = "2533";
|
|
|
+ break;
|
|
|
+
|
|
|
+ case "SRM2":
|
|
|
+ srmStation[0] = "2734";
|
|
|
+ srmStation[1] = "2733";
|
|
|
+ break;
|
|
|
+
|
|
|
+ case "SRM3":
|
|
|
+ srmStation[0] = "2934";
|
|
|
+ srmStation[1] = "2933";
|
|
|
+ break;
|
|
|
+
|
|
|
+ case "SRM4":
|
|
|
+ srmStation[0] = "3134";
|
|
|
+ srmStation[1] = "3133";
|
|
|
+
|
|
|
+ break;
|
|
|
+
|
|
|
+ case "SRM5":
|
|
|
+ srmStation[0] = "3334";
|
|
|
+ srmStation[1] = "3333";
|
|
|
+ break;
|
|
|
+
|
|
|
+ case "SRM6":
|
|
|
+ srmStation[0] = "3534";
|
|
|
+ srmStation[1] = "3533";
|
|
|
+ break;
|
|
|
}
|
|
|
- if (task.SrmStation.IsNullOrEmpty()) //如果没有指定放货站台
|
|
|
+
|
|
|
+ //TODO:暂时不考虑入库卡控
|
|
|
+ //开始计算当前这个任务要从哪个站台出
|
|
|
+ //计算两个站台小于取货完成数量的AGV任务
|
|
|
+ var agv1 = db.Default.Queryable<WCS_AgvTaskInfo>().Where(x => x.Status <= AGVTaskStatus.LeaveGet && x.Station == srmStation[0]).SplitTable(x => x.Take(2)).Count();
|
|
|
+ var agv2 = db.Default.Queryable<WCS_AgvTaskInfo>().Where(x => x.Status <= AGVTaskStatus.LeaveGet && x.Station == srmStation[1]).SplitTable(x => x.Take(2)).Count();
|
|
|
+ task.SrmStation = "";
|
|
|
+ task.AddrTo = agv1 > agv2 ? srmStation[1] : srmStation[0];
|
|
|
+ }
|
|
|
+ if (task.SrmStation.IsNullOrEmpty()) //如果没有指定放货站台
|
|
|
+ {
|
|
|
+ if (task.Device.IsNullOrEmpty())
|
|
|
{
|
|
|
- if (task.Device.IsNullOrEmpty())
|
|
|
- {
|
|
|
- task.Device = "SRM" + task.Tunnel.GetLastDigit();
|
|
|
- }
|
|
|
- //获取堆垛机到目标地址的路径信息
|
|
|
- var path = DevicePath.GetPath(task.Device, task.AddrTo);
|
|
|
- task.SrmStation = path.Points[1].Code;
|
|
|
+ task.Device = "SRM" + task.Tunnel.GetLastDigit();
|
|
|
}
|
|
|
+ //获取堆垛机到目标地址的路径信息
|
|
|
+ var path = DevicePath.GetPath(task.Device, task.AddrTo);
|
|
|
+ task.SrmStation = path.Points[1].Code;
|
|
|
+ }
|
|
|
|
|
|
- var devs = Device.All.Where(x => x.HasFlag(DeviceFlags.AGV取货站台口)).Select(x => x.Code);
|
|
|
- if (devs.Contains(task.SrmStation))
|
|
|
+ var devs = Device.All.Where(x => x.HasFlag(DeviceFlags.AGV取货站台口)).Select(x => x.Code);
|
|
|
+ if (devs.Contains(task.SrmStation))
|
|
|
+ {
|
|
|
+ //开始处理车间叫料AGV任务任务
|
|
|
+ db.Default.Insertable(new WCS_AgvTaskInfo()
|
|
|
{
|
|
|
- //开始处理车间叫料AGV任务任务
|
|
|
- db.Default.Insertable(new WCS_AgvTaskInfo()
|
|
|
- {
|
|
|
- ID = db.GetAgvTaskId(),
|
|
|
- TaskType = AGVTaskType.CallMaterial,
|
|
|
- Status = AGVTaskStatus.NewBuild,
|
|
|
- TaskId = task.ID,
|
|
|
- Position = task.WorkBench,
|
|
|
- Station = task.SrmStation,
|
|
|
- AddWho = "WCS",
|
|
|
- AddTime = DateTime.Now
|
|
|
- }).SplitTable().ExecuteCommand();
|
|
|
-
|
|
|
- db.Default.Insertable(new WCS_AgvTaskInfo()
|
|
|
- {
|
|
|
- ID = db.GetAgvTaskId(),
|
|
|
- TaskType = AGVTaskType.EnterDepot,
|
|
|
- Status = AGVTaskStatus.NewBuild,
|
|
|
- TaskId = task.ID,
|
|
|
- Position = task.WorkBench,
|
|
|
- Station = "2501",
|
|
|
- AddWho = "WCS",
|
|
|
- AddTime = DateTime.Now
|
|
|
- }).SplitTable().ExecuteCommand();
|
|
|
- }
|
|
|
- //更新任务状态
|
|
|
- task.Status = Entity.TaskStatus.WaitingToExecute;
|
|
|
- db.Default.Updateable(task).ExecuteCommand();
|
|
|
- task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化出库任务信息,放货站台:{task.SrmStation}");
|
|
|
+ ID = db.GetAgvTaskId(),
|
|
|
+ TaskType = AGVTaskType.CallMaterial,
|
|
|
+ Status = AGVTaskStatus.NewBuild,
|
|
|
+ TaskId = task.ID,
|
|
|
+ Position = task.WorkBench,
|
|
|
+ Station = task.SrmStation,
|
|
|
+ AddWho = "WCS",
|
|
|
+ AddTime = DateTime.Now
|
|
|
+ }).SplitTable().ExecuteCommand();
|
|
|
+
|
|
|
+ db.Default.Insertable(new WCS_AgvTaskInfo()
|
|
|
+ {
|
|
|
+ ID = db.GetAgvTaskId(),
|
|
|
+ TaskType = AGVTaskType.EnterDepot,
|
|
|
+ Status = AGVTaskStatus.NewBuild,
|
|
|
+ TaskId = task.ID,
|
|
|
+ Position = task.WorkBench,
|
|
|
+ Station = "2501",
|
|
|
+ AddWho = "WCS",
|
|
|
+ AddTime = DateTime.Now
|
|
|
+ }).SplitTable().ExecuteCommand();
|
|
|
}
|
|
|
- break;
|
|
|
+ //更新任务状态
|
|
|
+ task.Status = Entity.TaskStatus.WaitingToExecute;
|
|
|
+ db.Default.Updateable(task).ExecuteCommand();
|
|
|
+ task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化出库任务信息,放货站台:{task.SrmStation}");
|
|
|
}
|
|
|
- case TaskType.Delivery:
|
|
|
- break;
|
|
|
-
|
|
|
- case TaskType.EmptyInit:
|
|
|
break;
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
- catch (Exception ex)
|
|
|
- {
|
|
|
- World.Log(ex.Message, LogLevelEnum.Mid);
|
|
|
- }
|
|
|
+ }
|
|
|
+ case TaskType.Delivery:
|
|
|
+ break;
|
|
|
+
|
|
|
+ case TaskType.EmptyInit:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ });
|
|
|
}
|
|
|
- });
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ World.Log(ex.Message, LogLevelEnum.Mid);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
public override bool Select(Device dev)
|