123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411 |
- 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<string> FullCacheList = new List<string>();
- 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);
- }
- }
- /// <summary>
- /// 写入任务到穿梭车
- /// </summary>
- /// <param name="rgvwrite">Rgv写入信号</param>
- 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<WCS_TASK>(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<WCS_TASK>(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<WCS_TASK>().Where(v => v.TASK_POSIDNEXT == "1124");
- if (temptasks.Count() >= 4)
- {
- //涂布车间入库任务在缓存线大于等于4个,自动提高优先级
- //修改任务的状态
- SugarBase.DB.Updateable<WCS_TASK>(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);
- }
- /// <summary>
- /// 检测熟化房是否可用
- /// </summary>
- 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<WCS_TASK>().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<WCS_TASK>().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<WCS_TASK>().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;
- }
- /// <summary>
- /// 检测出库位置状态
- /// </summary>
- /// <param name="upPosConvNo">RGV下料点</param>
- /// <param name="requestagvPos">agv对接工位</param>
- /// <param name="requestManualPos">扫描位置</param>
- /// <param name="onMatManualPos">出库缓存位置或入库位置</param>
- /// <returns></returns>
- 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<WCS_TASK>().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<WCS_TASK>().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<WCS_TASK_DTL>().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<string> QueryRoutes(WCS_TASK task, List<string> routeSet)
- {
- var routes = new List<string>();
- 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;
- }
- }
|