| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438 | using System;using System.Collections.Generic;using System.Data;using System.Linq;using WCS.Data;using WCS.Data.Models;using WCS.Data.Utils;using WCS.PLC;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 Constructor        #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 || rgvwrite.DestPosition == 1166))                {                    //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 || rgvwrite.DestPosition == 1166))            {                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);            DataTable dt = WCSWorkflow.QueryMatureRoomDifferenti(matureRoomNo);            DataTable dtTemperature = WCSWorkflow.QueryMatureRoomTemperature(matureRoomNo);            var MatureRoomMinTemperat = dt.Rows[0]["content"].ToString();            var MatureRoomMaxTemperat = dt.Rows[0]["default1"].ToString();            var MatureRoomTemperature = dtTemperature.Rows[0]["content"].ToString();            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 (!MatureRoomTemperature.ToString().Contains(matureConv.DB521_Goodssize.ToString())) return false;            // if(matureConv.DB521_Goodssize)            //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 - Convert.ToDecimal(MatureRoomMinTemperat);//最小温度要求            //decimal maxTemperat = task.TASK_MatureTemperat + Convert.ToDecimal(MatureRoomMaxTemperat);//最大温度要求            decimal minTemperat = Convert.ToDecimal(MatureRoomMinTemperat);//最小温度要求            decimal maxTemperat = Convert.ToDecimal(MatureRoomMaxTemperat);//最大温度要求            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;            //熟化类型为不需要熟化并且输送线为1166            if (task.TASK_MatureType != 0 && upPosConvNo == "1166")            {                return false;            }            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 Method    }}
 |