|
@@ -4,6 +4,7 @@ using System.Linq;
|
|
|
using WCS.Core;
|
|
|
using WCS.Entity;
|
|
|
using WCS.Entity.Protocol;
|
|
|
+using WCS.Service.Helpers;
|
|
|
|
|
|
namespace WCS.Service.Works
|
|
|
{
|
|
@@ -123,199 +124,548 @@ namespace WCS.Service.Works
|
|
|
{
|
|
|
protected override void Do(Device<IDRGV521, IDRGV520, IDRGV523> dev)
|
|
|
{
|
|
|
- if (dev.Data3.Fault != 0)
|
|
|
+ if (dev.Entity.CODE == "RGV4")
|
|
|
{
|
|
|
- if (dev.Entity.WakeupOn(5000))
|
|
|
+ if (dev.Data3.Fault != 0)
|
|
|
{
|
|
|
- WMS.DevInfo(dev.Entity.CODE, dev.Data3.Fault.ToString());
|
|
|
+ if (dev.Entity.WakeupOn(5000))
|
|
|
+ {
|
|
|
+ WMS.DevInfo(dev.Entity.CODE, dev.Data3.Fault.ToString());
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- if (Ltc.Do(dev, v => v.Data2.Trigger_1 != 0 && v.Data2.Trigger_2 != 0)) return;
|
|
|
- if (Ltc.Do(dev, v => v.Data.WorkMode != RGVMode.自动)) return;
|
|
|
- if (Ltc.Do(dev, v => v.Data.SystemStatus != RGVRunStatus.空闲)) return;
|
|
|
+ if (Ltc.Do(dev, v => v.Data2.Trigger_1 != 0 && v.Data2.Trigger_2 != 0)) return;
|
|
|
+ if (Ltc.Do(dev, v => v.Data.WorkMode != RGVMode.自动)) return;
|
|
|
+ if (Ltc.Do(dev, v => v.Data.SystemStatus != RGVRunStatus.空闲)) return;
|
|
|
|
|
|
- #region 放货任务
|
|
|
+ #region 放货任务
|
|
|
|
|
|
- //判断小车是否有工位有光电,小车空闲自动且有光电代表需要执行放货任务
|
|
|
- if (dev.Data.PH_Status_1 || dev.Data.PH_Status_2)
|
|
|
- {
|
|
|
- if (dev.Data.PH_Status_1 && dev.Data.TaskType_1 != DRGVTaskType.放货) //工位一需要放货
|
|
|
+ //判断小车是否有工位有光电,小车空闲自动且有光电代表需要执行放货任务
|
|
|
+ if (dev.Data.PH_Status_1 || dev.Data.PH_Status_2)
|
|
|
{
|
|
|
- if (dev.Data.TaskID_1 < 10000) throw new Exception("有光电无任务号");
|
|
|
- string next = "";
|
|
|
- //获取任务
|
|
|
- DB.Do(db =>
|
|
|
+ if (dev.Data.PH_Status_1 && dev.Data.TaskType_1 != DRGVTaskType.放货) //工位一需要放货
|
|
|
{
|
|
|
- var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Data.TaskID_1) ?? throw new Exception($"WCS不存在任务{dev.Data.TaskID_1}");
|
|
|
- //var next = dev.Entity.GetNext(task.ADDRTO).CODE;
|
|
|
- });
|
|
|
- //TODO:放货站点有货检查
|
|
|
- dev.Data2.TaskID_1 = dev.Data.TaskID_1;
|
|
|
- dev.Data2.TaskType_1 = Convert.ToInt16(DRGVTaskType.放货);
|
|
|
- dev.Data2.DestPosition_1 = dev.Data2.StartPosition_1;
|
|
|
- dev.Data.RES = dev.Data2.StartPosition_1;
|
|
|
- dev.Data2.Trigger_1 = 1;
|
|
|
+ if (dev.Data.TaskID_1 < 10000) throw new Exception("有光电无任务号");
|
|
|
+ //获取任务
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Data.TaskID_1) ?? throw new Exception($"WCS不存在任务{dev.Data.TaskID_1}");
|
|
|
+ });
|
|
|
+ //TODO:放货站点有货检查
|
|
|
+ dev.Data2.TaskID_1 = dev.Data.TaskID_1;
|
|
|
+ dev.Data2.TaskType_1 = Convert.ToInt16(DRGVTaskType.放货);
|
|
|
+ dev.Data2.DestPosition_1 = dev.Data2.StartPosition_1;
|
|
|
+ dev.Data.RES = dev.Data2.StartPosition_1;
|
|
|
+ dev.Data2.Trigger_1 = 1;
|
|
|
+ }
|
|
|
+ else if (dev.Data.PH_Status_2 && dev.Data.TaskType_2 != DRGVTaskType.放货)//工位二需要放货
|
|
|
+ {
|
|
|
+ if (dev.Data.TaskID_2 < 10000) throw new Exception("有光电无任务号");
|
|
|
+ //获取任务
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Data.TaskID_2) ?? throw new Exception($"WCS不存在任务{dev.Data.TaskID_2}");
|
|
|
+ });
|
|
|
+ //TODO:放货站点有货检查
|
|
|
+ dev.Data2.TaskID_2 = dev.Data.TaskID_2;
|
|
|
+ dev.Data2.TaskType_2 = Convert.ToInt16(DRGVTaskType.放货);
|
|
|
+ dev.Data2.DestPosition_2 = dev.Data2.StartPosition_2;
|
|
|
+ dev.Data.RES = dev.Data2.StartPosition_2;
|
|
|
+ dev.Data2.Trigger_2 = 1;
|
|
|
+ }
|
|
|
}
|
|
|
- else if (dev.Data.PH_Status_2 && dev.Data.TaskType_2 != DRGVTaskType.放货)//工位二需要放货
|
|
|
- {
|
|
|
- if (dev.Data.TaskID_2 < 10000) throw new Exception("有光电无任务号");
|
|
|
|
|
|
- string next = "";
|
|
|
- //获取任务
|
|
|
- DB.Do(db =>
|
|
|
+ #endregion 放货任务
|
|
|
+ var station_3046 = Device.Find("3046").Device<IStation521, IStation520>();
|
|
|
+ if (station_3046.Data.PH_STATUS && station_3046.Data.GOODSEND == 3046 && station_3046.Data.TASKNUM > 10000)
|
|
|
+ {
|
|
|
+ var station_2390 = Device.Find("2390").Device<IStation521, IStation520>();
|
|
|
+ var arr = Device.Find("2390", "2391", "2392", "2393", "2394", "2395", "2396", "2397").Select(v => v.Device<IStation521, IStation520>()).ToArray();
|
|
|
+ int count = arr.Where(v => v.Data.PH_STATUS && v.Data.TASKNUM > 10000).Count();
|
|
|
+ if (!station_2390.Data.PH_STATUS && station_2390.Data.TASKNUM == 0 && count < 5)
|
|
|
{
|
|
|
- var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Data.TaskID_2) ?? throw new Exception($"WCS不存在任务{dev.Data.TaskID_2}");
|
|
|
- //var next = dev.Entity.GetNext(task.ADDRTO).CODE;
|
|
|
- });
|
|
|
- //TODO:放货站点有货检查
|
|
|
- dev.Data2.TaskID_2 = dev.Data.TaskID_2;
|
|
|
- dev.Data2.TaskType_2 = Convert.ToInt16(DRGVTaskType.放货);
|
|
|
- dev.Data2.DestPosition_2 = dev.Data2.StartPosition_2;
|
|
|
- //dev.Data2.StartPosition_2 = Convert.ToInt16(next);
|
|
|
- dev.Data.RES = dev.Data2.StartPosition_2;
|
|
|
- dev.Data2.Trigger_2 = 1;
|
|
|
- }
|
|
|
- }
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var task = db.Default.Set<WCS_TASK>().Find(station_3046.Data.TASKNUM);
|
|
|
+ if (task == null)
|
|
|
+ throw new Exception($"任务号{station_3046.Data.TASKNUM}不存在");
|
|
|
+ task.ADDRNEXT = station_2390.Entity.CODE;
|
|
|
+ task.UPDATETIME = DateTime.Now;
|
|
|
+ db.Default.SaveChanges();
|
|
|
+ //station_3060.Data2.TASKNUM = station_3060.Data.TASKNUM;
|
|
|
+ station_3046.Data2.GOODSEND = 2390;
|
|
|
+ station_3046.Data2.CONFIRM = true;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ #region 取货任务
|
|
|
|
|
|
- #endregion 放货任务
|
|
|
+ //获取所有需要取货的站台
|
|
|
+ //获取下一个地址为当前RGV的站台,此处不考虑一台车跑全程
|
|
|
+ var validPickupPoints = Device.Where(v => v.ROUTES.Any(p => p.NEXT.CODE == dev.Entity.CODE)).ToList()
|
|
|
+ .Select(v => v.Device<IStation521, IStation520, IStation523>())
|
|
|
+ .Where(v => v.Data.PH_STATUS && v.Data.TASKNUM > 10000 && !v.Data2.CONFIRM && v.Data.GOODSEND != Convert.ToInt16(v.Entity.CODE))//需要取货的站点
|
|
|
+ .Where(v => //是否可以进行取货,主要用于判断放货位是否有货
|
|
|
+ {
|
|
|
+ var code = v.Data.GOODSEND.ToString();
|
|
|
+ switch (v.Data.GOODSEND)
|
|
|
+ {
|
|
|
+ case 2366: code = "2359"; break; //二车间
|
|
|
+ case 2328: code = "2114"; break; //一车间
|
|
|
+ case 2385: code = "2359"; break; //三车间
|
|
|
+ };
|
|
|
|
|
|
- var station_3033 = Device.Find("3033").Device<IStation521, IStation520>();
|
|
|
- if (station_3033.Data.PH_STATUS && station_3033.Data.GOODSEND == 3033 && station_3033.Data.TASKNUM > 10000)
|
|
|
- {
|
|
|
- var station_3041 = Device.Find("3041").Device<IStation521, IStation520>();
|
|
|
- if (!station_3041.Data.PH_STATUS && station_3041.Data.TASKNUM == 0)
|
|
|
+ var end = Device.Find(code).Device<IStation521>();
|
|
|
+
|
|
|
+ var res = true;
|
|
|
+ if (end.Data.TASKNUM != 0) res = false;
|
|
|
+ else if (end.Data.PH_STATUS) res = false;
|
|
|
+ // RGV可以到达放货地址,此处判断取反
|
|
|
+ else if (!dev.Entity.ROUTES.Any(p => p.NEXT.CODE == end.Entity.CODE)) res = false;
|
|
|
+ else if (dev.Data.PH_Status_1) res = false;
|
|
|
+
|
|
|
+ return res;
|
|
|
+ });
|
|
|
+ if (!validPickupPoints.Any()) return;//不需要取货
|
|
|
+
|
|
|
+ Device<IStation521, IStation520, IStation523> validPickupPoint = null;
|
|
|
+
|
|
|
+ //是否包含小车当前所在站点,写死,如有变动必须改代码
|
|
|
+ //这一块的作用主要是用于解决小车就近取货问题
|
|
|
+
|
|
|
+ #region RGV4
|
|
|
+
|
|
|
+ if (dev.Data.RES is 3035 or 3036) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3035" or "3036");
|
|
|
+ else if (dev.Data.RES is 3041 or 3040) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3041" or "3040");
|
|
|
+ else if (dev.Data.RES is 3047 or 3048) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3045" or "3046");
|
|
|
+ else if (dev.Data.RES is 2108 or 2390) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "2390" or "2108");
|
|
|
+
|
|
|
+ #endregion RGV4
|
|
|
+
|
|
|
+ //当前站点没有需要取货的
|
|
|
+ if (validPickupPoint == null) validPickupPoint = validPickupPoints.OrderBy(v => v.UpdateTime).FirstOrDefault() ?? throw new Exception("没有站台需要取货");
|
|
|
+
|
|
|
+ var next1 = dev.Entity.GetNext(validPickupPoint.Data.GOODSEND.ToString());
|
|
|
+ if (validPickupPoint.Entity.CODE is "2108" or "2114" or "3040" or "3034") //一工位取货点
|
|
|
{
|
|
|
- DB.Do(db =>
|
|
|
- {
|
|
|
- var task = db.Default.Set<WCS_TASK>().Find(station_3033.Data.TASKNUM);
|
|
|
- if (task == null)
|
|
|
- throw new Exception($"任务号{station_3033.Data.TASKNUM}不存在");
|
|
|
- task.ADDRNEXT = station_3041.Entity.CODE;
|
|
|
- task.UPDATETIME = DateTime.Now;
|
|
|
- db.Default.SaveChanges();
|
|
|
- //station_3060.Data2.TASKNUM = station_3060.Data.TASKNUM;
|
|
|
- station_3033.Data2.GOODSEND = 3041;
|
|
|
- station_3033.Data2.CONFIRM = true;
|
|
|
- });
|
|
|
+ dev.Data2.TaskID_1 = validPickupPoint.Data.TASKNUM;//dev.Data.TaskID_1;
|
|
|
+ dev.Data2.TaskType_1 = Convert.ToInt16(DRGVTaskType.取货);
|
|
|
+ dev.Data2.StartPosition_1 = Convert.ToInt16(next1.CODE);
|
|
|
+ dev.Data2.DestPosition_1 = Convert.ToInt16(validPickupPoint.Entity.CODE);
|
|
|
+ dev.Data2.Trigger_1 = 1;
|
|
|
}
|
|
|
- }
|
|
|
- var station_3046 = Device.Find("3046").Device<IStation521, IStation520>();
|
|
|
- if (station_3046.Data.PH_STATUS && station_3046.Data.GOODSEND == 3046 && station_3046.Data.TASKNUM > 10000)
|
|
|
- {
|
|
|
- var station_2390 = Device.Find("2390").Device<IStation521, IStation520>();
|
|
|
- var arr = Device.Find("2390", "2391", "2392", "2393", "2394", "2395", "2396", "2397").Select(v => v.Device<IStation521, IStation520>()).ToArray();
|
|
|
- int count = arr.Where(v => v.Data.PH_STATUS && v.Data.TASKNUM > 10000).Count();
|
|
|
- if (!station_2390.Data.PH_STATUS && station_2390.Data.TASKNUM == 0 && count < 5)
|
|
|
+ else if (validPickupPoint.Entity.CODE is "3046" or "3041" or "3033") //二工位取货点
|
|
|
{
|
|
|
- DB.Do(db =>
|
|
|
- {
|
|
|
- var task = db.Default.Set<WCS_TASK>().Find(station_3046.Data.TASKNUM);
|
|
|
- if (task == null)
|
|
|
- throw new Exception($"任务号{station_3046.Data.TASKNUM}不存在");
|
|
|
- task.ADDRNEXT = station_2390.Entity.CODE;
|
|
|
- task.UPDATETIME = DateTime.Now;
|
|
|
- db.Default.SaveChanges();
|
|
|
- //station_3060.Data2.TASKNUM = station_3060.Data.TASKNUM;
|
|
|
- station_3046.Data2.GOODSEND = 2390;
|
|
|
- station_3046.Data2.CONFIRM = true;
|
|
|
- });
|
|
|
+ dev.Data2.TaskID_2 = validPickupPoint.Data.TASKNUM;
|
|
|
+ dev.Data2.TaskType_2 = Convert.ToInt16(DRGVTaskType.取货);
|
|
|
+ dev.Data2.StartPosition_2 = Convert.ToInt16(next1.CODE);
|
|
|
+ dev.Data2.DestPosition_2 = Convert.ToInt16(validPickupPoint.Entity.CODE);
|
|
|
+ dev.Data2.Trigger_2 = 1;
|
|
|
}
|
|
|
+
|
|
|
+ #endregion 取货任务
|
|
|
}
|
|
|
- var station_3040 = Device.Find("3040").Device<IStation521, IStation520>();
|
|
|
- if (station_3040.Data.PH_STATUS && station_3040.Data.GOODSEND == 3040 && station_3040.Data.TASKNUM > 10000)
|
|
|
+ else if(dev.Entity.CODE == "RGV6")
|
|
|
{
|
|
|
- var station_3034 = Device.Find("3034").Device<IStation521, IStation520>();
|
|
|
- if (!station_3034.Data.PH_STATUS && station_3034.Data.TASKNUM == 0)
|
|
|
+ //正常与之前一样逻辑
|
|
|
+ if (!SystemConfigHelpers.GetDeviceEnabled("CarError"))
|
|
|
{
|
|
|
- DB.Do(db =>
|
|
|
+ if (dev.Data3.Fault != 0)
|
|
|
{
|
|
|
- var task = db.Default.Set<WCS_TASK>().Find(station_3040.Data.TASKNUM);
|
|
|
- if (task == null)
|
|
|
- throw new Exception($"任务号{station_3040.Data.TASKNUM}不存在");
|
|
|
- task.ADDRNEXT = station_3034.Entity.CODE;
|
|
|
- task.UPDATETIME = DateTime.Now;
|
|
|
- db.Default.SaveChanges();
|
|
|
- //station_3060.Data2.TASKNUM = station_3060.Data.TASKNUM;
|
|
|
- station_3040.Data2.GOODSEND = 3034;
|
|
|
- station_3040.Data2.CONFIRM = true;
|
|
|
- });
|
|
|
- }
|
|
|
- }
|
|
|
+ if (dev.Entity.WakeupOn(5000))
|
|
|
+ {
|
|
|
+ WMS.DevInfo(dev.Entity.CODE, dev.Data3.Fault.ToString());
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- #region 取货任务
|
|
|
-
|
|
|
- //获取所有需要取货的站台
|
|
|
- //获取下一个地址为当前RGV的站台,此处不考虑一台车跑全程
|
|
|
- var validPickupPoints = Device.Where(v => v.ROUTES.Any(p => p.NEXT.CODE == dev.Entity.CODE)).ToList()
|
|
|
- .Select(v => v.Device<IStation521, IStation520, IStation523>())
|
|
|
- .Where(v => v.Data.PH_STATUS && v.Data.TASKNUM > 10000 && !v.Data2.CONFIRM && v.Data.GOODSEND != Convert.ToInt16(v.Entity.CODE))//需要取货的站点
|
|
|
- .Where(v => //是否可以进行取货,主要用于判断放货位是否有货
|
|
|
- {
|
|
|
- var code = v.Data.GOODSEND.ToString();
|
|
|
- switch (v.Data.GOODSEND)
|
|
|
- {
|
|
|
- case 2366: code = "2359"; break; //二车间
|
|
|
- case 2328: code = "2114"; break; //一车间
|
|
|
- case 2385: code = "2359"; break; //三车间
|
|
|
- };
|
|
|
+ if (Ltc.Do(dev, v => v.Data2.Trigger_1 != 0 && v.Data2.Trigger_2 != 0)) return;
|
|
|
+ if (Ltc.Do(dev, v => v.Data.WorkMode != RGVMode.自动)) return;
|
|
|
+ if (Ltc.Do(dev, v => v.Data.SystemStatus != RGVRunStatus.空闲)) return;
|
|
|
|
|
|
- var end = Device.Find(code).Device<IStation521>();
|
|
|
+ #region 放货任务
|
|
|
|
|
|
- var res = true;
|
|
|
- if (end.Data.TASKNUM != 0) res = false;
|
|
|
- else if (end.Data.PH_STATUS) res = false;
|
|
|
- // RGV可以到达放货地址,此处判断取反
|
|
|
- else if (!dev.Entity.ROUTES.Any(p => p.NEXT.CODE == end.Entity.CODE)) res = false;
|
|
|
- else if (dev.Data.PH_Status_1) res = false;
|
|
|
+ //判断小车是否有工位有光电,小车空闲自动且有光电代表需要执行放货任务
|
|
|
+ if (dev.Data.PH_Status_1 || dev.Data.PH_Status_2)
|
|
|
+ {
|
|
|
+ if (dev.Data.PH_Status_1 && dev.Data.TaskType_1 != DRGVTaskType.放货) //工位一需要放货
|
|
|
+ {
|
|
|
+ if (dev.Data.TaskID_1 < 10000) throw new Exception("有光电无任务号");
|
|
|
+ string next = "";
|
|
|
+ //获取任务
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Data.TaskID_1) ?? throw new Exception($"WCS不存在任务{dev.Data.TaskID_1}");
|
|
|
+ //var next = dev.Entity.GetNext(task.ADDRTO).CODE;
|
|
|
+ });
|
|
|
+ //TODO:放货站点有货检查
|
|
|
+ dev.Data2.TaskID_1 = dev.Data.TaskID_1;
|
|
|
+ dev.Data2.TaskType_1 = Convert.ToInt16(DRGVTaskType.放货);
|
|
|
+ dev.Data2.DestPosition_1 = dev.Data2.StartPosition_1;
|
|
|
+ dev.Data.RES = dev.Data2.StartPosition_1;
|
|
|
+ dev.Data2.Trigger_1 = 1;
|
|
|
+ }
|
|
|
+ else if (dev.Data.PH_Status_2 && dev.Data.TaskType_2 != DRGVTaskType.放货)//工位二需要放货
|
|
|
+ {
|
|
|
+ if (dev.Data.TaskID_2 < 10000) throw new Exception("有光电无任务号");
|
|
|
|
|
|
- return res;
|
|
|
- });
|
|
|
- if (!validPickupPoints.Any()) return;//不需要取货
|
|
|
+ string next = "";
|
|
|
+ //获取任务
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Data.TaskID_2) ?? throw new Exception($"WCS不存在任务{dev.Data.TaskID_2}");
|
|
|
+ //var next = dev.Entity.GetNext(task.ADDRTO).CODE;
|
|
|
+ });
|
|
|
+ //TODO:放货站点有货检查
|
|
|
+ dev.Data2.TaskID_2 = dev.Data.TaskID_2;
|
|
|
+ dev.Data2.TaskType_2 = Convert.ToInt16(DRGVTaskType.放货);
|
|
|
+ dev.Data2.DestPosition_2 = dev.Data2.StartPosition_2;
|
|
|
+ //dev.Data2.StartPosition_2 = Convert.ToInt16(next);
|
|
|
+ dev.Data.RES = dev.Data2.StartPosition_2;
|
|
|
+ dev.Data2.Trigger_2 = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- Device<IStation521, IStation520, IStation523> validPickupPoint = null;
|
|
|
+ #endregion 放货任务
|
|
|
|
|
|
- //是否包含小车当前所在站点,写死,如有变动必须改代码
|
|
|
- //这一块的作用主要是用于解决小车就近取货问题
|
|
|
+ var station_3033 = Device.Find("3033").Device<IStation521, IStation520>();
|
|
|
+ if (station_3033.Data.PH_STATUS && station_3033.Data.GOODSEND == 3033 && station_3033.Data.TASKNUM > 10000)
|
|
|
+ {
|
|
|
+ var station_3041 = Device.Find("3041").Device<IStation521, IStation520>();
|
|
|
+ if (!station_3041.Data.PH_STATUS && station_3041.Data.TASKNUM == 0)
|
|
|
+ {
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var task = db.Default.Set<WCS_TASK>().Find(station_3033.Data.TASKNUM);
|
|
|
+ if (task == null)
|
|
|
+ throw new Exception($"任务号{station_3033.Data.TASKNUM}不存在");
|
|
|
+ task.ADDRNEXT = station_3041.Entity.CODE;
|
|
|
+ task.UPDATETIME = DateTime.Now;
|
|
|
+ db.Default.SaveChanges();
|
|
|
+ //station_3060.Data2.TASKNUM = station_3060.Data.TASKNUM;
|
|
|
+ station_3033.Data2.GOODSEND = 3041;
|
|
|
+ station_3033.Data2.CONFIRM = true;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ var station_3040 = Device.Find("3040").Device<IStation521, IStation520>();
|
|
|
+ if (station_3040.Data.PH_STATUS && station_3040.Data.GOODSEND == 3040 && station_3040.Data.TASKNUM > 10000)
|
|
|
+ {
|
|
|
+ var station_3034 = Device.Find("3034").Device<IStation521, IStation520>();
|
|
|
+ if (!station_3034.Data.PH_STATUS && station_3034.Data.TASKNUM == 0)
|
|
|
+ {
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var task = db.Default.Set<WCS_TASK>().Find(station_3040.Data.TASKNUM);
|
|
|
+ if (task == null)
|
|
|
+ throw new Exception($"任务号{station_3040.Data.TASKNUM}不存在");
|
|
|
+ task.ADDRNEXT = station_3034.Entity.CODE;
|
|
|
+ task.UPDATETIME = DateTime.Now;
|
|
|
+ db.Default.SaveChanges();
|
|
|
+ //station_3060.Data2.TASKNUM = station_3060.Data.TASKNUM;
|
|
|
+ station_3040.Data2.GOODSEND = 3034;
|
|
|
+ station_3040.Data2.CONFIRM = true;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- #region RGV4
|
|
|
+ #region 取货任务
|
|
|
|
|
|
- if (dev.Data.RES is 3035 or 3036) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3035" or "3036");
|
|
|
- else if (dev.Data.RES is 3041 or 3040) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3041" or "3040");
|
|
|
- else if (dev.Data.RES is 3047 or 3048) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3045" or "3046");
|
|
|
- else if (dev.Data.RES is 2108 or 2390) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "2390" or "2108");
|
|
|
+ //获取所有需要取货的站台
|
|
|
+ //获取下一个地址为当前RGV的站台,此处不考虑一台车跑全程
|
|
|
+ var validPickupPoints = Device.Where(v => v.ROUTES.Any(p => p.NEXT.CODE == dev.Entity.CODE)).ToList()
|
|
|
+ .Select(v => v.Device<IStation521, IStation520, IStation523>())
|
|
|
+ .Where(v => v.Data.PH_STATUS && v.Data.TASKNUM > 10000 && !v.Data2.CONFIRM && v.Data.GOODSEND != Convert.ToInt16(v.Entity.CODE))//需要取货的站点
|
|
|
+ .Where(v => //是否可以进行取货,主要用于判断放货位是否有货
|
|
|
+ {
|
|
|
+ var code = v.Data.GOODSEND.ToString();
|
|
|
+ var end = Device.Find(code).Device<IStation521>();
|
|
|
+ var res = true;
|
|
|
+ if (end.Data.TASKNUM != 0) res = false;
|
|
|
+ else if (end.Data.PH_STATUS) res = false;
|
|
|
+ // RGV可以到达放货地址,此处判断取反
|
|
|
+ else if (!dev.Entity.ROUTES.Any(p => p.NEXT.CODE == end.Entity.CODE)) res = false;
|
|
|
+ else if (dev.Data.PH_Status_1) res = false;
|
|
|
+ return res;
|
|
|
+ });
|
|
|
+ if (!validPickupPoints.Any()) return;//不需要取货
|
|
|
+ Device<IStation521, IStation520, IStation523> validPickupPoint = null;
|
|
|
+ //是否包含小车当前所在站点,写死,如有变动必须改代码
|
|
|
+ //这一块的作用主要是用于解决小车就近取货问题
|
|
|
|
|
|
- #endregion RGV4
|
|
|
+ #region RGV4
|
|
|
|
|
|
- #region RGV6
|
|
|
+ if (dev.Data.RES is 3035 or 3036) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3035" or "3036");
|
|
|
+ else if (dev.Data.RES is 3041 or 3040) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3041" or "3040");
|
|
|
+ else if (dev.Data.RES is 3047 or 3048) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3045" or "3046");
|
|
|
+ else if (dev.Data.RES is 2108 or 2390) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "2390" or "2108");
|
|
|
|
|
|
- else if (dev.Data.RES is 3033 or 3034) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3033" or "3034");
|
|
|
- else if (dev.Data.RES is 3041 or 3040) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3041" or "3040");
|
|
|
+ #endregion RGV4
|
|
|
|
|
|
- #endregion RGV6
|
|
|
+ #region RGV6
|
|
|
|
|
|
- //当前站点没有需要取货的
|
|
|
- if (validPickupPoint == null) validPickupPoint = validPickupPoints.OrderBy(v => v.UpdateTime).FirstOrDefault() ?? throw new Exception("没有站台需要取货");
|
|
|
+ else if (dev.Data.RES is 3033 or 3034) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3033" or "3034");
|
|
|
+ else if (dev.Data.RES is 3041 or 3040) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3041" or "3040");
|
|
|
|
|
|
- var next1 = dev.Entity.GetNext(validPickupPoint.Data.GOODSEND.ToString());
|
|
|
- if (validPickupPoint.Entity.CODE is "2108" or "2114" or "3040" or "3034") //一工位取货点
|
|
|
- {
|
|
|
- dev.Data2.TaskID_1 = validPickupPoint.Data.TASKNUM;//dev.Data.TaskID_1;
|
|
|
- dev.Data2.TaskType_1 = Convert.ToInt16(DRGVTaskType.取货);
|
|
|
- dev.Data2.StartPosition_1 = Convert.ToInt16(next1.CODE);
|
|
|
- dev.Data2.DestPosition_1 = Convert.ToInt16(validPickupPoint.Entity.CODE);
|
|
|
- dev.Data2.Trigger_1 = 1;
|
|
|
- }
|
|
|
- else if (validPickupPoint.Entity.CODE is "3046" or "3041" or "3033") //二工位取货点
|
|
|
- {
|
|
|
- dev.Data2.TaskID_2 = validPickupPoint.Data.TASKNUM;
|
|
|
- dev.Data2.TaskType_2 = Convert.ToInt16(DRGVTaskType.取货);
|
|
|
- dev.Data2.StartPosition_2 = Convert.ToInt16(next1.CODE);
|
|
|
- dev.Data2.DestPosition_2 = Convert.ToInt16(validPickupPoint.Entity.CODE);
|
|
|
- dev.Data2.Trigger_2 = 1;
|
|
|
- }
|
|
|
+ #endregion RGV6
|
|
|
+
|
|
|
+ //当前站点没有需要取货的
|
|
|
+ if (validPickupPoint == null) validPickupPoint = validPickupPoints.OrderBy(v => v.UpdateTime).FirstOrDefault() ?? throw new Exception("没有站台需要取货");
|
|
|
+
|
|
|
+ var next1 = dev.Entity.GetNext(validPickupPoint.Data.GOODSEND.ToString());
|
|
|
+ if (validPickupPoint.Entity.CODE is "3040" or "3034") //一工位取货点
|
|
|
+ {
|
|
|
+ dev.Data2.TaskID_1 = validPickupPoint.Data.TASKNUM;//dev.Data.TaskID_1;
|
|
|
+ dev.Data2.TaskType_1 = Convert.ToInt16(DRGVTaskType.取货);
|
|
|
+ dev.Data2.StartPosition_1 = Convert.ToInt16(next1.CODE);
|
|
|
+ dev.Data2.DestPosition_1 = Convert.ToInt16(validPickupPoint.Entity.CODE);
|
|
|
+ dev.Data2.Trigger_1 = 1;
|
|
|
+ }
|
|
|
+ else if (validPickupPoint.Entity.CODE is "3041" or "3033") //二工位取货点
|
|
|
+ {
|
|
|
+ dev.Data2.TaskID_2 = validPickupPoint.Data.TASKNUM;
|
|
|
+ dev.Data2.TaskType_2 = Convert.ToInt16(DRGVTaskType.取货);
|
|
|
+ dev.Data2.StartPosition_2 = Convert.ToInt16(next1.CODE);
|
|
|
+ dev.Data2.DestPosition_2 = Convert.ToInt16(validPickupPoint.Entity.CODE);
|
|
|
+ dev.Data2.Trigger_2 = 1;
|
|
|
+ }
|
|
|
|
|
|
- #endregion 取货任务
|
|
|
+ #endregion 取货任务
|
|
|
+ }
|
|
|
+ else if(SystemConfigHelpers.GetDeviceIsUsed("RGV6"))
|
|
|
+ {
|
|
|
+ if (dev.Data3.Fault != 0)
|
|
|
+ {
|
|
|
+ if (dev.Entity.WakeupOn(5000))
|
|
|
+ {
|
|
|
+ WMS.DevInfo(dev.Entity.CODE, dev.Data3.Fault.ToString());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (Ltc.Do(dev, v => v.Data2.Trigger_1 != 0 && v.Data2.Trigger_2 != 0)) return;
|
|
|
+ if (Ltc.Do(dev, v => v.Data.WorkMode != RGVMode.自动)) return;
|
|
|
+ if (Ltc.Do(dev, v => v.Data.SystemStatus != RGVRunStatus.空闲)) return;
|
|
|
+
|
|
|
+ //执行任务之前优先处理缓存位上的任务 出:3028、3012 入:3019、3033
|
|
|
+ //有入库的先执行入库,做出库要判断是否有入库
|
|
|
+ var inPort = Device.Find("3019", "3033").Select(v => v.Device<IStation521, IStation520>());
|
|
|
+ var outPort = Device.Find("3028", "3012").Select(v => v.Device<IStation521, IStation520>());
|
|
|
+ var station_3040 = Device.Find("3040").Device<IStation521, IStation520>();
|
|
|
+ var station_3060 = Device.Find("3060").Device<IStation521, IStation520>();
|
|
|
+ var station_3041 = Device.Find("3041").Device<IStation521, IStation520>();
|
|
|
+
|
|
|
+ var station_3019 = Device.Find("3019").Device<IStation521, IStation520>();
|
|
|
+ var station_3033 = Device.Find("3033").Device<IStation521, IStation520>();
|
|
|
+ var station_3028 = Device.Find("3028").Device<IStation521, IStation520>();
|
|
|
+ var station_3012 = Device.Find("3012").Device<IStation521, IStation520>();
|
|
|
+
|
|
|
+ //是否可以执行缓存位的出库任务
|
|
|
+ bool doOut = true;
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var flag = db.Default.Set<WCS_AGVTask>().Any(v => v.TaskType == AGVTaskType.入库 && v.Status <= AGVTaskStatus.完成 && v.Status >= AGVTaskStatus.确认 && v.Status != AGVTaskStatus.执行 && v.Station == "3001");
|
|
|
+ if (flag)
|
|
|
+ {
|
|
|
+ doOut = false;
|
|
|
+ }
|
|
|
+ var inPos = Device.Find("3001", "3004", "3005", "3060").Select(v => v.Device<IStation521, IStation520>());
|
|
|
+ if (inPos.Any(v => v.Data2.CONFIRM == true || (v.Data.PH_STATUS && v.Data.TASKNUM > 0 && (v.Data.GOODSEND is 0 or 1 or 2 or 3 or 3060)))) doOut = false;
|
|
|
+ });
|
|
|
+
|
|
|
+ if (inPort.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM > 0 && !station_3041.Data.PH_STATUS && station_3041.Data.TASKNUM == 0))
|
|
|
+ {
|
|
|
+ if (station_3033.Data.PH_STATUS && station_3033.Data.TASKNUM > 0)
|
|
|
+ {
|
|
|
+ if (station_3041.Data.PH_STATUS || station_3041.Data.TASKNUM > 10000) return;
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var task = db.Default.Set<WCS_TASK>().Find(station_3033.Data.TASKNUM);
|
|
|
+ if (task == null)
|
|
|
+ throw new Exception($"任务号{station_3033.Data.TASKNUM}不存在");
|
|
|
+ task.ADDRNEXT = "3041";
|
|
|
+ task.UPDATETIME = DateTime.Now;
|
|
|
+ db.Default.SaveChanges();
|
|
|
+ });
|
|
|
+ dev.Data2.TaskID_2 = station_3033.Data.TASKNUM;
|
|
|
+ dev.Data2.StartPosition_2 = 3033;
|
|
|
+ dev.Data2.DestPosition_2 = 3041;
|
|
|
+ dev.Data2.Trigger_2 = 1;
|
|
|
+ }
|
|
|
+ else if (station_3019.Data.PH_STATUS && station_3019.Data.TASKNUM > 0)
|
|
|
+ {
|
|
|
+ if (station_3041.Data.PH_STATUS || station_3041.Data.TASKNUM > 10000) return;
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var task = db.Default.Set<WCS_TASK>().Find(station_3019.Data.TASKNUM);
|
|
|
+ if (task == null)
|
|
|
+ throw new Exception($"任务号{station_3019.Data.TASKNUM}不存在");
|
|
|
+ task.ADDRNEXT = "3041";
|
|
|
+ task.UPDATETIME = DateTime.Now;
|
|
|
+ db.Default.SaveChanges();
|
|
|
+ });
|
|
|
+ dev.Data2.TaskID_2 = station_3019.Data.TASKNUM;
|
|
|
+ dev.Data2.StartPosition_2 = 3019;
|
|
|
+ dev.Data2.DestPosition_2 = 3041;
|
|
|
+ dev.Data2.Trigger_2 = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (outPort.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM > 0) && doOut && !station_3060.Data.PH_STATUS && station_3060.Data.TASKNUM == 0)
|
|
|
+ {
|
|
|
+ if (station_3012.Data.PH_STATUS && station_3012.Data.TASKNUM > 0)
|
|
|
+ {
|
|
|
+ if (station_3060.Data.PH_STATUS || station_3060.Data.TASKNUM > 10000) return;
|
|
|
+ var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
|
|
|
+ if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
|
|
|
+ {
|
|
|
+ if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
|
|
|
+ if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
|
|
|
+ if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
|
|
|
+
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var task = db.Default.Set<WCS_TASK>().Find(station_3012.Data.TASKNUM);
|
|
|
+ if (task == null)
|
|
|
+ throw new Exception($"任务号{station_3012.Data.TASKNUM}不存在");
|
|
|
+ task.ADDRNEXT = "3060";
|
|
|
+ task.UPDATETIME = DateTime.Now;
|
|
|
+ db.Default.SaveChanges();
|
|
|
+ //station.Data2.TASKNUM = station.Data.TASKNUM;
|
|
|
+ station_3012.Data2.GOODSEND = 3060;
|
|
|
+ station_3012.Data2.GOODSTYPE = 2;
|
|
|
+ station_3012.Data2.CONFIRM = true;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ dev.Data2.TaskID_1 = station_3012.Data.TASKNUM;
|
|
|
+ dev.Data2.StartPosition_1 = 3012;
|
|
|
+ dev.Data2.DestPosition_1 = 3060;
|
|
|
+ dev.Data2.Trigger_1 = 1;
|
|
|
+ }
|
|
|
+ else if (station_3028.Data.PH_STATUS && station_3028.Data.TASKNUM > 0)
|
|
|
+ {
|
|
|
+ if (station_3060.Data.PH_STATUS || station_3060.Data.TASKNUM > 10000) return;
|
|
|
+ var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
|
|
|
+ if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
|
|
|
+ {
|
|
|
+ if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
|
|
|
+ if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
|
|
|
+ if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var task = db.Default.Set<WCS_TASK>().Find(station_3028.Data.TASKNUM);
|
|
|
+ if (task == null)
|
|
|
+ throw new Exception($"任务号{station_3028.Data.TASKNUM}不存在");
|
|
|
+ task.ADDRNEXT = "3060";
|
|
|
+ task.UPDATETIME = DateTime.Now;
|
|
|
+ db.Default.SaveChanges();
|
|
|
+ //station.Data2.TASKNUM = station.Data.TASKNUM;
|
|
|
+ station_3028.Data2.GOODSEND = 3060;
|
|
|
+ station_3028.Data2.GOODSTYPE = 2;
|
|
|
+ station_3028.Data2.CONFIRM = true;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ dev.Data2.TaskID_1 = station_3028.Data.TASKNUM;
|
|
|
+ dev.Data2.StartPosition_1 = 3028;
|
|
|
+ dev.Data2.DestPosition_1 = 3060;
|
|
|
+ dev.Data2.Trigger_1 = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ #region 放货任务
|
|
|
+
|
|
|
+ //判断小车是否有工位有光电,小车空闲自动且有光电代表需要执行放货任务
|
|
|
+ if (dev.Data.PH_Status_1 || dev.Data.PH_Status_2)
|
|
|
+ {
|
|
|
+ if (dev.Data.PH_Status_1 && dev.Data.TaskType_1 != DRGVTaskType.放货) //工位一需要放货
|
|
|
+ {
|
|
|
+ if (dev.Data.TaskID_1 < 10000) throw new Exception("有光电无任务号");
|
|
|
+ //获取任务
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Data.TaskID_1) ?? throw new Exception($"WCS不存在任务{dev.Data.TaskID_1}");
|
|
|
+ });
|
|
|
+ //TODO:放货站点有货检查
|
|
|
+ dev.Data2.TaskID_1 = dev.Data.TaskID_1;
|
|
|
+ dev.Data2.TaskType_1 = Convert.ToInt16(DRGVTaskType.放货);
|
|
|
+ dev.Data2.DestPosition_1 = dev.Data2.DestPosition_1;
|
|
|
+ dev.Data.RES = dev.Data2.DestPosition_1; ;
|
|
|
+ dev.Data2.Trigger_1 = 1;
|
|
|
+ }
|
|
|
+ else if (dev.Data.PH_Status_2 && dev.Data.TaskType_2 != DRGVTaskType.放货)//工位二需要放货
|
|
|
+ {
|
|
|
+ if (dev.Data.TaskID_2 < 10000) throw new Exception("有光电无任务号");
|
|
|
+ //获取任务
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Data.TaskID_2) ?? throw new Exception($"WCS不存在任务{dev.Data.TaskID_2}");
|
|
|
+ });
|
|
|
+ //TODO:放货站点有货检查
|
|
|
+ dev.Data2.TaskID_2 = dev.Data.TaskID_2;
|
|
|
+ dev.Data2.TaskType_2 = Convert.ToInt16(DRGVTaskType.放货);
|
|
|
+ dev.Data2.DestPosition_2 = dev.Data2.DestPosition_2;
|
|
|
+ dev.Data.RES = dev.Data2.DestPosition_2;
|
|
|
+ dev.Data2.Trigger_2 = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ #endregion 放货任务
|
|
|
+
|
|
|
+ bool isOK = true;
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ //判断是否可以分配RGV出库任务
|
|
|
+ isOK = !db.Default.Set<WCS_AGVTask>().Any(v => v.TaskType == AGVTaskType.入库 && v.Status <= AGVTaskStatus.完成 && v.Status >= AGVTaskStatus.确认 && v.Status != AGVTaskStatus.执行 && v.Station == "3001");
|
|
|
+ var inArr = Device.Find("3001", "3004", "3005", "3006").Select(v => v.Device<IStation521, IStation520>());
|
|
|
+ if (inArr.Any(v => v.Data2.CONFIRM == true || (v.Data.PH_STATUS && v.Data.TASKNUM > 0 && (v.Data.GOODSEND is 0 or 1 or 2 or 3 or 3060)))) isOK = false;
|
|
|
+ });
|
|
|
+
|
|
|
+ #region 取货任务
|
|
|
+ if (station_3040.Data.PH_STATUS && station_3040.Data.GOODSEND == 3040 && station_3040.Data.TASKNUM > 10000 && isOK)
|
|
|
+ {
|
|
|
+ short outTemp = 3060;
|
|
|
+ var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
|
|
|
+ if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
|
|
|
+ {
|
|
|
+ if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
|
|
|
+ if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
|
|
|
+ if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var task = db.Default.Set<WCS_TASK>().Find(station_3040.Data.TASKNUM);
|
|
|
+ if (task == null)
|
|
|
+ throw new Exception($"任务号{station_3040.Data.TASKNUM}不存在");
|
|
|
+ task.ADDRNEXT = outTemp.ToString();
|
|
|
+ task.UPDATETIME = DateTime.Now;
|
|
|
+ db.Default.SaveChanges();
|
|
|
+ station_3040.Data2.GOODSEND = outTemp;
|
|
|
+ station_3040.Data2.GOODSTYPE = 2;
|
|
|
+ station_3040.Data2.CONFIRM = true;
|
|
|
+ });
|
|
|
+ dev.Data2.TaskID_1 = station_3040.Data.TASKNUM;
|
|
|
+ dev.Data2.TaskType_1 = Convert.ToInt16(DRGVTaskType.取货);
|
|
|
+ dev.Data2.StartPosition_1 = 3040;
|
|
|
+ dev.Data2.DestPosition_1 = 3060;
|
|
|
+ dev.Data2.Trigger_1 = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (station_3060.Data.PH_STATUS && station_3060.Data.GOODSEND == 3060 && station_3060.Data.TASKNUM > 10000)
|
|
|
+ {
|
|
|
+ if (station_3041.Data.PH_STATUS || station_3041.Data.TASKNUM > 10000) return;
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var task = db.Default.Set<WCS_TASK>().Find(station_3060.Data.TASKNUM);
|
|
|
+ if (task == null)
|
|
|
+ throw new Exception($"任务号{station_3060.Data.TASKNUM}不存在");
|
|
|
+ task.ADDRNEXT = "3041";
|
|
|
+ task.ADDRTO = "2017";
|
|
|
+ task.UPDATETIME = DateTime.Now;
|
|
|
+ db.Default.SaveChanges();
|
|
|
+ });
|
|
|
+ dev.Data2.TaskID_2 = station_3060.Data.TASKNUM;
|
|
|
+ dev.Data2.StartPosition_2 = 3060;
|
|
|
+ dev.Data2.DestPosition_2 = 3041;
|
|
|
+ dev.Data2.Trigger_2 = 1;
|
|
|
+ }
|
|
|
+ #endregion
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
protected override bool SelectDevice(WCS_DEVICE dev)
|
|
@@ -329,145 +679,554 @@ namespace WCS.Service.Works
|
|
|
{
|
|
|
protected override void Do(Device<IRGV521, IRGV520, IRGV523> dev)
|
|
|
{
|
|
|
- if (dev.Data3.Fault != 0)
|
|
|
+ //没有RGV故障
|
|
|
+ if (!SystemConfigHelpers.GetDeviceEnabled("CarError"))
|
|
|
{
|
|
|
- if (dev.Entity.WakeupOn(5000))
|
|
|
+ if (dev.Data3.Fault != 0)
|
|
|
{
|
|
|
- WMS.DevInfo(dev.Entity.CODE, dev.Data3.Fault.ToString());
|
|
|
+ if (dev.Entity.WakeupOn(5000))
|
|
|
+ {
|
|
|
+ WMS.DevInfo(dev.Entity.CODE, dev.Data3.Fault.ToString());
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- if (Ltc.Do(dev, v => v.Data2.Trigger != 0)) return;
|
|
|
- if (Ltc.Do(dev, v => v.Data.WorkMode != RGVMode.自动)) return;
|
|
|
- if (Ltc.Do(dev, v => v.Data.SystemStatus != RGVRunStatus.空闲)) return;
|
|
|
+ if (Ltc.Do(dev, v => v.Data2.Trigger != 0)) return;
|
|
|
+ if (Ltc.Do(dev, v => v.Data.WorkMode != RGVMode.自动)) return;
|
|
|
+ if (Ltc.Do(dev, v => v.Data.SystemStatus != RGVRunStatus.空闲)) return;
|
|
|
|
|
|
- //分配目标地址
|
|
|
- var station = Device.Find("3012").Device<IStation521, IStation520>();
|
|
|
- var station_3028 = Device.Find("3028").Device<IStation521, IStation520>();
|
|
|
- var station_3019 = Device.Find("3019").Device<IStation521, IStation520>();
|
|
|
- var station_3060 = Device.Find("3060").Device<IStation521, IStation520>();
|
|
|
- if (station_3060.Data.PH_STATUS && station_3060.Data.GOODSEND == 3060 && station_3060.Data.TASKNUM > 10000)
|
|
|
- {
|
|
|
- var station_3013 = Device.Find("3013").Device<IStation521, IStation520>();
|
|
|
- if (!station_3013.Data.PH_STATUS && station_3013.Data.TASKNUM == 0)
|
|
|
+ //分配目标地址
|
|
|
+ var station = Device.Find("3012").Device<IStation521, IStation520>();
|
|
|
+ var station_3028 = Device.Find("3028").Device<IStation521, IStation520>();
|
|
|
+ var station_3019 = Device.Find("3019").Device<IStation521, IStation520>();
|
|
|
+ var station_3060 = Device.Find("3060").Device<IStation521, IStation520>();
|
|
|
+ if (station_3060.Data.PH_STATUS && station_3060.Data.GOODSEND == 3060 && station_3060.Data.TASKNUM > 10000)
|
|
|
{
|
|
|
- DB.Do(db =>
|
|
|
+ var station_3013 = Device.Find("3013").Device<IStation521, IStation520>();
|
|
|
+ if (!station_3013.Data.PH_STATUS && station_3013.Data.TASKNUM == 0)
|
|
|
{
|
|
|
- var task = db.Default.Set<WCS_TASK>().Find(station_3060.Data.TASKNUM);
|
|
|
- if (task == null)
|
|
|
- throw new Exception($"任务号{station_3060.Data.TASKNUM}不存在");
|
|
|
- if (task.TYPE == TaskType.出库) return;
|
|
|
- task.ADDRNEXT = station_3060.Entity.CODE;
|
|
|
- task.ADDRTO = "2017";
|
|
|
- task.UPDATETIME = DateTime.Now;
|
|
|
- db.Default.SaveChanges();
|
|
|
- station_3060.Data2.GOODSEND = 3013;
|
|
|
- station_3060.Data2.CONFIRM = true;
|
|
|
- });
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var task = db.Default.Set<WCS_TASK>().Find(station_3060.Data.TASKNUM);
|
|
|
+ if (task == null)
|
|
|
+ throw new Exception($"任务号{station_3060.Data.TASKNUM}不存在");
|
|
|
+ if (task.TYPE == TaskType.出库) return;
|
|
|
+ task.ADDRNEXT = station_3060.Entity.CODE;
|
|
|
+ task.ADDRTO = "2017";
|
|
|
+ task.UPDATETIME = DateTime.Now;
|
|
|
+ db.Default.SaveChanges();
|
|
|
+ station_3060.Data2.GOODSEND = 3013;
|
|
|
+ station_3060.Data2.CONFIRM = true;
|
|
|
+ });
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
- if (station.Data.PH_STATUS && station.Data.GOODSEND == 3012 && station.Data.TASKNUM > 10000)
|
|
|
- {
|
|
|
- short outTemp = 3060;
|
|
|
- var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
|
|
|
- if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
|
|
|
+ if (station.Data.PH_STATUS && station.Data.GOODSEND == 3012 && station.Data.TASKNUM > 10000)
|
|
|
{
|
|
|
- if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
|
|
|
- if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
|
|
|
- if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
|
|
|
+ short outTemp = 3060;
|
|
|
+ var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
|
|
|
+ if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
|
|
|
+ {
|
|
|
+ if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
|
|
|
+ if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
|
|
|
+ if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
|
|
|
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var task = db.Default.Set<WCS_TASK>().Find(station.Data.TASKNUM);
|
|
|
+ if (task == null)
|
|
|
+ throw new Exception($"任务号{station.Data.TASKNUM}不存在");
|
|
|
+ task.ADDRNEXT = outTemp.ToString();
|
|
|
+ task.UPDATETIME = DateTime.Now;
|
|
|
+ db.Default.SaveChanges();
|
|
|
+ //station.Data2.TASKNUM = station.Data.TASKNUM;
|
|
|
+ station.Data2.GOODSEND = outTemp;
|
|
|
+ station.Data2.GOODSTYPE = 2;
|
|
|
+ station.Data2.CONFIRM = true;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (station_3028.Data.PH_STATUS && station_3028.Data.GOODSEND == 3028 && station_3028.Data.TASKNUM > 10000)
|
|
|
+ {
|
|
|
+ var station_3020 = Device.Find("3020").Device<IStation521, IStation520>();
|
|
|
+ if (!station_3020.Data.PH_STATUS && station_3020.Data.TASKNUM == 0)
|
|
|
+ {
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var task = db.Default.Set<WCS_TASK>().Find(station_3028.Data.TASKNUM);
|
|
|
+ if (task == null)
|
|
|
+ throw new Exception($"任务号{station.Data.TASKNUM}不存在");
|
|
|
+ task.ADDRNEXT = station_3020.Entity.CODE;
|
|
|
+ task.UPDATETIME = DateTime.Now;
|
|
|
+ db.Default.SaveChanges();
|
|
|
+ //station_3028.Data2.TASKNUM = station.Data.TASKNUM;
|
|
|
+ station_3028.Data2.GOODSEND = 3020;
|
|
|
+ station_3028.Data2.CONFIRM = true;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (station_3019.Data.PH_STATUS && station_3019.Data.GOODSEND == 3019 && station_3019.Data.TASKNUM > 10000)
|
|
|
+ {
|
|
|
+ var station_3029 = Device.Find("3029").Device<IStation521, IStation520>();
|
|
|
+ if (!station_3029.Data.PH_STATUS && station_3029.Data.TASKNUM == 0)
|
|
|
+ {
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var task = db.Default.Set<WCS_TASK>().Find(station_3019.Data.TASKNUM);
|
|
|
+ if (task == null)
|
|
|
+ throw new Exception($"任务号{station_3019.Data.TASKNUM}不存在");
|
|
|
+ task.ADDRNEXT = station_3029.Entity.CODE;
|
|
|
+ task.UPDATETIME = DateTime.Now;
|
|
|
+ db.Default.SaveChanges();
|
|
|
+ //station_3019.Data2.TASKNUM = station.Data.TASKNUM;
|
|
|
+ station_3019.Data2.GOODSEND = 3029;
|
|
|
+ station_3019.Data2.CONFIRM = true;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ bool agvTaks = false;
|
|
|
+ if (dev.Entity.CODE == "RGV8")
|
|
|
+ {
|
|
|
DB.Do(db =>
|
|
|
{
|
|
|
- var task = db.Default.Set<WCS_TASK>().Find(station.Data.TASKNUM);
|
|
|
- if (task == null)
|
|
|
- throw new Exception($"任务号{station.Data.TASKNUM}不存在");
|
|
|
- task.ADDRNEXT = outTemp.ToString();
|
|
|
- task.UPDATETIME = DateTime.Now;
|
|
|
- db.Default.SaveChanges();
|
|
|
- //station.Data2.TASKNUM = station.Data.TASKNUM;
|
|
|
- station.Data2.GOODSEND = outTemp;
|
|
|
- station.Data2.GOODSTYPE = 2;
|
|
|
- station.Data2.CONFIRM = true;
|
|
|
+ agvTaks = db.Default.Set<WCS_AGVTask>().Any(v => v.TaskType == AGVTaskType.入库 && v.Status <= AGVTaskStatus.完成 && v.Status >= AGVTaskStatus.确认 && v.Status != AGVTaskStatus.执行 && v.Station == "3001");
|
|
|
+ var station_3060 = Device.Find("3001", "3004", "3005", "3006").Select(v => v.Device<IStation521, IStation520>());
|
|
|
+ if (station_3060.Any(v => v.Data2.CONFIRM == true || (v.Data.PH_STATUS && v.Data.TASKNUM > 0 && (v.Data.GOODSEND is 0 or 1 or 2 or 3 or 3060)))) agvTaks = false;
|
|
|
+
|
|
|
});
|
|
|
- }
|
|
|
+ };
|
|
|
+ //获取所有需要取货的站台
|
|
|
+ //获取下一个地址为当前RGV的站台,此处不考虑一台车跑全程
|
|
|
+ var validPickupPoints = Device.Where(v => v.ROUTES.Any(p => p.NEXT.CODE == dev.Entity.CODE)).ToList()
|
|
|
+ .Select(v => v.Device<IStation521, IStation520, IStation523>())
|
|
|
+ .Where(v => v.Data.PH_STATUS && v.Data.TASKNUM > 10000 && v.Data.GOODSEND != Convert.ToInt16(v.Entity.CODE))//需要取货的站点
|
|
|
+ .Where(v => //是否可以进行取货,主要用于判断放货位是否有货
|
|
|
+ {
|
|
|
+ var end = Device.Find(v.Data.GOODSEND.ToString()).Device<IStation521>();
|
|
|
+ var res = end.Data.TASKNUM == 0 && end.Data.PH_STATUS == false;
|
|
|
+ if (v.Entity.CODE == "3012")
|
|
|
+ {
|
|
|
+ if (agvTaks) res = false;
|
|
|
+ }
|
|
|
+ return res;
|
|
|
+ });
|
|
|
+
|
|
|
+ if (!validPickupPoints.Any()) return;//不需要取货
|
|
|
+
|
|
|
+ var validPickupPoint = validPickupPoints.OrderBy(v => v.UpdateTime).FirstOrDefault() ?? throw new Exception("没有站台需要取货");
|
|
|
+
|
|
|
+ dev.Data2.TaskID = validPickupPoint.Data.TASKNUM;
|
|
|
+ dev.Data2.StartPosition = Convert.ToInt16(validPickupPoint.Entity.CODE);
|
|
|
+ dev.Data2.DestPosition = validPickupPoint.Data.GOODSEND;
|
|
|
+ dev.Data2.Trigger = 1;
|
|
|
}
|
|
|
- if (station_3028.Data.PH_STATUS && station_3028.Data.GOODSEND == 3028 && station_3028.Data.TASKNUM > 10000)
|
|
|
+ else if (SystemConfigHelpers.GetDeviceIsUsed("RGV7") && dev.Entity.CODE == "RGV7")
|
|
|
{
|
|
|
- var station_3020 = Device.Find("3020").Device<IStation521, IStation520>();
|
|
|
- if (!station_3020.Data.PH_STATUS && station_3020.Data.TASKNUM == 0)
|
|
|
+ if (dev.Data3.Fault != 0)
|
|
|
+ {
|
|
|
+ if (dev.Entity.WakeupOn(5000))
|
|
|
+ {
|
|
|
+ WMS.DevInfo(dev.Entity.CODE, dev.Data3.Fault.ToString());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (Ltc.Do(dev, v => v.Data2.Trigger != 0)) return;
|
|
|
+ if (Ltc.Do(dev, v => v.Data.WorkMode != RGVMode.自动)) return;
|
|
|
+ if (Ltc.Do(dev, v => v.Data.SystemStatus != RGVRunStatus.空闲)) return;
|
|
|
+
|
|
|
+ //执行任务之前优先处理缓存位上的任务 出:3028、3012 入:3019、3033
|
|
|
+ //有入库的先执行入库,做出库要判断是否有入库
|
|
|
+ var inPort = Device.Find("3019", "3033").Select(v => v.Device<IStation521, IStation520>());
|
|
|
+ var outPort = Device.Find("3028", "3012").Select(v => v.Device<IStation521, IStation520>());
|
|
|
+ var station_3040 = Device.Find("3040").Device<IStation521, IStation520>();
|
|
|
+ var station_3060 = Device.Find("3060").Device<IStation521, IStation520>();
|
|
|
+ var station_3041 = Device.Find("3041").Device<IStation521, IStation520>();
|
|
|
+
|
|
|
+ var station_3019 = Device.Find("3019").Device<IStation521, IStation520>();
|
|
|
+ var station_3033 = Device.Find("3033").Device<IStation521, IStation520>();
|
|
|
+ var station_3028 = Device.Find("3028").Device<IStation521, IStation520>();
|
|
|
+ var station_3012 = Device.Find("3012").Device<IStation521, IStation520>();
|
|
|
+ //是否可以执行缓存位的出库任务
|
|
|
+ bool doOut = true;
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var flag = db.Default.Set<WCS_AGVTask>().Any(v => v.TaskType == AGVTaskType.入库 && v.Status <= AGVTaskStatus.完成 && v.Status >= AGVTaskStatus.确认 && v.Status != AGVTaskStatus.执行 && v.Station == "3001");
|
|
|
+ if (flag)
|
|
|
+ {
|
|
|
+ doOut = false;
|
|
|
+ }
|
|
|
+ var inPos = Device.Find("3001", "3004", "3005", "3060").Select(v => v.Device<IStation521, IStation520>());
|
|
|
+ if (inPos.Any(v => v.Data2.CONFIRM == true || (v.Data.PH_STATUS && v.Data.TASKNUM > 0 && (v.Data.GOODSEND is 0 or 1 or 2 or 3 or 3060)))) doOut = false;
|
|
|
+ });
|
|
|
+
|
|
|
+ if (inPort.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM > 0 && !station_3041.Data.PH_STATUS && station_3041.Data.TASKNUM == 0))
|
|
|
+ {
|
|
|
+ if (station_3019.Data.PH_STATUS && station_3019.Data.TASKNUM > 0)
|
|
|
+ {
|
|
|
+ if (station_3041.Data.PH_STATUS || station_3041.Data.TASKNUM > 10000) return;
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var task = db.Default.Set<WCS_TASK>().Find(station_3019.Data.TASKNUM);
|
|
|
+ if (task == null)
|
|
|
+ throw new Exception($"任务号{station_3019.Data.TASKNUM}不存在");
|
|
|
+ task.ADDRNEXT = "3041";
|
|
|
+ task.UPDATETIME = DateTime.Now;
|
|
|
+ db.Default.SaveChanges();
|
|
|
+ });
|
|
|
+ dev.Data2.TaskID = station_3019.Data.TASKNUM;
|
|
|
+ dev.Data2.StartPosition = 3019;
|
|
|
+ dev.Data2.DestPosition = 3041;
|
|
|
+ dev.Data2.Trigger = 1;
|
|
|
+ }
|
|
|
+ else if (station_3033.Data.PH_STATUS && station_3033.Data.TASKNUM > 0)
|
|
|
+ {
|
|
|
+ if (station_3041.Data.PH_STATUS || station_3041.Data.TASKNUM > 10000) return;
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var task = db.Default.Set<WCS_TASK>().Find(station_3033.Data.TASKNUM);
|
|
|
+ if (task == null)
|
|
|
+ throw new Exception($"任务号{station_3033.Data.TASKNUM}不存在");
|
|
|
+ task.ADDRNEXT = "3041";
|
|
|
+ task.UPDATETIME = DateTime.Now;
|
|
|
+ db.Default.SaveChanges();
|
|
|
+ });
|
|
|
+ dev.Data2.TaskID = station_3033.Data.TASKNUM;
|
|
|
+ dev.Data2.StartPosition = 3033;
|
|
|
+ dev.Data2.DestPosition = 3041;
|
|
|
+ dev.Data2.Trigger = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (outPort.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM > 0) && doOut && !station_3060.Data.PH_STATUS && station_3060.Data.TASKNUM == 0)
|
|
|
{
|
|
|
+ if (station_3012.Data.PH_STATUS && station_3012.Data.TASKNUM > 0)
|
|
|
+ {
|
|
|
+ if (station_3060.Data.PH_STATUS || station_3060.Data.TASKNUM > 10000) return;
|
|
|
+ var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
|
|
|
+ if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
|
|
|
+ {
|
|
|
+ if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
|
|
|
+ if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
|
|
|
+ if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
|
|
|
+
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var task = db.Default.Set<WCS_TASK>().Find(station_3012.Data.TASKNUM);
|
|
|
+ if (task == null)
|
|
|
+ throw new Exception($"任务号{station_3012.Data.TASKNUM}不存在");
|
|
|
+ task.ADDRNEXT = "3060";
|
|
|
+ task.UPDATETIME = DateTime.Now;
|
|
|
+ db.Default.SaveChanges();
|
|
|
+ //station.Data2.TASKNUM = station.Data.TASKNUM;
|
|
|
+ station_3012.Data2.GOODSEND = 3060;
|
|
|
+ station_3012.Data2.GOODSTYPE = 2;
|
|
|
+ station_3012.Data2.CONFIRM = true;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ dev.Data2.TaskID = station_3012.Data.TASKNUM;
|
|
|
+ dev.Data2.StartPosition = 3012;
|
|
|
+ dev.Data2.DestPosition = 3060;
|
|
|
+ dev.Data2.Trigger = 1;
|
|
|
+ }
|
|
|
+ else if (station_3028.Data.PH_STATUS && station_3028.Data.TASKNUM > 0)
|
|
|
+ {
|
|
|
+ if (station_3060.Data.PH_STATUS || station_3060.Data.TASKNUM > 10000) return;
|
|
|
+ var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
|
|
|
+ if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
|
|
|
+ {
|
|
|
+ if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
|
|
|
+ if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
|
|
|
+ if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var task = db.Default.Set<WCS_TASK>().Find(station_3028.Data.TASKNUM);
|
|
|
+ if (task == null)
|
|
|
+ throw new Exception($"任务号{station_3028.Data.TASKNUM}不存在");
|
|
|
+ task.ADDRNEXT = "3060";
|
|
|
+ task.UPDATETIME = DateTime.Now;
|
|
|
+ db.Default.SaveChanges();
|
|
|
+ //station.Data2.TASKNUM = station.Data.TASKNUM;
|
|
|
+ station_3028.Data2.GOODSEND = 3060;
|
|
|
+ station_3028.Data2.GOODSTYPE = 2;
|
|
|
+ station_3028.Data2.CONFIRM = true;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ dev.Data2.TaskID = station_3028.Data.TASKNUM;
|
|
|
+ dev.Data2.StartPosition = 3028;
|
|
|
+ dev.Data2.DestPosition = 3060;
|
|
|
+ dev.Data2.Trigger = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ bool isOK = false;
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ //判断是否可以分配RGV出库任务
|
|
|
+ var inArr = Device.Find("3001", "3004", "3005", "3060").Select(v => v.Device<IStation521, IStation520>());
|
|
|
+ bool falg = db.Default.Set<WCS_AGVTask>().Any(v => v.TaskType == AGVTaskType.入库 && v.Status <= AGVTaskStatus.完成 && v.Status >= AGVTaskStatus.确认 && v.Status != AGVTaskStatus.执行 && v.Station == "3001");
|
|
|
+ if (falg)
|
|
|
+ {
|
|
|
+ isOK = false;
|
|
|
+ }
|
|
|
+ else if (inArr.Any(v => v.Data2.CONFIRM == true || (v.Data.PH_STATUS && v.Data.TASKNUM > 0 && (v.Data.GOODSEND is 0 or 1 or 2 or 3 or 3060))))
|
|
|
+ {
|
|
|
+ isOK = false;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isOK = true;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ if (isOK && station_3040.Data.PH_STATUS && station_3040.Data.GOODSEND == 3040 && station_3040.Data.TASKNUM > 10000)
|
|
|
+ {
|
|
|
+ short outTemp = 3060;
|
|
|
+ var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
|
|
|
+ if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
|
|
|
+ {
|
|
|
+ if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
|
|
|
+ if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
|
|
|
+ if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
|
|
|
+
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var task = db.Default.Set<WCS_TASK>().Find(station_3040.Data.TASKNUM);
|
|
|
+ if (task == null)
|
|
|
+ throw new Exception($"任务号{station_3040.Data.TASKNUM}不存在");
|
|
|
+ task.ADDRNEXT = outTemp.ToString();
|
|
|
+ task.UPDATETIME = DateTime.Now;
|
|
|
+ db.Default.SaveChanges();
|
|
|
+ station_3040.Data2.GOODSEND = outTemp;
|
|
|
+ station_3040.Data2.GOODSTYPE = 2;
|
|
|
+ station_3040.Data2.CONFIRM = true;
|
|
|
+ });
|
|
|
+ dev.Data2.TaskID = station_3040.Data.TASKNUM;
|
|
|
+ dev.Data2.StartPosition = 3040;
|
|
|
+ dev.Data2.DestPosition = 3060;
|
|
|
+ dev.Data2.Trigger = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (station_3060.Data.PH_STATUS && station_3060.Data.GOODSEND == 3060 && station_3060.Data.TASKNUM > 10000)
|
|
|
+ {
|
|
|
+ if (station_3041.Data.PH_STATUS || station_3041.Data.TASKNUM > 10000) return;
|
|
|
DB.Do(db =>
|
|
|
{
|
|
|
- var task = db.Default.Set<WCS_TASK>().Find(station_3028.Data.TASKNUM);
|
|
|
+ var task = db.Default.Set<WCS_TASK>().Find(station_3060.Data.TASKNUM);
|
|
|
if (task == null)
|
|
|
- throw new Exception($"任务号{station.Data.TASKNUM}不存在");
|
|
|
- task.ADDRNEXT = station_3020.Entity.CODE;
|
|
|
+ throw new Exception($"任务号{station_3060.Data.TASKNUM}不存在");
|
|
|
+ else if (task.TYPE == TaskType.出库 || station_3060.Data.GOODSTYPE == 2) return;
|
|
|
+ task.ADDRNEXT = "3041";
|
|
|
+ task.ADDRTO = "2017";
|
|
|
task.UPDATETIME = DateTime.Now;
|
|
|
db.Default.SaveChanges();
|
|
|
- //station_3028.Data2.TASKNUM = station.Data.TASKNUM;
|
|
|
- station_3028.Data2.GOODSEND = 3020;
|
|
|
- station_3028.Data2.CONFIRM = true;
|
|
|
});
|
|
|
+ dev.Data2.TaskID = station_3060.Data.TASKNUM;
|
|
|
+ dev.Data2.StartPosition = 3060;
|
|
|
+ dev.Data2.DestPosition = 3041;
|
|
|
+ dev.Data2.Trigger = 1;
|
|
|
}
|
|
|
}
|
|
|
- if (station_3019.Data.PH_STATUS && station_3019.Data.GOODSEND == 3019 && station_3019.Data.TASKNUM > 10000)
|
|
|
+ else if (SystemConfigHelpers.GetDeviceIsUsed("RGV8") && dev.Entity.CODE == "RGV8")
|
|
|
{
|
|
|
- var station_3029 = Device.Find("3029").Device<IStation521, IStation520>();
|
|
|
- if (!station_3029.Data.PH_STATUS && station_3029.Data.TASKNUM == 0)
|
|
|
+ if (dev.Data3.Fault != 0)
|
|
|
{
|
|
|
- DB.Do(db =>
|
|
|
+ if (dev.Entity.WakeupOn(5000))
|
|
|
{
|
|
|
- var task = db.Default.Set<WCS_TASK>().Find(station_3019.Data.TASKNUM);
|
|
|
- if (task == null)
|
|
|
- throw new Exception($"任务号{station_3019.Data.TASKNUM}不存在");
|
|
|
- task.ADDRNEXT = station_3029.Entity.CODE;
|
|
|
- task.UPDATETIME = DateTime.Now;
|
|
|
- db.Default.SaveChanges();
|
|
|
- //station_3019.Data2.TASKNUM = station.Data.TASKNUM;
|
|
|
- station_3019.Data2.GOODSEND = 3029;
|
|
|
- station_3019.Data2.CONFIRM = true;
|
|
|
- });
|
|
|
+ WMS.DevInfo(dev.Entity.CODE, dev.Data3.Fault.ToString());
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
+ if (Ltc.Do(dev, v => v.Data2.Trigger != 0)) return;
|
|
|
+ if (Ltc.Do(dev, v => v.Data.WorkMode != RGVMode.自动)) return;
|
|
|
+ if (Ltc.Do(dev, v => v.Data.SystemStatus != RGVRunStatus.空闲)) return;
|
|
|
|
|
|
- bool agvTaks = false;
|
|
|
- if (dev.Entity.CODE == "RGV8")
|
|
|
- {
|
|
|
+ //执行任务之前先处理缓存位上的任务 出:3028、3012 入:3019、3033
|
|
|
+ //有入库的先执行入库,做出库要判断是否有入库
|
|
|
+ var inPort = Device.Find("3019", "3033").Select(v => v.Device<IStation521, IStation520>());
|
|
|
+ var outPort = Device.Find("3028", "3012").Select(v => v.Device<IStation521, IStation520>());
|
|
|
+ var station_3040 = Device.Find("3040").Device<IStation521, IStation520>();
|
|
|
+ var station_3060 = Device.Find("3060").Device<IStation521, IStation520>();
|
|
|
+ var station_3041 = Device.Find("3041").Device<IStation521, IStation520>();
|
|
|
+
|
|
|
+ var station_3019 = Device.Find("3019").Device<IStation521, IStation520>();
|
|
|
+ var station_3033 = Device.Find("3033").Device<IStation521, IStation520>();
|
|
|
+ var station_3028 = Device.Find("3028").Device<IStation521, IStation520>();
|
|
|
+ var station_3012 = Device.Find("3012").Device<IStation521, IStation520>();
|
|
|
+ //是否可以执行缓存位的出库任务
|
|
|
+ bool doOut = true;
|
|
|
DB.Do(db =>
|
|
|
{
|
|
|
- agvTaks = db.Default.Set<WCS_AGVTask>().Any(v => v.TaskType == AGVTaskType.入库 && v.Status <= AGVTaskStatus.完成 && v.Status >= AGVTaskStatus.确认 && v.Status != AGVTaskStatus.执行 && v.Station == "3001");
|
|
|
- var station_3060 = Device.Find("3001", "3004", "3005", "3006").Select(v => v.Device<IStation521, IStation520>());
|
|
|
- if (station_3060.Any(v => v.Data2.CONFIRM == true || (v.Data.PH_STATUS && v.Data.TASKNUM > 0 && (v.Data.GOODSEND is 0 or 1 or 2 or 3 or 3060)))) agvTaks = false;
|
|
|
-
|
|
|
+ var flag = db.Default.Set<WCS_AGVTask>().Any(v => v.TaskType == AGVTaskType.入库 && v.Status <= AGVTaskStatus.完成 && v.Status >= AGVTaskStatus.确认 && v.Status != AGVTaskStatus.执行 && v.Station == "3001");
|
|
|
+ if (flag)
|
|
|
+ {
|
|
|
+ doOut = false;
|
|
|
+ }
|
|
|
+ var inPos = Device.Find("3001", "3004", "3005", "3060").Select(v => v.Device<IStation521, IStation520>());
|
|
|
+ if (inPos.Any(v => v.Data2.CONFIRM == true || (v.Data.PH_STATUS && v.Data.TASKNUM > 0 && (v.Data.GOODSEND is 0 or 1 or 2 or 3 or 3060)))) doOut = false;
|
|
|
});
|
|
|
- };
|
|
|
-
|
|
|
- //获取所有需要取货的站台
|
|
|
- //获取下一个地址为当前RGV的站台,此处不考虑一台车跑全程
|
|
|
- var validPickupPoints = Device.Where(v => v.ROUTES.Any(p => p.NEXT.CODE == dev.Entity.CODE)).ToList()
|
|
|
- .Select(v => v.Device<IStation521, IStation520, IStation523>())
|
|
|
- .Where(v => v.Data.PH_STATUS && v.Data.TASKNUM > 10000 && v.Data.GOODSEND != Convert.ToInt16(v.Entity.CODE))//需要取货的站点
|
|
|
- .Where(v => //是否可以进行取货,主要用于判断放货位是否有货
|
|
|
+
|
|
|
+ if (inPort.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM > 0 && !station_3041.Data.PH_STATUS && station_3041.Data.TASKNUM == 0))
|
|
|
+ {
|
|
|
+ if (station_3019.Data.PH_STATUS && station_3019.Data.TASKNUM > 0)
|
|
|
+ {
|
|
|
+ if (station_3041.Data.PH_STATUS || station_3041.Data.TASKNUM > 10000) return;
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var task = db.Default.Set<WCS_TASK>().Find(station_3019.Data.TASKNUM);
|
|
|
+ if (task == null)
|
|
|
+ throw new Exception($"任务号{station_3019.Data.TASKNUM}不存在");
|
|
|
+ task.ADDRNEXT = "3041";
|
|
|
+ task.UPDATETIME = DateTime.Now;
|
|
|
+ db.Default.SaveChanges();
|
|
|
+ });
|
|
|
+ dev.Data2.TaskID = station_3019.Data.TASKNUM;
|
|
|
+ dev.Data2.StartPosition = 3019;
|
|
|
+ dev.Data2.DestPosition = 3041;
|
|
|
+ dev.Data2.Trigger = 1;
|
|
|
+ }
|
|
|
+ else if (station_3033.Data.PH_STATUS && station_3033.Data.TASKNUM > 0)
|
|
|
+ {
|
|
|
+ if (station_3041.Data.PH_STATUS || station_3041.Data.TASKNUM > 10000) return;
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var task = db.Default.Set<WCS_TASK>().Find(station_3033.Data.TASKNUM);
|
|
|
+ if (task == null)
|
|
|
+ throw new Exception($"任务号{station_3019.Data.TASKNUM}不存在");
|
|
|
+ task.ADDRNEXT = "3041";
|
|
|
+ task.UPDATETIME = DateTime.Now;
|
|
|
+ db.Default.SaveChanges();
|
|
|
+ });
|
|
|
+ dev.Data2.TaskID = station_3033.Data.TASKNUM;
|
|
|
+ dev.Data2.StartPosition = 3033;
|
|
|
+ dev.Data2.DestPosition = 3041;
|
|
|
+ dev.Data2.Trigger = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (outPort.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM > 0 ) && doOut && !station_3060.Data.PH_STATUS && station_3060.Data.TASKNUM == 0)
|
|
|
+ {
|
|
|
+ if (station_3012.Data.PH_STATUS && station_3012.Data.TASKNUM > 0)
|
|
|
+ {
|
|
|
+ if (station_3060.Data.PH_STATUS || station_3060.Data.TASKNUM > 10000) return;
|
|
|
+ var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
|
|
|
+ if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
|
|
|
+ {
|
|
|
+ if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
|
|
|
+ if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
|
|
|
+ if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
|
|
|
+
|
|
|
+ DB.Do(db =>
|
|
|
{
|
|
|
- var end = Device.Find(v.Data.GOODSEND.ToString()).Device<IStation521>();
|
|
|
- var res = end.Data.TASKNUM == 0 && end.Data.PH_STATUS == false;
|
|
|
- if (v.Entity.CODE == "3012")
|
|
|
- {
|
|
|
- if (agvTaks) res = false;
|
|
|
- }
|
|
|
- return res;
|
|
|
+ var task = db.Default.Set<WCS_TASK>().Find(station_3012.Data.TASKNUM);
|
|
|
+ if (task == null)
|
|
|
+ throw new Exception($"任务号{station_3012.Data.TASKNUM}不存在");
|
|
|
+ task.ADDRNEXT = "3060";
|
|
|
+ task.UPDATETIME = DateTime.Now;
|
|
|
+ db.Default.SaveChanges();
|
|
|
+ //station.Data2.TASKNUM = station.Data.TASKNUM;
|
|
|
+ station_3012.Data2.GOODSEND = 3060;
|
|
|
+ station_3012.Data2.GOODSTYPE = 2;
|
|
|
+ station_3012.Data2.CONFIRM = true;
|
|
|
});
|
|
|
+ }
|
|
|
+ dev.Data2.TaskID = station_3012.Data.TASKNUM;
|
|
|
+ dev.Data2.StartPosition = 3012;
|
|
|
+ dev.Data2.DestPosition = 3060;
|
|
|
+ dev.Data2.Trigger = 1;
|
|
|
+ }
|
|
|
+ else if (station_3028.Data.PH_STATUS && station_3028.Data.TASKNUM > 0)
|
|
|
+ {
|
|
|
+ if (station_3060.Data.PH_STATUS || station_3060.Data.TASKNUM > 10000) return;
|
|
|
+ var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
|
|
|
+ if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
|
|
|
+ {
|
|
|
+ if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
|
|
|
+ if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
|
|
|
+ if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var task = db.Default.Set<WCS_TASK>().Find(station_3012.Data.TASKNUM);
|
|
|
+ if (task == null)
|
|
|
+ throw new Exception($"任务号{station_3012.Data.TASKNUM}不存在");
|
|
|
+ task.ADDRNEXT = "3060";
|
|
|
+ task.UPDATETIME = DateTime.Now;
|
|
|
+ db.Default.SaveChanges();
|
|
|
+ //station.Data2.TASKNUM = station.Data.TASKNUM;
|
|
|
+ station_3028.Data2.GOODSEND = 3060;
|
|
|
+ station_3028.Data2.GOODSTYPE = 2;
|
|
|
+ station_3028.Data2.CONFIRM = true;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ dev.Data2.TaskID = station_3028.Data.TASKNUM;
|
|
|
+ dev.Data2.StartPosition = 3028;
|
|
|
+ dev.Data2.DestPosition = 3060;
|
|
|
+ dev.Data2.Trigger = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- if (!validPickupPoints.Any()) return;//不需要取货
|
|
|
+ bool isOK = false;
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ //判断是否可以分配RGV出库任务
|
|
|
+ var inArr = Device.Find("3001", "3004", "3005", "3060").Select(v => v.Device<IStation521, IStation520>());
|
|
|
+ bool falg = db.Default.Set<WCS_AGVTask>().Any(v => v.TaskType == AGVTaskType.入库 && v.Status <= AGVTaskStatus.完成 && v.Status >= AGVTaskStatus.确认 && v.Status != AGVTaskStatus.执行 && v.Station == "3001");
|
|
|
+ if (falg)
|
|
|
+ {
|
|
|
+ isOK = false;
|
|
|
+ }
|
|
|
+ else if (inArr.Any(v => v.Data2.CONFIRM == true || (v.Data.PH_STATUS && v.Data.TASKNUM > 0 && (v.Data.GOODSEND is 0 or 1 or 2 or 3 or 3060))))
|
|
|
+ {
|
|
|
+ isOK = false;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isOK = true;
|
|
|
+ }
|
|
|
+ });
|
|
|
|
|
|
- var validPickupPoint = validPickupPoints.OrderBy(v => v.UpdateTime).FirstOrDefault() ?? throw new Exception("没有站台需要取货");
|
|
|
+
|
|
|
+ if (isOK && station_3040.Data.PH_STATUS && station_3040.Data.GOODSEND == 3040 && station_3040.Data.TASKNUM > 10000)
|
|
|
+ {
|
|
|
+ short outTemp = 3060;
|
|
|
+ var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
|
|
|
+ if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
|
|
|
+ {
|
|
|
+ if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
|
|
|
+ if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
|
|
|
+ if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
|
|
|
|
|
|
- dev.Data2.TaskID = validPickupPoint.Data.TASKNUM;
|
|
|
- dev.Data2.StartPosition = Convert.ToInt16(validPickupPoint.Entity.CODE);
|
|
|
- dev.Data2.DestPosition = validPickupPoint.Data.GOODSEND;
|
|
|
- dev.Data2.Trigger = 1;
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var task = db.Default.Set<WCS_TASK>().Find(station_3040.Data.TASKNUM);
|
|
|
+ if (task == null)
|
|
|
+ throw new Exception($"任务号{station_3040.Data.TASKNUM}不存在");
|
|
|
+ task.ADDRNEXT = outTemp.ToString();
|
|
|
+ task.UPDATETIME = DateTime.Now;
|
|
|
+ db.Default.SaveChanges();
|
|
|
+ station_3040.Data2.GOODSEND = outTemp;
|
|
|
+ station_3040.Data2.GOODSTYPE = 2;
|
|
|
+ station_3040.Data2.CONFIRM = true;
|
|
|
+ });
|
|
|
+ dev.Data2.TaskID = station_3040.Data.TASKNUM;
|
|
|
+ dev.Data2.StartPosition = 3040;
|
|
|
+ dev.Data2.DestPosition = 3060;
|
|
|
+ dev.Data2.Trigger = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (station_3060.Data.PH_STATUS && station_3060.Data.GOODSEND == 3060 && station_3060.Data.TASKNUM > 10000)
|
|
|
+ {
|
|
|
+ if (station_3041.Data.PH_STATUS || station_3041.Data.TASKNUM > 10000) return;
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ var task = db.Default.Set<WCS_TASK>().Find(station_3060.Data.TASKNUM);
|
|
|
+ if (task == null)
|
|
|
+ throw new Exception($"任务号{station_3060.Data.TASKNUM}不存在");
|
|
|
+ else if (task.TYPE == TaskType.出库 || station_3060.Data.GOODSTYPE == 2) return;
|
|
|
+ task.ADDRNEXT = "3041";
|
|
|
+ task.ADDRTO = "2017";
|
|
|
+ task.UPDATETIME = DateTime.Now;
|
|
|
+ db.Default.SaveChanges();
|
|
|
+ });
|
|
|
+ dev.Data2.TaskID = station_3060.Data.TASKNUM;
|
|
|
+ dev.Data2.StartPosition = 3060;
|
|
|
+ dev.Data2.DestPosition = 3041;
|
|
|
+ dev.Data2.Trigger = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
-
|
|
|
protected override bool SelectDevice(WCS_DEVICE dev)
|
|
|
{
|
|
|
return dev.CODE is "RGV7" or "RGV8";
|