|
|
@@ -1,5 +1,6 @@
|
|
|
using DBHelper;
|
|
|
using System;
|
|
|
+using System.Collections.Generic;
|
|
|
using System.Linq;
|
|
|
using WCS.Core;
|
|
|
using WCS.Entity;
|
|
|
@@ -75,7 +76,120 @@ namespace WCS.Service.Works.RGV
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- [WorkTitle(typeof(RGVHandler), "涂布环穿取货")]
|
|
|
+ [WorkTitle(typeof(RGVHandler), "涂布环穿")]
|
|
|
+ public class 涂布环穿 : DeviceWork<RGVDevice>
|
|
|
+ {
|
|
|
+ protected override void Do(RGVDevice obj)
|
|
|
+ {
|
|
|
+ obj.EX(obj =>
|
|
|
+ {
|
|
|
+ if (obj.Data2.Trigger_1 != obj.Data.Trigger_1) throw new WarnException($"等待执行任务{obj.Data2.TaskID_1}{obj.Data2.TaskID_2}");
|
|
|
+ if (!obj.Data2.WorkMode.HasFlag(RGVMode.自动)) throw new DoException(obj.Data2.WorkMode.ToString());
|
|
|
+ if (!obj.Data2.SystemStatus.HasFlag(RGVRunStatus.空闲)) throw new DoException(obj.Data2.SystemStatus.ToString());
|
|
|
+ //RGV当前是否刚刚完成取货任务,等待放货
|
|
|
+ if (obj.IsPut())
|
|
|
+ {
|
|
|
+ //取小车上的任务
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ List<int> taskids = new List<int>() { obj.Data2.TaskID_1, obj.Data2.TaskID_2 };
|
|
|
+ var tasks = db.Default.Set<WCS_TASK>().Where(p => taskids.Contains(p.ID));
|
|
|
+ if (tasks.GroupBy(p => p.TaskGroupKey).Count() > 1)
|
|
|
+ throw new WarnException("任务组ID不一致");
|
|
|
+ if (!tasks.GroupBy(p => p.TaskGroupKey).Any())
|
|
|
+ throw new WarnException("无任务组ID");
|
|
|
+ var destStation = Device.Find(tasks.FirstOrDefault().ADDRNEXT.Replace("G", "")).Create<StationDeviceGroup>();
|
|
|
+ obj.Put(destStation, obj.Data2.TaskID_1, obj.Data2.TaskID_2);
|
|
|
+ });
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ var pickStation = obj.CurrentStation();
|
|
|
+ //RGV是否在任何一个取货站点
|
|
|
+ if (pickStation != null)
|
|
|
+ {
|
|
|
+ // 检查取货点是否需要取货
|
|
|
+ pickStation.WhetherToExecute();
|
|
|
+ // 筛选出有任务号和起始及目标地址的设备
|
|
|
+ var devs = pickStation.RGVGetTaskedDevice();
|
|
|
+ //是否需要取货
|
|
|
+ if (devs.Count > 0)
|
|
|
+ {
|
|
|
+ //开始下达取货任务
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var taskids = devs.Select(v => v.Data2.Tasknum);
|
|
|
+ var tasks = db.Default.Set<WCS_TASK>().Where(p => taskids.Contains(p.ID));
|
|
|
+ if (tasks.GroupBy(p => p.TaskGroupKey).Count() > 1)
|
|
|
+ throw new WarnException("任务组ID不一致");
|
|
|
+ if (!tasks.GroupBy(p => p.TaskGroupKey).Any())
|
|
|
+ throw new WarnException("无任务组ID");
|
|
|
+ var gw1 = pickStation.Items.ToArray()[0];
|
|
|
+ var gw2 = pickStation.Items.ToArray()[1];
|
|
|
+ if (gw1.Data2.Tasknum != 0 && gw2.Data2.Tasknum != 0)
|
|
|
+ {
|
|
|
+ if (gw1.Data2.Goodsend != gw2.Data2.Goodsend) throw new WarnException($"{obj.Entity.Code}目标地址不一致");
|
|
|
+ }
|
|
|
+ obj.Data.TaskID_1 = gw1.Data2.Tasknum;
|
|
|
+ obj.Data.TaskID_2 = gw2.Data2.Tasknum;
|
|
|
+ obj.Data.TaskType_1 = RGVTaskType.取货;
|
|
|
+ if (gw1.Data2.Tasknum != 0)
|
|
|
+ {
|
|
|
+ obj.Data.DestPosition_1 = gw1.Data2.Goodsend;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ obj.Data.DestPosition_1 = gw2.Data2.Goodsend;
|
|
|
+ }
|
|
|
+ obj.Data.Trigger_1++;
|
|
|
+
|
|
|
+ foreach (var task in tasks)
|
|
|
+ {
|
|
|
+ var msg = $"下达从{obj.Data.StartPosition_1}移动至{ obj.Data.DestPosition_1}的RGV PLC指令。";
|
|
|
+ msg += $"[{ task.ID}][{obj.Data.StartPosition_1}][{obj.Data.DestPosition_1}[{ obj.Data.Trigger_1}]";
|
|
|
+
|
|
|
+ task.CreateStatusLog(db, msg, this.GetType());
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ //找到自己的后一个小车
|
|
|
+ var afterStation = obj.After();
|
|
|
+ //后面的小车是否在执行任务
|
|
|
+ if (afterStation.Data2.WorkMode == RGVMode.自动 && afterStation.Data2.SystemStatus == RGVRunStatus.空闲) return;
|
|
|
+ //自己是否阻挡了该小车
|
|
|
+ if (obj.StopedByMe(afterStation))
|
|
|
+ {
|
|
|
+ //取小车的目标位置值
|
|
|
+ var destStation = Device.Find($"G{afterStation.Data2.DestPosition_1}").Create<StationDeviceGroup>();
|
|
|
+ //取被挡住小车的目标位置的下一个取货点
|
|
|
+ var beforeSickStation = Device.Where(v => v.Is(DF.涂布RGV取货站台) && v.CODE != destStation.Entity.CODE)
|
|
|
+ .Select(v => v.Create<StationDeviceGroup>())
|
|
|
+ .OrderBy(v => destStation.Distance(v))
|
|
|
+ .FirstOrDefault();
|
|
|
+
|
|
|
+ //写入移动任务
|
|
|
+ obj.Move(beforeSickStation);
|
|
|
+ }
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ //此时RGV即没有等待执行的放货任务,也不在任何一个取货点,因此需要调往最近的一个取货点
|
|
|
+ //找到距离这个RGV最近的一个取货点
|
|
|
+ pickStation = obj.BeforeStation();
|
|
|
+ obj.Move(pickStation);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ protected override bool SelectDevice(WCS_DEVICE dev)
|
|
|
+ {
|
|
|
+ return dev.Is(DF.涂布RGV);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //[WorkTitle(typeof(RGVHandler), "涂布环穿取货")]
|
|
|
public class 涂布环穿取货 : Work<StationDeviceGroup>
|
|
|
{
|
|
|
protected override void Do(StationDeviceGroup obj)
|