using SqlSugar; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using WCS.Data; using WCS.Data.Models; using WCS.Data.Utils; using WCS.PLC.Model.Equipment; namespace WCS.PLC { /// /// 双工位穿梭车 /// public abstract class Base_DualRgv : Base_Rgv { #region Properties //工位1 protected string RgvPosOne { get; set; } //工位2 protected string RgvPosTwo { get; set; } /// /// 工位1上料列表 /// protected List RGVOnPosOneList { get { return RGVOnPosList.Where(t => t.PosOneOnMatIsAvailable).ToList(); } } /// /// 工位2上料列表 /// protected List RGVOnPosTwoList { get { return RGVOnPosList.Where(t => t.PosTwoOnMatIsAvailable).ToList(); } } /// /// 工位1下料列表 /// protected List RGVUpPosOneList { get { return RGVUpPosList.Where(t => t.PosOneUpMatIsAvailable).ToList(); } } /// /// 工位2下料列表 /// protected List RGVUpPosTwoList { get { return RGVUpPosList.Where(t => t.PosTwoUpMatIsAvailable).ToList(); } } #endregion; #region Constructor public Base_DualRgv(string rgvPosOne, string rgvPosTwo) : base() { RgvPosOne = rgvPosOne; RgvPosTwo = rgvPosTwo; } #endregion; #region Method private int _locRgvExecute = 0; public override void Run() { if (Interlocked.Exchange(ref _locRgvExecute, 1) == 0) { try { //RGV完成任务 Rgv_Finish(); Rgv_OnUpMat(); //其它功能 Rgv_OtherExtend(); } catch (Exception ex) { string errormsg = string.Format("Rgv[{0}]执行异常,消息:{1}", PlcName, ex.ToString()); LogMessageHelper.RecordLogMessage(errormsg,ex); } finally { Interlocked.Exchange(ref _locRgvExecute, 0); } } } /// /// RGV上下料 /// internal void Rgv_OnUpMat() { if (Rgv.DB521_SystemStatus != 1) return; if (Rgv.DB521_WorkMode != 1) return; if (string.IsNullOrWhiteSpace(RgvCurrentSition)) return; //是否存在执行的任务 if (SugarBase.DB.Queryable().Any(v => v.TASK_RGVNO == PlcName)) return; //1.就近原则;2.均匀原则;3.优先入库原则;4.优先出库原则;(WMS任务优先级高的任务所有原则失效) //当前仅支持就近原则 foreach (var item in RGVOnUpPosList) { var conv = ConveyorHelper.GetConveyorSignal(item.PLCNAME, item.RGVOUTIN_CONVNO); if ((item.RGVOUTIN_OUTINTYPE == "OnMat" || item.RGVOUTIN_OUTINTYPE == "OnUpMat") && conv.CvDB51_PH_Status) { //上料 if (Rgv_OnMat(item.RGVOUTIN_CONVNO)) break; } else if (item.RGVOUTIN_OUTINTYPE == "UpMat" || item.RGVOUTIN_OUTINTYPE == "OnUpMat") { if((conv.DB521_Tasknum == 0 && conv.CvDB51_PH_Status == false) || (item.IsCheckUpMatPos == false)) { //下料 if (Rgv_UpMat(item.RGVOUTIN_CONVNO)) break; } } } } internal bool Rgv_OnMat(string OnMatSition) { if (Rgv.DB521_PH_Status_1 && Rgv.DB521_PH_Status_2) return false; WCS_TASK wcs_task = null; var rgvPos = RgvPosEnum.一号工位; if (Rgv.DB521_PH_Status_1 == false && Rgv.DB521_Finish_1) { if (RGVOnPosOneList.Any(v => v.RGVOUTIN_CONVNO == OnMatSition)) { wcs_task = Rgv_OnMatCheck_GetTask(OnMatSition, RgvPosEnum.一号工位); } } if (wcs_task == null) { if (Rgv.DB521_PH_Status_2 == false && Rgv.DB521_Finish_2) { if (RGVOnPosTwoList.Any(v => v.RGVOUTIN_CONVNO == OnMatSition)) { wcs_task = Rgv_OnMatCheck_GetTask(OnMatSition, RgvPosEnum.二号工位); rgvPos = RgvPosEnum.二号工位; } } } if (wcs_task == null) return false; var rgvwrite = new WCSWriteToRgvSignal(); rgvwrite.Plc = RgvPlc; rgvwrite.RgvPos = rgvPos; rgvwrite.DBName = WCS_PLCItem.WCS_DBSet.FirstOrDefault(v => v.DB_TypeCh == DB_TypeEnum.WCS可读可写DB).DB_NAME; rgvwrite.RgvNo = PlcName; rgvwrite.WriteStartAddress = rgvPos == RgvPosEnum.一号工位 ? Rgv.EquDbInfo_ReadWrite.DBReadIndox: Rgv.EquDbInfo_ReadWrite.DBReadIndox + 18; rgvwrite.Tasknum = wcs_task.TASK_NO; rgvwrite.StartPosition = rgvPos == RgvPosEnum.一号工位 ? Convert.ToInt32(RgvPosOne) : Convert.ToInt32(RgvPosTwo); rgvwrite.DestPosition = Convert.ToInt32(wcs_task.TASK_POSIDCUR); rgvwrite.TaskType = 1; WriteTaskToRgv(rgvwrite); return true; } protected virtual WCS_TASK Rgv_OnMatCheck_GetTask(string OnMatSition, RgvPosEnum rgvPos) { var task = SugarBase.DB.Queryable().First(v => v.TASK_POSIDCUR == OnMatSition && v.TASK_WKSTATUS == 2 && v.TASK_POSIDTO != OnMatSition); // && v.TASK_POSIDNEXT == OnMatSition if (task != null) { //检测是否有可用的目标地址 var routeSet = EquRouteHelper.QueryRoute(OnMatSition, task.TASK_POSIDTO); var routes = routeSet.Where(v => v.ROUTE_STARTPOS == OnMatSition).ToList(); var rgvoutinSet = new List(); if (rgvPos == RgvPosEnum.一号工位) { rgvoutinSet = RGVUpPosOneList.Where(v => routes.Any(t => t.ROUTE_SONPOS.Substring(0,4) == v.RGVOUTIN_CONVNO)).ToList(); } else if (rgvPos == RgvPosEnum.二号工位) { rgvoutinSet = RGVUpPosTwoList.Where(v => routes.Any(t => t.ROUTE_SONPOS.Substring(0, 4) == v.RGVOUTIN_CONVNO)).ToList(); } bool convIsEmpty = false; foreach (var rgvoutin in rgvoutinSet) { var cs = ConveyorHelper.GetConveyorSignal(rgvoutin.PLCNAME, rgvoutin.RGVOUTIN_CONVNO); if (!rgvoutin.IsCheckUpMatPos)//不需要判断下料点是否有任务 { convIsEmpty = true; break; } else if (cs.CvDB51_PH_Status == false && cs.DB521_Tasknum == 0) { convIsEmpty = true; break; } } if (convIsEmpty) { if (!Rgv_OnMatCheckTask(task, rgvPos, OnMatSition)) { task = null; } } else { //Log4netHelper.Logger_Info.InfoFormat(string.Format("任务[{0}]RGV[{1}]上料点[{2}]不能上料,因为无可用下料点。", task.TASK_NO, PlcName, OnMatSition)); task = null; } } return task; } internal void Rgv_Finish() { if (Rgv.DB521_Finish_1) { var task_1 = Current.TaskSet.FirstOrDefault(v => v.TASK_NO == Rgv.DB521_TaskID_1 && v.TASK_RGVNO == PlcName); if (task_1 != null) { task_1.TASK_RGVNO = string.Empty;//内存中置空 if (task_1.TASK_WKSTATUS == 4) { task_1.TASK_WKSTATUS = (int)WkStatus.RGV完成; SugarBase.DB.Updateable(it => new WCS_TASK() { TASK_RGVNO = "", TASK_WKSTATUS = 9, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now }) .Where(it => it.TASK_NO == Rgv.DB521_TaskID_1) .ExecuteCommand(); } else { SugarBase.DB.Updateable(it => new WCS_TASK() { TASK_RGVNO = "", TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now }) .Where(it => it.TASK_NO == Rgv.DB521_TaskID_1) .ExecuteCommand(); } bool isReducePriority = true;//是否降低优先级(均匀原则) //重新排上料顺序(均匀原则,就近原则) RGVOnPosList.ForEach(item => { if (isReducePriority) { item.EvenOnMat_Sequence = 1;//降低优先级 } else { item.EvenOnMat_Sequence = 0;//提升优先级 } int convNo = Convert.ToInt32(item.RGVOUTIN_CONVNO); if (Rgv.DB521_StartPosition_1 == convNo) { isReducePriority = false; } }); } } if (Rgv.DB521_Finish_2) { var task_2 = Current.TaskSet.FirstOrDefault(v => v.TASK_NO == Rgv.DB521_TaskID_2 && v.TASK_RGVNO == PlcName); if (task_2 != null) { task_2.TASK_RGVNO = string.Empty;//内存中置空 if (task_2.TASK_WKSTATUS == 4) { task_2.TASK_WKSTATUS = (int)WkStatus.RGV完成; SugarBase.DB.Updateable(it => new WCS_TASK() { TASK_RGVNO = "", TASK_WKSTATUS = 9, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now }) .Where(it => it.TASK_NO == Rgv.DB521_TaskID_2) .ExecuteCommand(); } else { SugarBase.DB.Updateable(it => new WCS_TASK() { TASK_RGVNO = "", TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now }) .Where(it => it.TASK_NO == Rgv.DB521_TaskID_2) .ExecuteCommand(); } bool isReducePriority = true;//是否降低优先级(均匀原则) //重新排上料顺序(均匀原则,就近原则) RGVOnPosList.ForEach(item => { if (isReducePriority) { item.EvenOnMat_Sequence = 1;//降低优先级 } else { item.EvenOnMat_Sequence = 0;//提升优先级 } int convNo = Convert.ToInt32(item.RGVOUTIN_CONVNO); if (Rgv.DB521_StartPosition_1 == convNo) { isReducePriority = false; } }); } } Rgv_Complete(); } internal bool Rgv_UpMat(string upMatSition) { if (Rgv.DB521_PH_Status_1 == false && Rgv.DB521_PH_Status_2 == false) return false; WCS_TASK wcs_task = null; var rgvPos = RgvPosEnum.一号工位; if (Rgv.DB521_TaskID_1 > 0 && Rgv.DB521_PH_Status_1 && Rgv.DB521_TaskType_1 == 1 && Rgv.DB521_Finish_1) { var task = Current.TaskSet.FirstOrDefault(v => v.TASK_NO == Rgv.DB521_TaskID_1 && v.TASK_WKSTATUS != 4); if (task != null) { var routeSet = EquRouteHelper.QueryRoute(task.TASK_POSIDNEXT, task.TASK_POSIDTO); var routeList = routeSet.Where(v => v.ROUTE_STARTPOS == task.TASK_POSIDNEXT).ToList(); if (routeList.Any(v => v.ROUTE_SONPOS.Substring(0, 4) == upMatSition)) { if (Rgv_UpMatCheckTask_QueryEndPos(task, rgvPos, upMatSition)) { wcs_task = task; } } } } if (wcs_task == null) { if (Rgv.DB521_TaskID_2 > 0 && Rgv.DB521_PH_Status_2 && Rgv.DB521_TaskType_2 == 1 && Rgv.DB521_Finish_2) { var task = Current.TaskSet.FirstOrDefault(v => v.TASK_NO == Rgv.DB521_TaskID_2 && v.TASK_WKSTATUS != 4); if (task != null) { var routeSet = EquRouteHelper.QueryRoute(task.TASK_POSIDNEXT, task.TASK_POSIDTO); var routeList = routeSet.Where(v => v.ROUTE_STARTPOS == task.TASK_POSIDNEXT).ToList(); if (routeList.Any(v => v.ROUTE_SONPOS.Substring(0, 4) == upMatSition)) { if (Rgv_UpMatCheckTask_QueryEndPos(task, rgvPos, upMatSition)) { wcs_task = task; rgvPos = RgvPosEnum.二号工位; } } } } } if (wcs_task == null) return false; var rgvwrite = new WCSWriteToRgvSignal(); rgvwrite.Plc = RgvPlc; rgvwrite.RgvPos = rgvPos; rgvwrite.DBName = WCS_PLCItem.WCS_DBSet.FirstOrDefault(v => v.DB_TypeCh == DB_TypeEnum.WCS可读可写DB).DB_NAME; rgvwrite.RgvNo = PlcName; rgvwrite.WriteStartAddress = rgvPos == RgvPosEnum.一号工位 ? Rgv.EquDbInfo_ReadWrite.DBReadIndox : Rgv.EquDbInfo_ReadWrite.DBReadIndox + 18; rgvwrite.Tasknum = wcs_task.TASK_NO; rgvwrite.StartPosition = rgvPos == RgvPosEnum.一号工位 ? Convert.ToInt32(RgvPosOne) : Convert.ToInt32(RgvPosTwo); rgvwrite.DestPosition =Convert.ToInt32(upMatSition);//Convert.ToInt32(wcs_task.TASK_POSIDCUR); rgvwrite.TaskType = 2; WriteTaskToRgv(rgvwrite); return true; } #endregion; #region virtual,abstract protected virtual void Rgv_Complete() { } protected virtual bool Rgv_OnMatCheckTask(WCS_TASK onTask, RgvPosEnum rgvPos,string onMatSition) { return true; } protected virtual bool Rgv_UpMatCheckTask_QueryEndPos(WCS_TASK upTask, RgvPosEnum rgvPos,string upMatSition) { return true; } protected abstract void Rgv_OtherExtend(); protected override void UpdateRgvTaskStatus(SqlSugarClient db, WCSWriteToRgvSignal rgvwrite) { var task = db.Queryable().First(t => t.TASK_NO == rgvwrite.Tasknum); string msg = string.Empty; if (rgvwrite.TaskType == 1 || rgvwrite.TaskType == 4 || rgvwrite.TaskType == 7) { //上料 db.Updateable(it => new WCS_TASK() { TASK_WKSTATUS = (int)WkStatus.RGV上料执行, TASK_RGVNO = PlcName, TASK_POSIDNEXT = rgvwrite.DestPosition.ToString(), TASK_ITEM4 = rgvwrite.DestPosition.ToString(), TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now }) .Where(it => it.TASK_NO == task.TASK_NO) .ExecuteCommand(); msg = string.Format("任务[{0}]从输送线[{1}]上料到RGV工位[{2}],已下发给穿梭车[{3}]执行。", rgvwrite.Tasknum, rgvwrite.DestPosition, rgvwrite.StartPosition, rgvwrite.RgvNo); } else if (rgvwrite.TaskType == 2 || rgvwrite.TaskType == 5 || rgvwrite.TaskType == 6) { //下料 db.Updateable(it => new WCS_TASK() { TASK_WKSTATUS = (int)WkStatus.RGV下料执行, TASK_RGVNO = PlcName, TASK_POSIDNEXT = rgvwrite.DestPosition.ToString(), TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now }) .Where(it => it.TASK_NO == task.TASK_NO) .ExecuteCommand(); msg = string.Format("任务[{0}]从RGV工位[{1}]下料到输送线[{2}],已下发给穿梭车[{3}]执行。", rgvwrite.Tasknum, rgvwrite.StartPosition, rgvwrite.DestPosition, rgvwrite.RgvNo); } else { //移动 db.Updateable(it => new WCS_TASK() { TASK_WKSTATUS = (int)WkStatus.RGV移动, TASK_RGVNO = PlcName, TASK_POSIDNEXT = rgvwrite.DestPosition.ToString(), TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now }) .Where(it => it.TASK_NO == task.TASK_NO) .ExecuteCommand(); msg = string.Format("任务[{0}]从RGV工位[{1}]移动到输送线[{2}],已下发给穿梭车[{3}]执行。", rgvwrite.Tasknum, rgvwrite.StartPosition, rgvwrite.DestPosition, rgvwrite.RgvNo); } if (!string.IsNullOrWhiteSpace(msg)) { CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, rgvwrite.DestPosition.ToString(), msg); } } #endregion; #region 过时的代码 internal void Rgv_OnMateriel() { if (Rgv.DB521_Finish_1 == false) return; if (Rgv.DB521_WorkMode != 1) return; if (Rgv.DB521_PH_Status_1 && Rgv.DB521_PH_Status_2) return; //查询待上料的任务信息 var taskSet = SugarBase.DB.Queryable().Where(v => (v.TASK_WKSTATUS == 2) && RGVOnPosList.Any(t => t.RGVOUTIN_CONVNO == v.TASK_POSIDCUR) && (v.TASK_POSIDCUR != v.TASK_POSIDTO)) .OrderBy(v => v.TASK_PRIORITY, OrderByType.Desc) .OrderBy(v => v.TASK_EDITDATETIME); if (taskSet.Count() == 0) return; WCS_TASK task = null; var rgvPos = RgvPosEnum.一号工位; if (Rgv.DB521_PH_Status_1 == false && SugarBase.DB.Queryable().Any(v => (v.TASK_WKSTATUS == 3 || v.TASK_WKSTATUS == 4) && v.TASK_RGVNO == RgvPosOne) == false) { var rgvOnPosList = RGVOnPosList.Where(t => t.PosOneIsAvailable); var tasks = taskSet.Where(v => rgvOnPosList.Any(t => t.RGVOUTIN_CONVNO == v.TASK_POSIDCUR)).ToList(); //1号工位可用 task = Rgv_OnMatCheck_QueryTask(tasks, RgvPosEnum.一号工位); } if (task == null) { if (Rgv.DB521_PH_Status_2 == false && SugarBase.DB.Queryable().Any(v => (v.TASK_WKSTATUS == 3 || v.TASK_WKSTATUS == 4) && v.TASK_RGVNO == RgvPosTwo) == false) { var rgvOnPosList = RGVOnPosList.Where(t => t.PosTwoIsAvailable); var tasks = taskSet.Where(v => rgvOnPosList.Any(t => t.RGVOUTIN_CONVNO == v.TASK_POSIDCUR)).ToList(); //2号工位可用 task = Rgv_OnMatCheck_QueryTask(tasks, RgvPosEnum.二号工位); rgvPos = RgvPosEnum.二号工位; } } if (task == null) return; var rgvwrite = new WCSWriteToRgvSignal(); rgvwrite.Plc = RgvPlc; rgvwrite.RgvPos = rgvPos; rgvwrite.DBName = WCS_PLCItem.WCS_DBSet.FirstOrDefault(v => v.DB_TypeCh == DB_TypeEnum.WCS可读可写DB).DB_NAME; rgvwrite.RgvNo = PlcName; rgvwrite.WriteStartAddress = rgvPos == RgvPosEnum.一号工位 ? Rgv.EquDbInfo_ReadWrite.DBReadIndox : Rgv.EquDbInfo_ReadWrite.DBReadIndox + 18; rgvwrite.Tasknum = task.TASK_NO; rgvwrite.StartPosition = rgvPos == RgvPosEnum.一号工位 ? Convert.ToInt32(RgvPosOne) : Convert.ToInt32(RgvPosTwo); rgvwrite.DestPosition = Convert.ToInt32(task.TASK_POSIDCUR); rgvwrite.TaskType = 1; WriteTaskToRgv(rgvwrite); } internal void Rgv_UpMateriel() { if (Rgv.DB521_Finish_1 == false) return; if (Rgv.DB521_WorkMode != 1) return; if (Rgv.DB521_PH_Status_1 == false && Rgv.DB521_PH_Status_2 == false) return; //查询下料的任务 var taskSet = SugarBase.DB.Queryable().Where(v => v.TASK_POSIDCUR == PlcName).ToList(); if (Rgv.DB521_TaskID_1 > 0 && Rgv.DB521_PH_Status_1 && Rgv.DB521_TaskType_1 == 1) { Rgv_UpMateriel(taskSet, RgvPosEnum.一号工位,Convert.ToInt32(Rgv.DB521_TaskID_1)); } if (Rgv.DB521_TaskID_2 > 0 && Rgv.DB521_PH_Status_2 && Rgv.DB521_TaskType_2 == 1) { Rgv_UpMateriel(taskSet, RgvPosEnum.二号工位, Convert.ToInt32(Rgv.DB521_TaskID_2)); } } private void Rgv_UpMateriel(List taskSet, RgvPosEnum rgvPos, int tasknum) { var task = taskSet.First(v => v.TASK_NO == tasknum); if (task != null && task.TASK_WKSTATUS != 4) { List endPosSet = new List(); var routeSet = EquRouteHelper.QueryRoute(task.TASK_POSIDNEXT, task.TASK_POSIDTO); var routeList = routeSet.Where(v => v.ROUTE_STARTPOS == task.TASK_POSIDNEXT).ToList(); foreach (var routeitem in routeList) { var posinfo_end = RGVUpPosList.FirstOrDefault(v => v.RGVOUTIN_CONVNO == routeitem.ROUTE_SONPOS); var csto = ConveyorHelper.GetConveyorSignal(posinfo_end.PLCNAME, routeitem.ROUTE_SONPOS); if (csto.DB521_Tasknum == 0 && csto.CvDB51_PH_Status == false && csto.DB523_Fault == false) { endPosSet.Add(routeitem.ROUTE_SONPOS); } } if (endPosSet.Count > 0) { string destPosition = Rgv_UpMatCheckTask_QueryEndPos(task, rgvPos, endPosSet); if (string.IsNullOrWhiteSpace(destPosition)) { var rgvwrite = new WCSWriteToRgvSignal(); rgvwrite.Plc = RgvPlc; rgvwrite.RgvPos = rgvPos;//RGV 工位编号 rgvwrite.DBName = WCS_PLCItem.WCS_DBSet.FirstOrDefault(v => v.DB_TypeCh == DB_TypeEnum.WCS可读可写DB).DB_NAME; rgvwrite.RgvNo = PlcName; rgvwrite.WriteStartAddress = rgvPos == RgvPosEnum.一号工位 ? Rgv.EquDbInfo_ReadWrite.DBReadIndox : Rgv.EquDbInfo_ReadWrite.DBReadIndox + 18; rgvwrite.Tasknum = task.TASK_NO; rgvwrite.StartPosition = Convert.ToInt32(RgvPosOne); rgvwrite.DestPosition = Convert.ToInt32(destPosition); rgvwrite.TaskType = 2; WriteTaskToRgv(rgvwrite); } } } } private WCS_TASK Rgv_OnMatCheck_QueryTask(List onTaskSet, RgvPosEnum rgvPos) { WCS_TASK task_result = null; foreach (var task in onTaskSet) { var posinfo_start = RGVOnPosList.FirstOrDefault(v => v.RGVOUTIN_CONVNO == task.TASK_POSIDCUR); var convs = ConveyorHelper.GetConveyorSignal(posinfo_start.PLCNAME, task.TASK_POSIDCUR); //输送线无任务 if (convs.DB521_Tasknum <= 0) continue; //WCS任务不是输送线的任务号 if (convs.DB521_Tasknum != task.TASK_NO) continue; List endPosSet = new List(); var routeSet = EquRouteHelper.QueryRoute(task.TASK_POSIDNEXT, task.TASK_POSIDTO); var routeList = routeSet.Where(v => v.ROUTE_STARTPOS == task.TASK_POSIDCUR).ToList(); foreach (var routeitem in routeList) { var posinfo_end = RGVOnPosList.FirstOrDefault(v => v.RGVOUTIN_CONVNO == routeitem.ROUTE_SONPOS); var csto = ConveyorHelper.GetConveyorSignal(posinfo_end.PLCNAME, routeitem.ROUTE_SONPOS); if (csto.DB521_Tasknum == 0 && csto.CvDB51_PH_Status == false && csto.DB523_Fault == false) { endPosSet.Add(routeitem.ROUTE_SONPOS); } }; if (endPosSet.Count > 0) { if (Rgv_OnMatCheckTask(task, rgvPos, endPosSet)) { task_result = task; break; } } } return task_result; } protected virtual bool Rgv_OnMatCheckTask(WCS_TASK onTask, RgvPosEnum rgvPos, List EndPosSet) { return true; } protected virtual string Rgv_UpMatCheckTask_QueryEndPos(WCS_TASK upTask, RgvPosEnum rgvPos, List EndPosSet) { return EndPosSet.FirstOrDefault(); } #endregion } }