using System; using System.Collections.Generic; using System.Linq; using System.Threading; using WCS.Data; using WCS.Data.Models; using WCS.Data.Utils; using WCS.PLC; using WCS.PLC.Model.Equipment; namespace WCS.Workflow { public class Rgv02 : Base_SingleRgv { private List FullCacheList = new List(); private readonly string conv_1508 = "1508"; private readonly string conv_1509 = "1509"; private readonly string conv_1136 = "1136"; private readonly string conv_1137 = "1137"; private readonly string conv_1138 = "1138"; private readonly string conv_1139 = "1139"; private readonly string matureRoom = "MatureRoom"; private readonly string rgv1135 = "rgv1135"; #region Constructor public Rgv02() : base() { FullCacheList.Add("Pvc_5_Full01"); FullCacheList.Add("Pvc_5_Full02"); FullCacheList.Add("Pvc_4_Full01"); FullCacheList.Add("Pvc_4_Full02"); FullCacheList.Add("1114");//7号车间入口 FullCacheList.Add("1109");//6号车间入口 FullCacheList.Add("1102");//5号车间入口 FullCacheList.Add("1094");//4号车间入口 } #endregion; #region Method protected override void RgvRunFinish_Other() { try { //if (PlcName == "rgv1091") //{ // SingLetonClass.ReleaseLock_Pvc_4(); //} //else if (PlcName == "rgv1089") //{ // SingLetonClass.ReleaseLock_Pvc_5(); // SingLetonClass.ReleaseLock_Pvc_6(); // SingLetonClass.ReleaseLock_Pvc_7(); //} } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } /// /// 写入任务到穿梭车 /// /// Rgv写入信号 protected override void WriteTaskToRgv(WCSWriteToRgvSignal rgvwrite) { var task = Current.TaskSet.FirstOrDefault(v => v.TASK_NO == rgvwrite.Tasknum); if (FullCacheList.Contains(task.TASK_POSIDFROM) && PlcName== rgv1135) { if (rgvwrite.StartPosition == 1133 && (rgvwrite.DestPosition == 1140 || rgvwrite.DestPosition == 1142)) { //if ((DateTime.Now.Hour == 8 && DateTime.Now.Minute >= 30) || (DateTime.Now.Hour > 8 && DateTime.Now.Hour < 14)) //{ var syssetitem = Current.SysSets.FirstOrDefault(v => v.SET_TYPE == matureRoom && v.SET_ID == conv_1508); if (syssetitem.SET_VALUE == "0") { if (CheckMatureRoom(task, conv_1136, conv_1508)) { rgvwrite.DestPosition = 1136; //入库任务修改任务的目标地址为srm if (task.TASK_COMTYPE == 1) { SugarBase.DB.Updateable(it => new WCS_TASK() { TASK_POSIDTO = "srm", TASK_SRMNO = "srm", TASK_EndTunnelNum = "", MatureNum = 1 }) .Where(it => it.TASK_NO == rgvwrite.Tasknum) .ExecuteCommand(); } } } syssetitem = Current.SysSets.FirstOrDefault(v => v.SET_TYPE == matureRoom && v.SET_ID == conv_1509); if (syssetitem.SET_VALUE == "0") { if (CheckMatureRoom(task, conv_1138, conv_1509)) { rgvwrite.DestPosition = 1138; //入库任务修改任务的目标地址为srm if (task.TASK_COMTYPE == 1) { SugarBase.DB.Updateable(it => new WCS_TASK() { TASK_POSIDTO = "srm", TASK_SRMNO = "srm", TASK_EndTunnelNum = "", MatureNum = 1 }) .Where(it => it.TASK_NO == rgvwrite.Tasknum) .ExecuteCommand(); } } } //} } } if ((rgvwrite.StartPosition == 1133 || rgvwrite.StartPosition == 1137 || rgvwrite.StartPosition == 1139) && (rgvwrite.DestPosition == 1140 || rgvwrite.DestPosition == 1142)) { if (task.TASK_PRIORITY <= 0) { var temptasks = SugarBase.DB.Queryable().Where(v => v.TASK_POSIDNEXT == "1124"); if (temptasks.Count() >= 4) { //涂布车间入库任务在缓存线大于等于4个,自动提高优先级 //修改任务的状态 SugarBase.DB.Updateable(it => new WCS_TASK() { TASK_PRIORITY = 1, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now }) .Where(it => it.TASK_NO == task.TASK_NO) .ExecuteCommand(); } } } base.WriteTaskToRgv(rgvwrite); } /// /// 检测熟化房是否可用 /// private bool CheckMatureRoom(WCS_TASK task,string inconvNo,string matureRoomNo) { var upPos = RGVOnUpPosList.FirstOrDefault(v => v.RGVOUTIN_CONVNO == inconvNo); var conv = ConveyorHelper.GetConveyorSignal(upPos.PLCNAME, upPos.RGVOUTIN_CONVNO); var matureConv = ConveyorHelper.GetConveyorSignal(upPos.PLCNAME, matureRoomNo); if (task.TASK_MatureType != 1) return false;//熟化房熟化类型 if (conv.DB521_Tasknum > 0) return false; if (conv.CvDB51_PH_Status) return false; //if (conv.DB521_Request) return false; if (matureConv.DB521_Goodstype != 1) return false;//检测是否在线 if (matureConv.DB521_Goodssize != task.TASK_MatureDate) return false;//检测烘烤时间是否正确 //if (matureConv.DB521_Goodsstart != 1) return false;//检测是否自动状态 //if (matureConv.DB521_Goodsend == 1) return false;//切线中,不能出库到熟化 if (matureConv.DB521_Res04 == 0) return false;//熟化房温度不能为零 decimal minTemperat = task.TASK_MatureTemperat - 5;//最小温度要求 decimal maxTemperat = task.TASK_MatureTemperat + 5;//最大温度要求 if (matureConv.DB521_Res04 < minTemperat) return false; if (matureConv.DB521_Res04 > maxTemperat) return false; //var mature_InTask= Current.TaskSet.Where(v => v.TASK_MatureDate == matureConv.DB521_Goodssize && v.TASK_MatureTemperat <= matureConv.DB521_Res04 && v.TASK_MatureType == 1 && v.TASK_COMTYPE == 1).ToList(); //var mature_OutTaskCount = Current.TaskSet.Count(v => v.TASK_POSIDTO == matureRoomNo); //if ((mature_InTask.Count+ mature_OutTaskCount) < 60) //{ // if (mature_InTask.Any(v => v.TASK_NO == task.TASK_NO)) // { // return true; // } //} return true; } #region 穿梭车上料条件检测 protected override bool CheckOnTaskToPos(WCS_TASK task, string onPosConvNo) { if (onPosConvNo == "1460") { var onUpitem = RGVOnUpPosList.FirstOrDefault(v => v.RGVOUTIN_CONVNO == onPosConvNo); var conv = ConveyorHelper.GetConveyorSignal(onUpitem.PLCNAME, onPosConvNo); if (conv.DB521_Goodsend != 14600) { return false; } } return base.CheckOnTaskToPos(task, onPosConvNo); } #endregion; #region 穿梭车下料条件检测 protected override bool CheckUpTaskToPos(WCS_TASK task, string upPosConvNo) { string matureRoomOut = string.Empty; if (upPosConvNo == "1136") { matureRoomOut = "1137"; } else if (upPosConvNo == "1138") { matureRoomOut = "1139"; } if (!string.IsNullOrWhiteSpace(matureRoomOut)) { var onitem = RGVOnUpPosList.FirstOrDefault(v => v.RGVOUTIN_CONVNO == matureRoomOut); var conv = ConveyorHelper.GetConveyorSignal(onitem.PLCNAME, matureRoomOut); var taskitem = Current.TaskSet.FirstOrDefault(v => v.TASK_NO == conv.DB521_Tasknum && v.TASK_COMTYPE == 2 && v.MatureNum.GetValueOrDefault() > 1); if (taskitem != null && task.TASK_NO != conv.DB521_Tasknum) { string message = string.Format("任务[{0}]稍后执行,需要优先执行熟化房循环熟化任务[{1}]", task.TASK_NO, taskitem.TASK_NO); LogMessageHelper.RecordLogMessage(message, true, LogLevelEnum.INFO.ToString()); return false; } } if (upPosConvNo == "1099")//5号车间 { //if (CheckUpTask_1099(upPosConvNo) == false) return false; if (CheckUpTask_4_5(upPosConvNo, "1104", "1102", "1105") == false) return false; } else if (upPosConvNo == "1092")//4号车间 { if (CheckUpTask_4_5(upPosConvNo, "1097", "1094", "1098") == false) return false; } else if (upPosConvNo == "1504")//6号车间 { if (CheckUpTask(upPosConvNo, "1107", "1109", "1110") == false) return false; } else if (upPosConvNo == "1518")//7号车间 { if (CheckUpTask(upPosConvNo, "1112", "1114", "1115") == false) return false; } if (task.TASK_POSIDCUR == "1117" && task.TASK_POSIDTO.Contains(srm) && upPosConvNo != "1124") { return false; } else if (task.TASK_COMTYPE == 1 && (task.TASK_POSIDFROM == "1288" || task.TASK_POSIDFROM == "1293") && PlcName == "rgv1220" && (upPosConvNo != "1221")) { return false; } else if (task.TASK_POSIDFROM == "1185" && task.TASK_POSIDTO == "1199" && PlcName == "rgv1220" && upPosConvNo != "1221") { return false; } return base.CheckUpTaskToPos(task, upPosConvNo); } private bool CheckUpTask_4_5(string upPosConvNo,string agvConvPosNo,string scanningConvNo,string cachePosNo) { //判断出口是否存在入库的任务 if (SugarBase.DB.Queryable().Any(v => v.TASK_COMTYPE == 1 && v.TASK_POSIDNEXT == upPosConvNo)) { return false; } var onUpitem = RGVOnUpPosList.FirstOrDefault(v => v.RGVOUTIN_CONVNO == upPosConvNo); var conv = ConveyorHelper.GetConveyorSignal(onUpitem.PLCNAME, upPosConvNo); //判断下料点是否存在入库任务请求,光电和任务 if (conv.DB521_Request || conv.CvDB51_PH_Status || conv.DB521_Tasknum > 0) { return false; } var conv_scann = ConveyorHelper.GetConveyorSignal(onUpitem.PLCNAME, scanningConvNo); //判断扫描位置是否存在光电信号 if (conv_scann.CvDB51_PH_Status || conv_scann.DB521_Request || conv_scann.DB521_Tasknum > 0) { return false; } //判断是否存在原膜托盘的出库任务 var taskSet = SugarBase.DB.Queryable().Where(v => v.TASK_COMTYPE == 2 && (v.TASK_POSIDNEXT == agvConvPosNo || v.TASK_POSIDNEXT == cachePosNo || v.TASK_POSIDNEXT == upPosConvNo)).ToList(); if (taskSet.Count >= 2 && taskSet.Any(v => v.TASK_BOXBARCODE.Substring(0, 3) == "TPC")) { string[] orderArr = new string[] { agvConvPosNo, scanningConvNo, cachePosNo, upPosConvNo }; taskSet = taskSet.OrderByDescending(e => { var index = 0; index = Array.IndexOf(orderArr, e.TASK_POSIDCUR); if (index != -1) { return index; } else { return int.MaxValue; } }).ToList(); //检测从二个开始任务列表中是否存在TPC托盘 for (int i = 1; i < taskSet.Count; i++) { if (taskSet[i].TASK_BOXBARCODE.Substring(0, 3) == "TPC") return false; } } //判断是否存在AGV的入库任务 if (SugarBase.DB.Queryable().Any(v => v.TASK_COMTYPE == 1 && (v.TASK_WKSTATUS == (int)WkStatus.任务已下发AGV || v.TASK_WKSTATUS == (int)WkStatus.AGV任务完成))) { if (taskSet.Count >= 1) { return false; } } return true; } /// /// 检测出库位置状态 /// /// RGV下料点 /// agv对接工位 /// 扫描位置 /// 出库缓存位置或入库位置 /// private bool CheckUpTask(string upPosConvNo,string requestagvPos,string requestManualPos,string onMatManualPos) { string plc_name = "conveyor02"; //查询Agv对接口输送线信息 var conv_agv = ConveyorHelper.GetConveyorSignal(plc_name, requestagvPos); if (conv_agv.DB521_Request || conv_agv.DB521_Goodsend == Convert.ToInt32(upPosConvNo)) { return false; } //查询扫码位置 var conv_scanning = ConveyorHelper.GetConveyorSignal(plc_name, requestManualPos); if (conv_scanning.DB521_Request || conv_scanning.DB521_Goodsend == Convert.ToInt32(upPosConvNo)) { return false; } //判断出口是否存在入库的任务 if (SugarBase.DB.Queryable().Any(v => v.TASK_COMTYPE == 1 && (v.TASK_POSIDFROM == requestagvPos || v.TASK_POSIDFROM == requestManualPos) && (v.TASK_WKSTATUS <= 1 || v.TASK_POSIDNEXT == upPosConvNo))) { return false; } //判断是否存在原膜托盘的出库任务 var taskSet = SugarBase.DB.Queryable().Where(v => v.TASK_COMTYPE == 2 && (v.TASK_POSIDNEXT == requestagvPos || v.TASK_POSIDNEXT == onMatManualPos || v.TASK_POSIDNEXT == upPosConvNo)).ToList(); if (taskSet.Count >= 2 && taskSet.Any(v => v.TASK_BOXBARCODE.Substring(0, 3) == "TPC")) { //var task_dtl = SugarBase.DB.Queryable().Where(v => taskSet.Any(t => t.TASK_NO == v.TASKNO)).OrderBy(v => v.EXECUTEDATE).First(); //if (taskSet.First(v => v.TASK_NO == task_dtl.TASKNO).TASK_BOXBARCODE.Substring(0, 3) == "TPC") //{ // return false; //} if (taskSet.Any(v => v.TASK_POSIDNEXT == onMatManualPos)) { return false; } } if (taskSet.Count == 1) { //查询人工上熟化架位置是否存在任务 var conv_Manual = ConveyorHelper.GetConveyorSignal(plc_name, onMatManualPos); if (conv_Manual.DB521_Tasknum > 0 && conv_Manual.DB521_Tasknum < 10000 || conv_Manual.DB521_Request) { return false; } } return true; } #endregion; protected override List QueryRoutes(WCS_TASK task, List routeSet) { var routes = new List(); if (FullCacheList.Contains(task.TASK_POSIDFROM) && PlcName == rgv1135) { var syssetitem = Current.SysSets.FirstOrDefault(v => v.SET_TYPE == matureRoom && v.SET_ID == conv_1508); if (syssetitem.SET_VALUE == "0") { if (CheckMatureRoom(task, conv_1136, conv_1508)) { routes.Add(conv_1136); } } syssetitem = Current.SysSets.FirstOrDefault(v => v.SET_TYPE == matureRoom && v.SET_ID == conv_1509); if (syssetitem.SET_VALUE == "0") { if (CheckMatureRoom(task, conv_1138, conv_1509)) { routes.Add(conv_1138); } } } if (routes.Count > 0) { return routes; } else { return base.QueryRoutes(task, routeSet); } } #region 其它功能 protected override void Rgv_OtherExtend() { //throw new NotImplementedException(); } #endregion; #endregion; } }