|
|
@@ -18,85 +18,103 @@ namespace WCS.Service.Works.SRM
|
|
|
[WorkTitle(typeof(SRMHandler), "堆垛机")]
|
|
|
internal class SRMWork : DeviceWork<SRMDevice>
|
|
|
{
|
|
|
- //月台发货需要的设备
|
|
|
- private StationDevice[] DockDevs;
|
|
|
-
|
|
|
- public SRMWork()
|
|
|
- {
|
|
|
- //只取设备组 设备过多,先写程序后填写
|
|
|
- DockDevs = new string[]
|
|
|
- {
|
|
|
- }.Select(v => Device.Find(v)).SelectMany(v => v.DEVICEGROUP).Select(v => v.MEMBER.Create<StationDevice>()).ToArray();
|
|
|
- }
|
|
|
-
|
|
|
protected override void Do(SRMDevice obj)
|
|
|
{
|
|
|
- obj.EX(obj =>
|
|
|
+ obj.EX(srmDevice =>
|
|
|
{
|
|
|
- var deviceCode = obj.Entity.CODE;
|
|
|
+ var deviceCode = srmDevice.Entity.CODE;
|
|
|
//先检查堆垛机是否报警
|
|
|
- if (obj.Data3.SCAlarm != 0)
|
|
|
+ if (srmDevice.Data3.SCAlarm != 0)
|
|
|
{
|
|
|
- if (obj.Entity.WakeupOn(5000)) WMS.DevInfo(obj.Entity.CODE, obj.Data3.SCAlarm.ToString());
|
|
|
- InfoLog.INFO_SRMALARM($"{obj.Entity.CODE}-{obj.Data3.SCAlarm}");
|
|
|
+ if (srmDevice.Entity.WakeupOn(5000)) WMS.DevInfo(srmDevice.Entity.CODE, srmDevice.Data3.SCAlarm.ToString());
|
|
|
+ InfoLog.INFO_SRMALARM($"{srmDevice.Entity.CODE}-{srmDevice.Data3.SCAlarm}");
|
|
|
return;
|
|
|
}
|
|
|
- if (obj.Data.FinishedACK_1 == 1 || obj.Data.FinishedACK_2 == 1) throw new WarnException($"堆垛机完成任务WCS反馈信号未清除");
|
|
|
- if (obj.Data2.VoucherNo_1 != obj.Data.VoucherNo_1 || obj.Data2.VoucherNo_2 != obj.Data.VoucherNo_2)
|
|
|
+ if (srmDevice.Data.FinishedACK_1 == 1 || srmDevice.Data.FinishedACK_2 == 1) throw new WarnException($"堆垛机完成任务WCS反馈信号未清除");
|
|
|
+ if (srmDevice.Data2.VoucherNo_1 != srmDevice.Data.VoucherNo_1 || srmDevice.Data2.VoucherNo_2 != srmDevice.Data.VoucherNo_2)
|
|
|
{
|
|
|
DB.Do(db =>
|
|
|
{
|
|
|
- if (obj.Data2.VoucherNo_1 != obj.Data.VoucherNo_1)
|
|
|
+ if (srmDevice.Data2.VoucherNo_1 != srmDevice.Data.VoucherNo_1)
|
|
|
{
|
|
|
- if (db.Default.Set<WCS_TASK>().Find(obj.Data.TaskID_1).STATUS == TaskStatus.新建)
|
|
|
+ if (db.Default.Set<WCS_TASK>().Find(srmDevice.Data.TaskID_1)!.STATUS == TaskStatus.新建)
|
|
|
{
|
|
|
- obj.Data.VoucherNo_1 = obj.Data2.VoucherNo_1;
|
|
|
+ srmDevice.Data.VoucherNo_1 = srmDevice.Data2.VoucherNo_1;
|
|
|
}
|
|
|
}
|
|
|
- if (obj.Data2.VoucherNo_2 != obj.Data.VoucherNo_2)
|
|
|
+ if (srmDevice.Data2.VoucherNo_2 != srmDevice.Data.VoucherNo_2)
|
|
|
{
|
|
|
- if (db.Default.Set<WCS_TASK>().Find(obj.Data.TaskID_2).STATUS == TaskStatus.新建)
|
|
|
+ if (db.Default.Set<WCS_TASK>().Find(srmDevice.Data.TaskID_2)!.STATUS == TaskStatus.新建)
|
|
|
{
|
|
|
- obj.Data.VoucherNo_2 = obj.Data2.VoucherNo_2;
|
|
|
+ srmDevice.Data.VoucherNo_2 = srmDevice.Data2.VoucherNo_2;
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
- throw new WarnException($"等待执行{obj.Data.TaskID_1}-{obj.Data.TaskID_2}");
|
|
|
+ throw new WarnException($"等待执行{srmDevice.Data.TaskID_1}-{srmDevice.Data.TaskID_2}");
|
|
|
}
|
|
|
|
|
|
+ //检查标记好的出库任务,并将出库任务下达至堆垛机
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ //找到两个任务
|
|
|
+ var taksLsit = db.Default.Set<WCS_TASK>().Where(v => v.ID == srmDevice.Data.TaskID_1 || v.ID == srmDevice.Data.TaskID_2 && v.STATUS == TaskStatus.堆垛机执行).ToList()
|
|
|
+ .Select(v => v.Create<Task>()).OrderBy(v => v.Col).ToArray();
|
|
|
+ if (!taksLsit.Any()) return;
|
|
|
+ for (var i = 0; i < taksLsit.Length; i++)
|
|
|
+ {
|
|
|
+ var item = taksLsit[i];
|
|
|
+
|
|
|
+ var fork = srmDevice.GetFork(item, i);
|
|
|
+
|
|
|
+ switch (fork)
|
|
|
+ {
|
|
|
+ // 列数较小的放一工位
|
|
|
+ case SrmFork.货叉1:
|
|
|
+ obj.WriteTask1(item, (short)taksLsit.Length);
|
|
|
+ break;
|
|
|
+ //列数较大的放二工位
|
|
|
+ case SrmFork.货叉2:
|
|
|
+ obj.WriteTask2(item, (short)taksLsit.Length);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ throw new ArgumentOutOfRangeException();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
//处理堆垛机已完成的任务
|
|
|
- if (obj.Data2.FinishedTask_1 != 0 || obj.Data2.FinishedTask_2 != 0)
|
|
|
+ if (srmDevice.Data2.FinishedTask_1 != 0 || srmDevice.Data2.FinishedTask_2 != 0)
|
|
|
{
|
|
|
- InfoLog.INFO_SRMINFO($"开始完成任务:[{obj.Entity.CODE}]-{obj.Data2.FinishedTask_1}-{obj.Data2.FinishedTask_2}");
|
|
|
- obj.FinishedTaskHandle();
|
|
|
- InfoLog.INFO_SRMINFO($"完成任务处理结束:[{obj.Entity.CODE}]-{obj.Data2.FinishedTask_1}-{obj.Data2.FinishedTask_2}");
|
|
|
+ InfoLog.INFO_SRMINFO($"开始完成任务:[{srmDevice.Entity.CODE}]-{srmDevice.Data2.FinishedTask_1}-{srmDevice.Data2.FinishedTask_2}");
|
|
|
+ srmDevice.FinishedTaskHandle();
|
|
|
+ InfoLog.INFO_SRMINFO($"完成任务处理结束:[{srmDevice.Entity.CODE}]-{srmDevice.Data2.FinishedTask_1}-{srmDevice.Data2.FinishedTask_2}");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if (obj.Data2.SRMMode != SCMode.远程) return;
|
|
|
- if (obj.Data2.SRMStatus != SCRunStatus.空闲) return;
|
|
|
+ if (srmDevice.Data2.SRMMode != SCMode.远程) return;
|
|
|
+ if (srmDevice.Data2.SRMStatus != SCRunStatus.空闲) return;
|
|
|
|
|
|
var isTransfer = new List<WCS_TASK>(); //是否有移库任务
|
|
|
- WCS_TASK enterPriority = new WCS_TASK(), outPriority = new WCS_TASK(); //出入库优先级任务
|
|
|
+ WCS_TASK enterPriority = new(), outPriority = new(); //出入库优先级任务
|
|
|
//再检查是否有等待执行的货物
|
|
|
DB.Do(db =>
|
|
|
{
|
|
|
- var task = db.Default.Set<WCS_TASK>().Where(v => v.DEVICE == obj.Entity.CODE).Where(v => v.STATUS == TaskStatus.堆垛机执行).FirstOrDefault();
|
|
|
+ var task = db.Default.Set<WCS_TASK>().Where(v => v.DEVICE == srmDevice.Entity.CODE).FirstOrDefault(v => v.STATUS == TaskStatus.堆垛机执行);
|
|
|
if (task != null) throw new WarnException($"[{deviceCode}]有正在执行的任务:[{task.ID}]");
|
|
|
//属于当前堆垛机未执行的移库任务
|
|
|
- isTransfer = db.Default.Set<WCS_TASK>().AsNoTracking().Where(v => v.DEVICE == obj.Entity.CODE && v.TYPE == TaskType.移库 && v.STATUS < TaskStatus.堆垛机执行).ToList();
|
|
|
+ isTransfer = db.Default.Set<WCS_TASK>().AsNoTracking().Where(v => v.DEVICE == srmDevice.Entity.CODE && v.TYPE == TaskType.移库 && v.STATUS < TaskStatus.堆垛机执行).ToList();
|
|
|
//判断是否存在调整优先级任务,存在初始化isTransfer值 让本次执行优先任务
|
|
|
- if (db.Default.Set<WCS_TASK>().AsNoTracking().Any(v => v.DEVICE == obj.Entity.CODE && v.TYPE != TaskType.移库 && v.STATUS < TaskStatus.堆垛机执行 && v.Priority > 0))
|
|
|
+ if (db.Default.Set<WCS_TASK>().AsNoTracking().Any(v => v.DEVICE == srmDevice.Entity.CODE && v.TYPE != TaskType.移库 && v.STATUS < TaskStatus.堆垛机执行 && v.Priority > 0))
|
|
|
isTransfer = new List<WCS_TASK>();
|
|
|
- enterPriority = db.Default.Set<WCS_TASK>().Where(v => v.DEVICE == obj.Entity.CODE && v.TYPE == TaskType.入库 && v.STATUS < TaskStatus.堆垛机执行)
|
|
|
+ enterPriority = db.Default.Set<WCS_TASK>().Where(v => v.DEVICE == srmDevice.Entity.CODE && v.TYPE == TaskType.入库 && v.STATUS < TaskStatus.堆垛机执行)
|
|
|
.OrderByDescending(v => v.Priority).FirstOrDefault();
|
|
|
- outPriority = db.Default.Set<WCS_TASK>().Where(v => v.DEVICE == obj.Entity.CODE && v.TYPE == TaskType.出库 && v.STATUS < TaskStatus.堆垛机执行)
|
|
|
+ outPriority = db.Default.Set<WCS_TASK>().Where(v => v.DEVICE == srmDevice.Entity.CODE && v.TYPE == TaskType.出库 && v.STATUS < TaskStatus.堆垛机执行)
|
|
|
.OrderByDescending(v => v.Priority).FirstOrDefault();
|
|
|
});
|
|
|
|
|
|
//最后一个是否是出库任务
|
|
|
- var LastIsOut = obj.Entity.Get<bool>("LastIsOut");
|
|
|
- obj.Entity.Set("LastIsOut", !LastIsOut);
|
|
|
+ var LastIsOut = srmDevice.Entity.Get<bool>("LastIsOut");
|
|
|
+ srmDevice.Entity.Set("LastIsOut", !LastIsOut);
|
|
|
if (isTransfer.Count > 0) //防止因为无当前堆垛机移库任务导致无法执行其他类型任务
|
|
|
{
|
|
|
#region 移库
|
|
|
@@ -104,7 +122,7 @@ namespace WCS.Service.Works.SRM
|
|
|
DB.Do(db =>
|
|
|
{
|
|
|
//获取当前堆垛机未执行的任务的组ID
|
|
|
- var taskGroupKey = db.Default.Set<WCS_TASK>().Where(v => v.DEVICE == obj.Entity.CODE && v.TYPE == TaskType.移库 && v.STATUS < TaskStatus.堆垛机执行).OrderBy(p => p.CREATETIME).FirstOrDefault().TaskGroupKey;
|
|
|
+ var taskGroupKey = db.Default.Set<WCS_TASK>().Where(v => v.DEVICE == srmDevice.Entity.CODE && v.TYPE == TaskType.移库 && v.STATUS < TaskStatus.堆垛机执行).OrderBy(p => p.CREATETIME).FirstOrDefault()!.TaskGroupKey;
|
|
|
//通过任务的组ID找到本组的所有任务
|
|
|
var tasks = db.Default.Set<WCS_TASK>().Where(v => v.TaskGroupKey == taskGroupKey);
|
|
|
|
|
|
@@ -123,32 +141,32 @@ namespace WCS.Service.Works.SRM
|
|
|
task.STARTTIME = DateTime.Now;
|
|
|
task.UPDATETIME = DateTime.Now;
|
|
|
task.STATUS = WCS.Entity.TaskStatus.堆垛机执行;
|
|
|
- task.DEVICE = obj.Entity.CODE;
|
|
|
+ task.DEVICE = srmDevice.Entity.CODE;
|
|
|
db.Default.SaveChanges();
|
|
|
Uploader.Upload(db);
|
|
|
task.CreateStatusLog(db, $"状态由[{oldTaskSTATUS}]变更为[{task.STATUS}]", this.GetType());
|
|
|
|
|
|
if (addrFrom[2].ToShort().OddNumberOrEven())
|
|
|
{
|
|
|
- obj.Data.TaskID_1 = task.ID;
|
|
|
- obj.Data.SLine_1 = addrFrom[0].ToShort();
|
|
|
- obj.Data.SCol_1 = addrFrom[1].ToShort();
|
|
|
- obj.Data.SLayer_1 = addrFrom[2].ToShort();
|
|
|
- obj.Data.ELine_1 = addrTo[0].ToShort();
|
|
|
- obj.Data.ECol_1 = addrTo[1].ToShort();
|
|
|
- obj.Data.ELayer_1 = addrTo[2].ToShort();
|
|
|
- obj.Data.VoucherNo_1++;
|
|
|
+ srmDevice.Data.TaskID_1 = task.ID;
|
|
|
+ srmDevice.Data.SLine_1 = addrFrom[0].ToShort();
|
|
|
+ srmDevice.Data.SCol_1 = addrFrom[1].ToShort();
|
|
|
+ srmDevice.Data.SLayer_1 = addrFrom[2].ToShort();
|
|
|
+ srmDevice.Data.ELine_1 = addrTo[0].ToShort();
|
|
|
+ srmDevice.Data.ECol_1 = addrTo[1].ToShort();
|
|
|
+ srmDevice.Data.ELayer_1 = addrTo[2].ToShort();
|
|
|
+ srmDevice.Data.VoucherNo_1++;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- obj.Data.TaskID_2 = task.ID;
|
|
|
- obj.Data.SLine_2 = addrFrom[0].ToShort();
|
|
|
- obj.Data.SCol_2 = addrFrom[1].ToShort();
|
|
|
- obj.Data.SLayer_2 = addrFrom[2].ToShort();
|
|
|
- obj.Data.ELine_2 = addrTo[0].ToShort();
|
|
|
- obj.Data.ECol_2 = addrTo[1].ToShort();
|
|
|
- obj.Data.ELayer_2 = addrTo[2].ToShort();
|
|
|
- obj.Data.VoucherNo_2++;
|
|
|
+ srmDevice.Data.TaskID_2 = task.ID;
|
|
|
+ srmDevice.Data.SLine_2 = addrFrom[0].ToShort();
|
|
|
+ srmDevice.Data.SCol_2 = addrFrom[1].ToShort();
|
|
|
+ srmDevice.Data.SLayer_2 = addrFrom[2].ToShort();
|
|
|
+ srmDevice.Data.ELine_2 = addrTo[0].ToShort();
|
|
|
+ srmDevice.Data.ECol_2 = addrTo[1].ToShort();
|
|
|
+ srmDevice.Data.ELayer_2 = addrTo[2].ToShort();
|
|
|
+ srmDevice.Data.VoucherNo_2++;
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
@@ -159,13 +177,13 @@ namespace WCS.Service.Works.SRM
|
|
|
{
|
|
|
#region 入库
|
|
|
|
|
|
- var floor = obj.Entity.Get<int>("LastInFloor");
|
|
|
+ var floor = srmDevice.Entity.Get<int>("LastInFloor");
|
|
|
floor = floor % 2 + 1;
|
|
|
- obj.Entity.Set("LastInFloor", floor);
|
|
|
+ srmDevice.Entity.Set("LastInFloor", floor);
|
|
|
if (enterPriority != null && outPriority != null && outPriority.Priority > enterPriority.Priority) return;
|
|
|
|
|
|
- var arrIn = obj.GetPickPoint()
|
|
|
- .Where(v => Device.Where(d => d.IsConv()).Select(d => d.Device<IStation521>()).Where(d => d.Data.Goodsend == v.Entity.Code()).Any()) //有正在前往取货点的任务
|
|
|
+ var arrIn = srmDevice.GetPickPoint()
|
|
|
+ .Where(v => Device.Where(d => d.IsConv()).Select(d => d.Device<IStation521>()).Any(d => d.Data.Goodsend == v.Entity.Code())) //有正在前往取货点的任务
|
|
|
.ToList();
|
|
|
|
|
|
if (!arrIn.Any()) return; //当前堆垛机无入库任务
|
|
|
@@ -179,7 +197,7 @@ namespace WCS.Service.Works.SRM
|
|
|
var item = Device.Where(v => v.DEVICEGROUP.Any(p => p.MEMBER.CODE == station.Entity.CODE)).Single();
|
|
|
//对数据进行排序,根据CAD图纸规划,取货点两个设备中设备号较大的一个一定对应到堆垛机的一工位货叉
|
|
|
//因此按照降序进行排序,可以保证数组中第一个一定是放到堆垛机一工位的数据
|
|
|
- var devs = item.DEVICEGROUP.Select(v => v.MEMBER)
|
|
|
+ var devise = item.DEVICEGROUP.Select(v => v.MEMBER)
|
|
|
.Select(v => v.Create<StationDevice>())
|
|
|
.OrderByDescending(v => v.Entity.CODE)
|
|
|
.ToArray();
|
|
|
@@ -188,7 +206,7 @@ namespace WCS.Service.Works.SRM
|
|
|
DB.Do(db =>
|
|
|
{
|
|
|
//检测有效任务数与实际任务是是否相等
|
|
|
- var validDev = devs.Where(v => v.Data2.Tasknum > 10000 && v.Data2.Status.HasFlag(IstationStatus.光电状态) && !v.Data3.Status.HasFlag(StationStatus.运行状态位));
|
|
|
+ var validDev = devise.Where(v => v.Data2.Tasknum > 10000 && v.Data2.Status.HasFlag(IstationStatus.光电状态) && !v.Data3.Status.HasFlag(StationStatus.运行状态位));
|
|
|
if (!validDev.Any()) throw new DoException("无有效入库任务");
|
|
|
var tasknum = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == validDev.First().Data2.Tasknum);
|
|
|
var taskList = db.Default.Set<WCS_TASK>().Count(v => v.TaskGroupKey == tasknum.TaskGroupKey && v.TYPE == TaskType.入库);
|
|
|
@@ -201,14 +219,14 @@ namespace WCS.Service.Works.SRM
|
|
|
var tunnel = dev.Entity.ROUTES.First().NEXT.CODE;
|
|
|
I_WCS_GetWareCellResponse loc;
|
|
|
//判定当前设备对应的堆垛机工位
|
|
|
- if (dev.Entity.CODE == devs[0].Entity.CODE) loc = WMS.GetLocalIn(task.WMSTASK, tunnel, dev.Entity.CODE, Entity.WareCellForkNum.货叉1); //一工位
|
|
|
- else if (dev.Entity.CODE == devs[1].Entity.CODE) loc = WMS.GetLocalIn(task.WMSTASK, tunnel, dev.Entity.CODE, Entity.WareCellForkNum.货叉2); //2工位
|
|
|
+ if (dev.Entity.CODE == devise[0].Entity.CODE) loc = WMS.GetLocalIn(task.WMSTASK, tunnel, dev.Entity.CODE, Entity.WareCellForkNum.货叉1); //一工位
|
|
|
+ else if (dev.Entity.CODE == devise[1].Entity.CODE) loc = WMS.GetLocalIn(task.WMSTASK, tunnel, dev.Entity.CODE, Entity.WareCellForkNum.货叉2); //2工位
|
|
|
else throw new WarnException($"设备{dev.Entity.CODE}无法对应至堆垛机的任一一个工位");
|
|
|
|
|
|
task.UPDATETIME = DateTime.Now;
|
|
|
task.STATUS = TaskStatus.堆垛机执行;
|
|
|
- task.ADDRTO = string.Format("{0}-{1}-{2}", loc.Row, loc.Colomn, loc.Layer);
|
|
|
- task.DEVICE = obj.Entity.CODE;
|
|
|
+ task.ADDRTO = $"{loc.Row}-{loc.Colomn}-{loc.Layer}";
|
|
|
+ task.DEVICE = srmDevice.Entity.CODE;
|
|
|
task.TUNNEL = tunnel;
|
|
|
task.CreateStatusLog(db, $"状态由{oldTask}变更至{task.STATUS}", this.GetType());
|
|
|
finishTaskList.Add(new FinishTaskList<int>(task.ID, dev));
|
|
|
@@ -221,33 +239,33 @@ namespace WCS.Service.Works.SRM
|
|
|
{
|
|
|
var task = db.Default.Set<WCS_TASK>().Find(finish.FinishCode);
|
|
|
var addTo = task.ADDRTO.Split("-");
|
|
|
- if (finish.Station.Entity.CODE == devs[0].Entity.CODE) //一工位
|
|
|
+ if (finish.Station.Entity.CODE == devise[0].Entity.CODE) //一工位
|
|
|
{
|
|
|
- InfoLog.INFO_SRMINFO($"入库--写入堆垛机[{obj.Entity.CODE}]1工位-开始:[{obj.Data.TaskID_1}][{obj.Data.SLine_1}][{obj.Data.ELine_1}][{obj.Data.ECol_1}][{obj.Data.ELayer_1}][{obj.Data.VoucherNo_1}]--[{finishTaskList.Count.ToShort()}]");
|
|
|
- obj.Data.TaskID_1 = task.ID;
|
|
|
- obj.Data.SLine_1 = finish.Station.Entity.CODE.ToShort();
|
|
|
- obj.Data.SCol_1 = 0;
|
|
|
- obj.Data.SLayer_1 = 0;
|
|
|
- obj.Data.ELine_1 = addTo[0].ToShort();
|
|
|
- obj.Data.ECol_1 = addTo[1].ToShort();
|
|
|
- obj.Data.ELayer_1 = addTo[2].ToShort();
|
|
|
- obj.Data.RES1_1 = finishTaskList.Count.ToShort();
|
|
|
- obj.Data.VoucherNo_1++;
|
|
|
- InfoLog.INFO_SRMINFO($"入库--写入堆垛机[{obj.Entity.CODE}]1工位-结束:[{obj.Data.TaskID_1}][{obj.Data.SLine_1}][{obj.Data.ELine_1}][{obj.Data.ECol_1}][{obj.Data.ELayer_1}][{obj.Data.VoucherNo_1}]--[{finishTaskList.Count.ToShort()}]");
|
|
|
+ InfoLog.INFO_SRMINFO($"入库--写入堆垛机[{srmDevice.Entity.CODE}]1工位-开始:[{srmDevice.Data.TaskID_1}][{srmDevice.Data.SLine_1}][{srmDevice.Data.ELine_1}][{srmDevice.Data.ECol_1}][{srmDevice.Data.ELayer_1}][{srmDevice.Data.VoucherNo_1}]--[{finishTaskList.Count.ToShort()}]");
|
|
|
+ srmDevice.Data.TaskID_1 = task.ID;
|
|
|
+ srmDevice.Data.SLine_1 = finish.Station.Entity.CODE.ToShort();
|
|
|
+ srmDevice.Data.SCol_1 = 0;
|
|
|
+ srmDevice.Data.SLayer_1 = 0;
|
|
|
+ srmDevice.Data.ELine_1 = addTo[0].ToShort();
|
|
|
+ srmDevice.Data.ECol_1 = addTo[1].ToShort();
|
|
|
+ srmDevice.Data.ELayer_1 = addTo[2].ToShort();
|
|
|
+ srmDevice.Data.RES1_1 = finishTaskList.Count.ToShort();
|
|
|
+ srmDevice.Data.VoucherNo_1++;
|
|
|
+ InfoLog.INFO_SRMINFO($"入库--写入堆垛机[{srmDevice.Entity.CODE}]1工位-结束:[{srmDevice.Data.TaskID_1}][{srmDevice.Data.SLine_1}][{srmDevice.Data.ELine_1}][{srmDevice.Data.ECol_1}][{srmDevice.Data.ELayer_1}][{srmDevice.Data.VoucherNo_1}]--[{finishTaskList.Count.ToShort()}]");
|
|
|
}
|
|
|
- else if (finish.Station.Entity.CODE == devs[1].Entity.CODE)
|
|
|
+ else if (finish.Station.Entity.CODE == devise[1].Entity.CODE)
|
|
|
{
|
|
|
- InfoLog.INFO_SRMINFO($"入库--写入堆垛机[{obj.Entity.CODE}]2工位-开始:[{obj.Data.TaskID_2}][{obj.Data.SLine_2}][{obj.Data.ELine_2}][{obj.Data.ECol_2}][{obj.Data.ELayer_2}][{obj.Data.VoucherNo_2}]--[{finishTaskList.Count.ToShort()}]");
|
|
|
- obj.Data.TaskID_2 = task.ID;
|
|
|
- obj.Data.SLine_2 = finish.Station.Entity.CODE.ToShort();
|
|
|
- obj.Data.SCol_2 = 0;
|
|
|
- obj.Data.SLayer_2 = 0;
|
|
|
- obj.Data.ELine_2 = addTo[0].ToShort();
|
|
|
- obj.Data.ECol_2 = addTo[1].ToShort();
|
|
|
- obj.Data.ELayer_2 = addTo[2].ToShort();
|
|
|
- obj.Data.RES1_2 = finishTaskList.Count.ToShort();
|
|
|
- obj.Data.VoucherNo_2++;
|
|
|
- InfoLog.INFO_SRMINFO($"入库--写入堆垛机[{obj.Entity.CODE}]2工位-结束:[{obj.Data.TaskID_2}][{obj.Data.SLine_2}][{obj.Data.ELine_2}][{obj.Data.ECol_2}][{obj.Data.ELayer_2}][{obj.Data.VoucherNo_2}]--[{finishTaskList.Count.ToShort()}]");
|
|
|
+ InfoLog.INFO_SRMINFO($"入库--写入堆垛机[{srmDevice.Entity.CODE}]2工位-开始:[{srmDevice.Data.TaskID_2}][{srmDevice.Data.SLine_2}][{srmDevice.Data.ELine_2}][{srmDevice.Data.ECol_2}][{srmDevice.Data.ELayer_2}][{srmDevice.Data.VoucherNo_2}]--[{finishTaskList.Count.ToShort()}]");
|
|
|
+ srmDevice.Data.TaskID_2 = task.ID;
|
|
|
+ srmDevice.Data.SLine_2 = finish.Station.Entity.CODE.ToShort();
|
|
|
+ srmDevice.Data.SCol_2 = 0;
|
|
|
+ srmDevice.Data.SLayer_2 = 0;
|
|
|
+ srmDevice.Data.ELine_2 = addTo[0].ToShort();
|
|
|
+ srmDevice.Data.ECol_2 = addTo[1].ToShort();
|
|
|
+ srmDevice.Data.ELayer_2 = addTo[2].ToShort();
|
|
|
+ srmDevice.Data.RES1_2 = finishTaskList.Count.ToShort();
|
|
|
+ srmDevice.Data.VoucherNo_2++;
|
|
|
+ InfoLog.INFO_SRMINFO($"入库--写入堆垛机[{srmDevice.Entity.CODE}]2工位-结束:[{srmDevice.Data.TaskID_2}][{srmDevice.Data.SLine_2}][{srmDevice.Data.ELine_2}][{srmDevice.Data.ECol_2}][{srmDevice.Data.ELayer_2}][{srmDevice.Data.VoucherNo_2}]--[{finishTaskList.Count.ToShort()}]");
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
@@ -258,16 +276,14 @@ namespace WCS.Service.Works.SRM
|
|
|
{
|
|
|
#region 出库
|
|
|
|
|
|
- //obj.EXOutStock(obj =>
|
|
|
- //{
|
|
|
- obj.CheckOutTask();
|
|
|
- var floor = obj.Entity.Get<int>("LastOutFloor");
|
|
|
+ srmDevice.CheckOutTask();
|
|
|
+ var floor = srmDevice.Entity.Get<int>("LastOutFloor");
|
|
|
floor = floor % 2 + 1;
|
|
|
- obj.Entity.Set("LastOutFloor", floor);
|
|
|
+ srmDevice.Entity.Set("LastOutFloor", floor);
|
|
|
if (enterPriority != null && outPriority != null && enterPriority.Priority > outPriority.Priority) return;
|
|
|
|
|
|
//获取当前堆垛机所有的放货点
|
|
|
- var list = obj.GetDeliveryPoint();
|
|
|
+ var list = srmDevice.GetDeliveryPoint();
|
|
|
|
|
|
list = list.Where(v =>
|
|
|
{
|
|
|
@@ -280,16 +296,48 @@ namespace WCS.Service.Works.SRM
|
|
|
else if (v.Data2.Status.HasFlag(IstationStatus.光电状态)) res = false;
|
|
|
else if (v.Data2.Request == IstationRequest.堆垛机放货完成请求目标地址) res = false;
|
|
|
else if (v.Data2.Tasknum > 10000) res = false;
|
|
|
+ else if (v.Entity.Is(DF.SRM涂布放货)) //涂布分货,应为电控不会等到RGV取货点无货时,再让货物离开无动力站台,因此需要判断一次旋转台的状态
|
|
|
+ {
|
|
|
+ var devise = new List<StationDevice>();
|
|
|
+ switch (v.Entity.CODE)
|
|
|
+ {
|
|
|
+ case "1283" or "1284":
|
|
|
+ devise = Device.Where(b => b.CODE is "1281" or "1282").Select(b => b.Create<StationDevice>()).ToList();
|
|
|
+ break;
|
|
|
+
|
|
|
+ case "1290" or "1291" or "1292" or "1293":
|
|
|
+ devise = Device.Where(b => b.CODE is "1288" or "1289").Select(b => b.Create<StationDevice>()).ToList();
|
|
|
+ break;
|
|
|
+
|
|
|
+ case "1299" or "1300" or "1301" or "1302":
|
|
|
+ devise = Device.Where(b => b.CODE is "1297" or "1298").Select(b => b.Create<StationDevice>()).ToList();
|
|
|
+ break;
|
|
|
+
|
|
|
+ case "1308" or "1309" or "1310" or "1311":
|
|
|
+ devise = Device.Where(b => b.CODE is "1306" or "1307").Select(b => b.Create<StationDevice>()).ToList();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!devise.Any()) return res;
|
|
|
+ foreach (var stationDevice in devise)
|
|
|
+ {
|
|
|
+ //放货点是否有货
|
|
|
+ if (stationDevice.Data.VoucherNo != stationDevice.Data2.VoucherNo) res = false;
|
|
|
+ else if (stationDevice.Data3.Status.HasFlag(StationStatus.运行状态位)) res = false;
|
|
|
+ else if (stationDevice.Data2.Status.HasFlag(IstationStatus.光电状态)) res = false;
|
|
|
+ else if (stationDevice.Data2.Request == IstationRequest.堆垛机放货完成请求目标地址) res = false;
|
|
|
+ else if (stationDevice.Data2.Tasknum > 10000) res = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
return res;
|
|
|
}).ToList();
|
|
|
|
|
|
//没有可用货位
|
|
|
if (list.Count == 0) return;
|
|
|
|
|
|
- //月台所有设备当前有的任务号
|
|
|
- var taskidList = DockDevs.Select(v => v.Data2.Tasknum).Where(v => v > 10000).ToList();
|
|
|
//堆垛机设备
|
|
|
- var srm = obj.Entity.CODE;
|
|
|
+ var srm = srmDevice.Entity.CODE;
|
|
|
DB.Do(db =>
|
|
|
{
|
|
|
//堆垛机当前是否有正在执行的任务
|
|
|
@@ -302,9 +350,9 @@ namespace WCS.Service.Works.SRM
|
|
|
.Where(v => !db.Default.Set<WCS_TASK>().Any(d => d.DEVICE == srm && d.STATUS == TaskStatus.堆垛机执行)).ToList();
|
|
|
|
|
|
//同时对结果进行排序,分组
|
|
|
- var maxnum = ProtocolProxy.YGWMS150Redis.Get("SaleTaskGroupCount").ToInt();
|
|
|
+ var maximum = ProtocolProxy.YGWMS150Redis.Get("SaleTaskGroupCount").ToInt();
|
|
|
//所有 有优先级任务的出货口
|
|
|
- var priorityADDRTO = db.Default.Set<WCS_TASK>().Where(v => v.Priority > 0 && v.STATUS == TaskStatus.新建 && v.DEVICE != obj.Entity.CODE).ToList()
|
|
|
+ var priorityADDRTO = db.Default.Set<WCS_TASK>().Where(v => v.Priority > 0 && v.STATUS == TaskStatus.新建 && v.DEVICE != srmDevice.Entity.CODE).ToList()
|
|
|
.GroupBy(v => v.ADDRTO).Select(v => new { v.Key, List = v.Select(p => p.DEVICE).Distinct().ToList() })
|
|
|
.Where(v => v.List.Where(p =>
|
|
|
{
|
|
|
@@ -316,16 +364,15 @@ namespace WCS.Service.Works.SRM
|
|
|
var cTaskList = db.Default.Set<WCS_TASK>().AsNoTracking()
|
|
|
.Where(d => d.TYPE == TaskType.出库)
|
|
|
.Where(d => d.STATUS > TaskStatus.新建)
|
|
|
- .Where(d => d.STATUS < TaskStatus.已完成 || taskidList.Contains(d.ID)).ToList();
|
|
|
- var outDepotList = waitTask.Where(v => cTaskList.Where(d => d.ADDRTO == v.ADDRTO && d.FLOOR == v.FLOOR).GroupBy(d => d.TaskGroupKey).Count() < maxnum)
|
|
|
+ .Where(d => d.STATUS < TaskStatus.已完成).ToList();
|
|
|
+ var outDepotList = waitTask.Where(v => cTaskList.Where(d => d.ADDRTO == v.ADDRTO && d.FLOOR == v.FLOOR).GroupBy(d => d.TaskGroupKey).Count() < maximum)
|
|
|
.OrderByDescending(v => v.Priority)
|
|
|
.ThenBy(v => v.ADDRTO == "G1340" ? 0 : 1)
|
|
|
.ThenBy(v => v.FLOOR == floor ? 0 : 1)
|
|
|
.ThenBy(v => cTaskList.Where(d => d.ADDRTO == v.ADDRTO && d.FLOOR == v.FLOOR).GroupBy(d => d.TaskGroupKey).Count())
|
|
|
.ThenBy(v => v.CREATETIME)
|
|
|
.GroupBy(v => v.ADDRTO)
|
|
|
- .Where(v => !priorityADDRTO.Contains(v.Key))
|
|
|
- .FirstOrDefault()
|
|
|
+ .FirstOrDefault(v => !priorityADDRTO.Contains(v.Key))!
|
|
|
.Select(v => v).ToList();
|
|
|
|
|
|
//获取两个个可执行任务,此时这两个任务的目标地址是一致的
|
|
|
@@ -347,7 +394,7 @@ namespace WCS.Service.Works.SRM
|
|
|
|
|
|
var finishTaskList = new List<FinishTaskList<SrmFork, Task>>();
|
|
|
|
|
|
- for (int i = 0; i < tasks.Length; i++)
|
|
|
+ for (var i = 0; i < tasks.Length; i++)
|
|
|
{
|
|
|
var item = tasks[i];
|
|
|
var task = db.Default.Set<WCS_TASK>().Find(item.ID);
|
|
|
@@ -355,21 +402,18 @@ namespace WCS.Service.Works.SRM
|
|
|
task.STARTTIME = DateTime.Now;
|
|
|
task.UPDATETIME = DateTime.Now;
|
|
|
task.STATUS = WCS.Entity.TaskStatus.堆垛机执行;
|
|
|
- task.DEVICE = obj.Entity.CODE;
|
|
|
+ task.DEVICE = srmDevice.Entity.CODE;
|
|
|
task.TaskGroupKey = tasks.Length switch
|
|
|
{
|
|
|
1 => $"{tasks[0].ID}_0",
|
|
|
2 => $"{tasks[0].ID}_{tasks[1].ID}",
|
|
|
_ => throw new WarnException($"可用任务数异常{tasks.Length}"),
|
|
|
};
|
|
|
- var fork = obj.GetFork(item, i);
|
|
|
+ var fork = srmDevice.GetFork(item, i);
|
|
|
//获取站台及下一个地址
|
|
|
task.GetSrmStationAndaddNext(fork);
|
|
|
var msg = "";
|
|
|
- if (fork == SrmFork.货叉1)
|
|
|
- msg = $"状态由[{oldTaskSTATUS}]变更为[{task.STATUS}][{obj.Data.SLine_1}-{obj.Data.SCol_1}-{obj.Data.SLayer_1}][{obj.Data.ELine_1}][{obj.Data.VoucherNo_1}]";
|
|
|
- else
|
|
|
- msg = $"状态由[{oldTaskSTATUS}]变更为[{task.STATUS}][{obj.Data.SLine_2}-{obj.Data.SCol_2}-{obj.Data.SLayer_2}][{obj.Data.ELine_2}][{obj.Data.VoucherNo_2}]";
|
|
|
+ msg = fork == SrmFork.货叉1 ? $"状态由[{oldTaskSTATUS}]变更为[{task.STATUS}][{srmDevice.Data.SLine_1}-{srmDevice.Data.SCol_1}-{srmDevice.Data.SLayer_1}][{srmDevice.Data.ELine_1}][{srmDevice.Data.VoucherNo_1}]" : $"状态由[{oldTaskSTATUS}]变更为[{task.STATUS}][{srmDevice.Data.SLine_2}-{srmDevice.Data.SCol_2}-{srmDevice.Data.SLayer_2}][{srmDevice.Data.ELine_2}][{srmDevice.Data.VoucherNo_2}]";
|
|
|
task.CreateStatusLog(db, msg, this.GetType());
|
|
|
item.SRMSTATION = task.SRMSTATION;
|
|
|
finishTaskList.Add(new FinishTaskList<SrmFork, Task>(fork, item));
|
|
|
@@ -377,19 +421,21 @@ namespace WCS.Service.Works.SRM
|
|
|
|
|
|
db.Default.SaveChanges();
|
|
|
|
|
|
+ //此处只做标记,表示当前事务已经提交
|
|
|
foreach (var finish in finishTaskList)
|
|
|
{
|
|
|
if (finish.FinishCode == SrmFork.货叉1) // 列数较小的放一工位
|
|
|
{
|
|
|
- obj.WriteTask1(finish.Station, (short)tasks.Length);
|
|
|
+ srmDevice.Data.TaskID_1 = finish.Station.ID;
|
|
|
+ //obj.WriteTask1(finish.Station, (short)tasks.Length);
|
|
|
}
|
|
|
else if (finish.FinishCode == SrmFork.货叉2) //列数较大的放二工位
|
|
|
{
|
|
|
- obj.WriteTask2(finish.Station, (short)tasks.Length);
|
|
|
+ srmDevice.Data.TaskID_2 = finish.Station.ID;
|
|
|
+ //obj.WriteTask2(finish.Station, (short)tasks.Length);
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
- //});
|
|
|
|
|
|
#endregion 出库
|
|
|
}
|
|
|
@@ -401,4 +447,4 @@ namespace WCS.Service.Works.SRM
|
|
|
return dev.Is(DF.SRM);
|
|
|
}
|
|
|
}
|
|
|
-}
|
|
|
+}
|