using CentralControl.BaseData; using CentralControl.DBDAO; using CommonFunc; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using XGL.Thrift; namespace CentralControl.App_Code { /// /// 出库暂存点逻辑 /// public class Logic1003OutLocator { /// /// plc 正在读取 /// // bool IsPlcRead { get; set; } Thread InputMaterialThread; PlcHelper plcHelper; string LineNo { get; set; } NodeSetting ScanPoint { get; set; } /// /// 是否运行发车中 /// //bool IsRuning { get; set; } /// /// 当前上件点空车信号 /// NodeSetting OutLocatorPoint { get; set; } /// /// 1号上件点 空车信号 /// NodeSetting otherLocatorPoint1 { get; set; } /// /// 2号上件点 空车信号 /// NodeSetting otherLocatorPoint2 { get; set; } public Logic1003OutLocator(PlcHelper plc, string LineNo) { NodeSetting linenode1 = StaticData.NodeSettingList.FirstOrDefault(t => t.LineCatchArea != null && t.NodeType == 4 && t.LineCatchArea.LineNo == LineNo && t.LineCatchArea.AreaType == 3); this.OutLocatorPoint = StaticData.NodeSettingList.FirstOrDefault(t => t.LineCatchArea != null && t.NodeType == 5 && t.LineCatchArea.LineNo == LineNo && t.LineCatchArea.AreaType == 3); //1号上件点 空车信号 this.otherLocatorPoint1 = StaticData.NodeSettingList.FirstOrDefault(t => t.LineCatchArea != null && t.NodeType == 5 && t.LineCatchArea.LineNo == "1" && t.LineCatchArea.AreaType == 3); //2号上件点 空车信号 this.otherLocatorPoint2 = StaticData.NodeSettingList.FirstOrDefault(t => t.LineCatchArea != null && t.NodeType == 5 && t.LineCatchArea.LineNo == "2" && t.LineCatchArea.AreaType == 3); //IsRuning = true; if (linenode1 != null) { this.ScanPoint = linenode1; } else { Logger logger = new Logger(); logger.Log("创建线体,未找到扫描点位"); } this.LineNo = LineNo; this.plcHelper = plc; ///回写plc状态处理完成,plc会清理数据 object wcsend = this.plcHelper.Read(ScanPoint.PlcSetting5); //if (Convert.ToInt32(wcsend) == 1) //{ //默认启动,清理plc的上位机写入点位值 this.plcHelper.Write(this.ScanPoint.PlcSetting4, 0); this.plcHelper.Write(this.ScanPoint.PlcSetting5, 0); //} this.plcHelper.Write(this.OutLocatorPoint.PlcSetting1, 0); //点位取消 this.plcHelper.Write(this.OutLocatorPoint.PlcSetting2, 0); } /// /// 启动上件扫描监听 /// public void StartPoint() { InputMaterialThread = new Thread(MonitorInLocatorPoint); InputMaterialThread.Start(); } /// /// 出库暂存点 /// /// /// public void MonitorInLocatorPoint() { Logger logger = new Logger(); while (true) { try { ///读取小车号 object carno = this.plcHelper.Read(this.ScanPoint.PlcSetting1); //小车是否到位 object carstate = this.plcHelper.Read(this.ScanPoint.PlcSetting2); //小车是否离开 object carrun = this.plcHelper.Read(this.ScanPoint.PlcSetting3); ///上位机写入岔道信息 object wcsstate = this.plcHelper.Read(this.ScanPoint.PlcSetting4); ///回写plc状态处理完成,plc会清理数据 object wcsend = this.plcHelper.Read(this.ScanPoint.PlcSetting5); //var isoutCar = StaticData.CarRealList.OrderBy(t => t.CreateDt).FirstOrDefault(t => t.IsOutLocator == 1 && t.LocatorArea != null && t.LocatorArea.LineNo == this.LineNo); //if (this.LineNo == "1") //{ // if (isoutCar != null) // { // carno = isoutCar.CarNo; // } // else // { // if (ScanPoint.CarNo != "") // { // carno = Convert.ToInt32(ScanPoint.CarNo); // } // else // { // carno = 0; // } // } //} ///由于1号线 安装不上一个 扫描头 ,所以,这个出库数据由系统自己缓存 if (Convert.ToInt32(carno) > 0 && Convert.ToInt32(wcsend) == 0 && Convert.ToInt32(wcsstate) == 0 && Convert.ToInt32(carstate) == 1 && Convert.ToInt32(carrun) == 0 && StaticData.IsOutCarGo)//&& IsPlcRead == false { StaticData.IsOutCarGo = false; ScanPoint.CarNo = carno.ToString(); logger.Log(this.LineNo + "号线记录小车出库车号" + carno); //IsRuning = true; CarRealInfo car = StaticData.CarRealList.Where(t => t.CarNo == carno.ToString()).FirstOrDefault(); if (car != null) { DBService.AddSystemLog(this.ScanPoint.NodeNo, car); //空车出库 if (car.IsProOutLocator == 0 && (car.OffMaterialId == null || car.OffMaterialId == 0)) { //1003点需要叫车 // object needState = this.plcHelper.Read(this.OutLocatorPoint.PlcSetting3); NodePrecuss nextpro = StaticData.NodeRelation.FirstOrDefault(t => t.PreNodeId == this.ScanPoint.Id && t.NodeValue == 1005); // if (this.LineNo == "2" && needState != null && Convert.ToInt32(needState) > 0) //{ // nextpro = StaticData.NodeRelation.FirstOrDefault(t => t.PreNodeId == this.ScanPoint.Id && t.NodeValue == 1009); //} //car.LocatorNodeId = car.LocatorId; //car.ProLocatorArea = car.LocatorArea; car.IsOver = 1; car.LocatorId = 0; car.LocatorArea = null; car.IsOutLocator = 0; car.CurrNodeId = this.ScanPoint.Id; car.CurrNodeSetting = this.ScanPoint; //car.LocatorNodeId = this.ScanPoint.Id; //car.LocatorNodeSetting = this.ScanPoint; car.OptDt = DateTime.Now; car.IsOver = 1; DBService.ModifyRealCarinfoRecord(car); car.IsOver = 1; lock (StaticData.OutCarLock) { StaticData.IsOutCarGo = false; } this.plcHelper.Write(this.ScanPoint.PlcSetting4, nextpro.AfterNodeSetting.NodeNo); ///回写plc状态处理完成,plc会清理数据 this.plcHelper.Write(this.ScanPoint.PlcSetting5, 1); //this.plcHelper.Write(this.OutLocatorPoint.PlcSetting1, 0); //IsPlcRead = true; logger.Log("node:" + this.ScanPoint.NodeNo + " plc:" + this.ScanPoint.PlcSetting4.PlcNo + " mu:" + nextpro.AfterNodeSetting.NodeNo); } else if (car.IsProOutLocator == 1) //正常下件 { //查找出库扫描产生的出库安排顺序CreateDt, 决定,当前到位的小车,是否是第一个, 不是,等待另一条道的小车到位 var throuthCar = StaticData.CarRealList.Where(t => t.IsProOutLocator == 1 && t.IsOutLocator == 1 && t.IsOver == 0 && t.LocatorArea != null).OrderBy(t => t.CreateDt).FirstOrDefault(); //互斥 逻辑 if (throuthCar.CarNo != car.CarNo) { StaticData.IsOutCarGo = true; logger.Log("逻辑互斥 ,另一个口先出,当前出口" + this.LineNo + " carno:" + car.CarNo + " othercarno:" + throuthCar.CarNo); } else { logger.Log("查找到出库数据,当前执行出库" + this.LineNo + " 小车号:" + car.CarNo + " 物料" + car.MaterialNo); car.IsOver = 1; car.LocatorId = 0; car.IsOutLocator = 0; car.OffMaterialId = 0; car.CurrNodeId = this.ScanPoint.Id; car.CurrNodeSetting = this.ScanPoint; //car.LocatorNodeId = this.ScanPoint.Id; //car.LocatorNodeSetting = this.ScanPoint; car.OptDt = DateTime.Now; DBService.ModifyRealCarinfoRecord(car); //写入出库点位 lock (StaticData.OutCarLock) { StaticData.IsOutCarGo = false; } NodePrecuss nextpro = StaticData.NodeRelation.FirstOrDefault(t => t.PreNodeId == this.ScanPoint.Id && t.NodeValue == 1005); this.plcHelper.Write(this.ScanPoint.PlcSetting4, nextpro.AfterNodeSetting.NodeNo); ///回写plc状态处理完成,plc会清理数据 this.plcHelper.Write(this.ScanPoint.PlcSetting5, 1); //this.plcHelper.Write(this.OutLocatorPoint.PlcSetting1, 0); //IsPlcRead = true; logger.Log("node:" + this.ScanPoint.NodeNo + " plc:" + this.ScanPoint.PlcSetting4.PlcNo + " mu:" + nextpro.AfterNodeSetting.NodeNo); } #region 旧代码 //if (car.OffMaterialId > 0) //{ // OffLineMaterialList offmaterial = null; // lock (StaticData.offMaterialCarLock) // { // //调度出库指令 // offmaterial = StaticData.OffMaterialAreaList.FirstOrDefault(t => t.MaterialNo == car.MaterialNo && t.Number > 0 && t.IsOver == 1); // if (offmaterial != null && offmaterial.Id == car.OffMaterialId) // { // //扣减出库队列的物料数量 // offmaterial.Number -= car.Number; // //箱体正在等待配送 // offmaterial.IsOver = 2; // DBService.UpdateOffLineMaterialList(offmaterial); // } // } //if (offmaterial != null) //{ //car.IsOver = 1; //car.LocatorId = 0; //car.IsOutLocator = 0; //car.OffMaterialId = offmaterial.Id; //car.CurrNodeId = this.ScanPoint.Id; //car.CurrNodeSetting = this.ScanPoint; ////car.LocatorNodeId = this.ScanPoint.Id; ////car.LocatorNodeSetting = this.ScanPoint; //car.OptDt = DateTime.Now; //DBService.ModifyRealCarinfoRecord(car); ////写入出库点位 //NodePrecuss nextpro = StaticData.NodeRelation.FirstOrDefault(t => t.PreNodeId == this.ScanPoint.Id && t.NodeValue == 1005); //this.plcHelper.Write(this.ScanPoint.PlcSetting4, nextpro.AfterNodeSetting.NodeNo); /////回写plc状态处理完成,plc会清理数据 //this.plcHelper.Write(this.ScanPoint.PlcSetting5, 1); //this.plcHelper.Write(this.OutLocatorPoint.PlcSetting1, 0); //IsPlcRead = true; //logger.Log("node:" + this.ScanPoint.NodeNo + " plc:" + this.ScanPoint.PlcSetting4.PlcNo + " mu:" + nextpro.AfterNodeSetting.NodeNo); // IsPlcRead = true; //} //else //{ // // IsPlcRead = false; // logger.Log("未匹配到符合出库物料的小车"); //} //} //else//强制出车 //{ // car.IsOver = 1; // car.LocatorId = 0; // car.IsOutLocator = 0; // car.OffMaterialId = 0; // car.CurrNodeId = this.ScanPoint.Id; // car.CurrNodeSetting = this.ScanPoint; // //car.LocatorNodeId = this.ScanPoint.Id; // //car.LocatorNodeSetting = this.ScanPoint; // car.OptDt = DateTime.Now; // DBService.ModifyRealCarinfoRecord(car); // //写入出库点位 // NodePrecuss nextpro = StaticData.NodeRelation.FirstOrDefault(t => t.PreNodeId == this.ScanPoint.Id && t.NodeValue == 1005); // this.plcHelper.Write(this.ScanPoint.PlcSetting4, nextpro.AfterNodeSetting.NodeNo); // ///回写plc状态处理完成,plc会清理数据 // this.plcHelper.Write(this.ScanPoint.PlcSetting5, 1); // this.plcHelper.Write(this.OutLocatorPoint.PlcSetting1, 0); // IsPlcRead = true; // logger.Log("node:" + this.ScanPoint.NodeNo + " plc:" + this.ScanPoint.PlcSetting4.PlcNo + " mu:" + nextpro.AfterNodeSetting.NodeNo); //} #endregion } else//避让小车 { //判定是否是出库小车 0 避让小车 ,1 指定出库小车 if (this.LineNo == "2") { // car.IsProOutLocator = 0; car.LocatorId = 0; car.LocatorArea = null; car.IsOutLocator = 0; car.CurrNodeId = this.ScanPoint.Id; car.CurrNodeSetting = this.ScanPoint; //car.LocatorNodeId = this.ScanPoint.Id; //car.LocatorNodeSetting = this.ScanPoint; car.OptDt = DateTime.Now; car.IsOver = 1; DBService.ModifyRealCarinfoRecord(car); lock (StaticData.OutCarLock) { StaticData.IsOutCarGo = false; } NodePrecuss nextpro = StaticData.NodeRelation.FirstOrDefault(t => t.PreNodeId == this.ScanPoint.Id && t.NodeValue == 1009); this.plcHelper.Write(this.ScanPoint.PlcSetting4, nextpro.AfterNodeSetting.NodeNo); ///回写plc状态处理完成,plc会清理数据 this.plcHelper.Write(this.ScanPoint.PlcSetting5, 1); // this.plcHelper.Write(this.OutLocatorPoint.PlcSetting1, 0); //IsPlcRead = true; logger.Log("node:" + this.ScanPoint.NodeNo + " plc:" + this.ScanPoint.PlcSetting4.PlcNo + " mu:" + nextpro.AfterNodeSetting.NodeNo); } else//1号仓内 { car.IsOver = 1; car.LocatorId = 0; car.LocatorArea = null; car.IsOutLocator = 0; car.CurrNodeId = this.ScanPoint.Id; car.CurrNodeSetting = this.ScanPoint; //car.LocatorNodeId = this.ScanPoint.Id; //car.LocatorNodeSetting = this.ScanPoint; car.OptDt = DateTime.Now; DBService.ModifyRealCarinfoRecord(car); lock (StaticData.OutCarLock) { StaticData.IsOutCarGo = false; } NodePrecuss nextpro = StaticData.NodeRelation.FirstOrDefault(t => t.PreNodeId == this.ScanPoint.Id && t.NodeValue == 1005); this.plcHelper.Write(this.ScanPoint.PlcSetting4, nextpro.AfterNodeSetting.NodeNo); ///回写plc状态处理完成,plc会清理数据 this.plcHelper.Write(this.ScanPoint.PlcSetting5, 1); // this.plcHelper.Write(this.OutLocatorPoint.PlcSetting1, 0); //IsPlcRead = true; logger.Log("node:" + this.ScanPoint.NodeNo + " plc:" + this.ScanPoint.PlcSetting4.PlcNo + " mu:" + nextpro.AfterNodeSetting.NodeNo); } } DBService.AddSystemLog(this.ScanPoint.NodeNo, car); } else { StaticData.IsOutCarGo = true; logger.Log("未匹配出库物料的小车"); } }//小车移动中指定点位后,并且到位了 else if (Convert.ToInt32(carno) > 0 && Convert.ToInt32(carrun) == 1 && Convert.ToInt32(wcsend) == 1) { ScanPoint.CarNo = ""; lock (StaticData.OutCarLock) { StaticData.IsOutCarGo = true; } //IsPlcRead = false; //IsRuning = false; //CarRealInfo ocar = StaticData.CarRealList.Where(t => t.CarNo == carno.ToString()).FirstOrDefault(); //if (ocar != null) //{ // car.IsOver = 1; logger.Log(" 小车离开了 [" + this.LineNo + "]号上件点"); ///回写plc状态,,plc会清理数据 this.plcHelper.Write(this.ScanPoint.PlcSetting4, 0); ///回写plc状态处理完成,plc会清理数据 this.plcHelper.Write(this.ScanPoint.PlcSetting5, 0); // } } //if (!IsRuning) //{ ///读取小车号 object outlocatorno = this.plcHelper.Read(this.OutLocatorPoint.PlcSetting1); //小车是否到位 ,点位取消 object outlocatorstate = this.plcHelper.Read(this.OutLocatorPoint.PlcSetting2); //查找符合条件的小车,,根据出库队列查找 OffLineMaterialList offmaterialnew = null; CarRealInfo preoffcar = null; // if (Convert.ToInt32(outlocatorno) == 0) if (Convert.ToInt32(outlocatorstate) == 0 && Convert.ToInt32(outlocatorno) == 0) { int isoutCarNumber = StaticData.CarRealList.Where(t => t.IsProOutLocator == 1).Count(); if (isoutCarNumber < 40) { //手动设置出库或者拉回 , 进入下件点 IsProOutLocator>0; 1 下件 ,2 拉回 preoffcar = StaticData.CarRealList.OrderBy(t => t.CreateDt).FirstOrDefault(t => t.IsProOutLocator > 0 && t.IsOutLocator == 0 && t.IsOver == 0 && t.LocatorArea != null && t.LocatorArea.LineNo == this.LineNo); CarRealInfo LocatorCar = null; //重新启动之后,或者手动指定出库 if (preoffcar != null) { //preoffcar.OffMaterialId = 0; } else { lock (StaticData.offMaterialCarLock) { //调度出库指令 offmaterialnew = StaticData.OffMaterialList.FirstOrDefault(t => t.Number > 0 && t.IsOver == 0); if (offmaterialnew != null) { logger.Log("当前扫描物料码:" + offmaterialnew.MaterialNo + " " + offmaterialnew.MaterialDes + " " + offmaterialnew.ProductBarNo); CarRealInfo outcars = null; lock (StaticData.OutLocatorCarLock) { //查找出库队列最后一个小车物料和当前出库的是否是相同的, 相同如果数量一样则扣减 var last_outcar = StaticData.CarRealList.Where(t => t.IsProOutLocator == 1).OrderBy(t => t.CreateDt).LastOrDefault(); if (last_outcar != null && last_outcar.HadNumber > 0) { //如果当前预出库物料时,,如果最后一辆小车,的数量>0,那么判断,是不是和当前预出库物料相同 //如果相同,扣减一,不出新车, 如果不相同,把最后一辆小车数量置零,寻找其他小车出库 if ( last_outcar.MaterialNo == offmaterialnew.MaterialNo ) { outcars = last_outcar; offmaterialnew.Number -= 1; offmaterialnew.CarCode = outcars.CarNo; outcars.IsProOutLocator = 1; outcars.HadNumber -= 1; DBService.UpdateOffLineMaterialList(offmaterialnew); DBService.ModifyRealCarinfoRecord(outcars); logger.Log("出库小车被匹配到的箱体扣减可用数量"); }else { last_outcar.HadNumber = 0; DBService.ModifyRealCarinfoRecord(last_outcar); logger.Log("出库队列最后一辆车的物料和当前不相同,并且数量>0 ,则将小车剩余数量置0"); } } if (outcars == null) { //再匹配库区内的安排出库 var Locators = StaticData.CarRealList.Where(t => t.MaterialNo == offmaterialnew.MaterialNo && t.HadNumber > 0 && t.IsOutLocator == 0 && t.LocatorId > 0 && t.IsProOutLocator == 0 && t.LocatorArea != null && this.LineNo == t.LocatorArea.LineNo).GroupBy(t => t.LocatorId).Select(g => g.OrderBy(f => g.Count())).OrderBy(t => t.Count()).FirstOrDefault(); preoffcar = Locators == null ? null : Locators.OrderBy(t => t.OptDt).FirstOrDefault(); if (preoffcar != null) { offmaterialnew.Number -= 1; offmaterialnew.CarCode = preoffcar.CarNo; preoffcar.IsProOutLocator = 1; preoffcar.HadNumber -= 1; DBService.UpdateOffLineMaterialList(offmaterialnew); //记录第一个匹配到小车的物料 号, 用于判定下一个物料和上一个是否相同 ,如果相同则算同一个车出库 // StaticData.Last_scanMaterial = preoffcar.MaterialNo; // DBService.SetSystemConfigItem("last_scanmaterial", StaticData.Last_scanMaterial); } } //出库队列如果在库位内没有找到匹配,自动算作放弃,匹配下一个 if (outcars == null && preoffcar == null) { logger.Log("[" + this.LineNo + "]号库区没有匹配到响应的库区物料信息" + offmaterialnew.MaterialNo + " " + offmaterialnew.MaterialDes + " " + offmaterialnew.ProductBarNo); if (this.LineNo == "1") { offmaterialnew.LeftNoData = 1; } else { offmaterialnew.RightNoData = 1; } if (offmaterialnew.LeftNoData == 1 && offmaterialnew.RightNoData == 1) { logger.Log("两个库区都没有找到匹配的该物料,该出库箱体作废"); offmaterialnew.IsOver = 1; } DBService.UpdateOffLineMaterialList(offmaterialnew); } } } } } if (preoffcar != null) { //取当前和找到小车同一个库位的小车队列,第一个 ,判定是否是预备出库小车, ,直到找到为止 LocatorCar = StaticData.CarRealList.OrderBy(t => t.OptDt).FirstOrDefault(t => t.LocatorId == preoffcar.LocatorId && t.IsOutLocator == 0 && t.LocatorArea != null && t.LocatorArea.LineNo == this.LineNo); if (LocatorCar != null) { ////是要准备出的小车,正常出库的小车 if (LocatorCar.CarNo == preoffcar.CarNo) { logger.Log(" 当前出库小车相同:" + LocatorCar.CarNo + " 预设出库小车" + preoffcar.CarNo); LocatorCar.HadNumber = preoffcar.HadNumber; LocatorCar.IsProOutLocator = preoffcar.IsProOutLocator; //LocatorCar.OffMaterialId = offmaterialnew == null ? 0 : offmaterialnew.Id; } else//挡在要出库前面的那些个小车 { logger.Log(" 当前出库小车不同:" + LocatorCar.CarNo + " 预设出库小车" + preoffcar.CarNo); LocatorCar.IsProOutLocator = 2; LocatorCar.OffMaterialId = 0; } } } //如果没有需要出库的库位小车,就出一个空车 ,如果当前是2号库区,则判定 1003的小车空车数量不足,,进行叫空车 if (LocatorCar == null) { //上件点呼叫空车预存,,2号等需要呼叫的时候,才放空车, 1号库区,有机会就放 bool isOutCar = false; if (this.LineNo == "1") { object needState1 = this.plcHelper.Read(this.otherLocatorPoint1.PlcSetting3); object needState2 = this.plcHelper.Read(this.otherLocatorPoint2.PlcSetting3); var areaemp = StaticData.CarRealList.Count(t => t.LocatorArea != null && t.LocatorArea.LineNo == this.LineNo && t.MaterialNo == ""); if (areaemp > 0 && (needState1 != null && Convert.ToInt32(needState1) > 0)) { isOutCar = true; } else if (areaemp > 0 && (needState2 != null && Convert.ToInt32(needState2) > 0)) { isOutCar = true; } } else if (this.LineNo == "2") { object needState1 = this.plcHelper.Read(this.otherLocatorPoint1.PlcSetting3); object needState2 = this.plcHelper.Read(this.otherLocatorPoint2.PlcSetting3); //1号库 空车数量 var areaemp1 = StaticData.CarRealList.Count(t => t.LocatorArea != null && t.LocatorArea.LineNo == "1" && t.MaterialNo == ""); //2号库区空车数量 var areaemp2 = StaticData.CarRealList.Count(t => t.LocatorArea != null && t.LocatorArea.LineNo == "2" && t.MaterialNo == ""); if (areaemp2 > 0) { //////1号没有空车了,并且要空车, 或者2号上件口需要空车,2号库区就出空车 ,容易堵死 //if ((areaemp1 <= 0 && needState1 != null && Convert.ToInt32(needState1) > 0) || (needState2 != null && Convert.ToInt32(needState2) > 0)) //{ // isOutCar = true; //} //只有一号库区没有空车的时候, 并且要空车,才会2号库区才会出空车 if ((areaemp1 <= 0 && needState1 != null && Convert.ToInt32(needState1) > 0)) { isOutCar = true; } else if ((areaemp1 <= 0 && areaemp2 >0&& needState2 != null && Convert.ToInt32(needState2) > 0)) { isOutCar = true; } } } // if (this.LineNo == "1") //{ //object needState1 = this.plcHelper.Read(this.otherLocatorPoint1.PlcSetting3); //object needState2 = this.plcHelper.Read(this.otherLocatorPoint2.PlcSetting3); ////1号库区的1002点空车逻辑 ////计算2库区的小车占比 小于30,分配到2库 //var areaemp2 = StaticData.CarRealList.Count(t => t.LocatorArea != null && t.LocatorArea.LineNo == "2" && t.MaterialNo == ""); //var areaemp1 = StaticData.CarRealList.Count(t => t.LocatorArea != null && t.LocatorArea.LineNo == "1" && t.MaterialNo == ""); ////进入2号库区 //if (areaemp1 > 0 && ((needState1 != null && Convert.ToInt32(needState1) > 0)) || ((areaemp2 <= 0 && (needState2 != null && Convert.ToInt32(needState2) > 0)))) //{ // isOutCar = true; //} // } //else //{ //object needState2 = this.plcHelper.Read(this.OutLocatorPoint.PlcSetting3); //object needState1 = this.plcHelper.Read(this.otherLocatorPoint1.PlcSetting3); ////计算1库区的小车数量==0 ,2号库区有车则支援一下 //var areaemp1 = StaticData.CarRealList.Count(t => t.LocatorArea != null && t.LocatorArea.LineNo == "1" && t.MaterialNo == ""); //var areaemp2 = StaticData.CarRealList.Count(t => t.LocatorArea != null && t.LocatorArea.LineNo == "2" && t.MaterialNo == ""); //if (areaemp2 > 0 && (needState2 != null && Convert.ToInt32(needState2) > 0) || (Convert.ToInt32(needState1) > 0 && areaemp1 <= 0)) //{ // isOutCar = true; //} // } if (isOutCar) { // //根据库位分组, 获取空车数量最少的库位 var Locators = StaticData.CarRealList.Where(t => t.MaterialNo == "" && t.IsOutLocator == 0 && t.LocatorId > 0 && t.LocatorArea != null && t.LocatorArea.LineNo == this.LineNo).GroupBy(t => t.LocatorId).Select(g => g.OrderBy(f => g.Count())).OrderBy(t => t.Count()).FirstOrDefault(); var empoutCar = Locators != null ? Locators.OrderBy(t => t.OptDt).FirstOrDefault() : null; if (empoutCar != null) { LocatorCar = StaticData.CarRealList.OrderBy(t => t.OptDt).FirstOrDefault(t => t.LocatorId == empoutCar.LocatorId && t.IsOver == 0 && t.IsOutLocator == 0 && t.LocatorArea != null && t.LocatorArea.LineNo == this.LineNo); if (LocatorCar != null) { ////是要准备出的小车,正常出库的小车 if (LocatorCar.CarNo == empoutCar.CarNo) { LocatorCar.IsProOutLocator = 0; LocatorCar.OffMaterialId = 0; } else//挡在要出库前面的那些个小车 { LocatorCar.IsProOutLocator = 2; LocatorCar.OffMaterialId = 0; } } } //库位号越大, locatorid 越小,所以,空车叫从大库区号叫空车 //var empoutCar = StaticData.CarRealList.OrderByDescending(t => t.LocatorId).ThenBy(t => t.OptDt).FirstOrDefault(t => t.LocatorArea != null && t.LocatorArea.LineNo == this.LineNo && t.MaterialNo == ""); ////取空车逻辑: 每一行库位的第一个是空车的往外出 :废弃 ////var Locators = StaticData.CarRealList.OrderBy(t => t.OptDt).Where(t => t.LocatorArea != null && t.LocatorArea.LineNo == this.LineNo).GroupBy(t => t.LocatorId).Select(g => g.OrderBy(t => t.OptDt).FirstOrDefault()); //取当前和找到小车同一个库位的小车队列,第一个 ,判定是否是预备出库小车, ,直到找到为止 // if (empoutCar != null) // { //LocatorCar = StaticData.CarRealList.OrderBy(t => t.OptDt).FirstOrDefault(t => t.LocatorId == empoutCar.LocatorId && t.IsOver == 0 && t.LocatorArea != null && t.LocatorArea.LineNo == this.LineNo); //if (LocatorCar != null) //{ // ////是要准备出的小车,正常出库的小车 // if (LocatorCar.CarNo == empoutCar.CarNo) // { // LocatorCar.IsProOutLocator = 0; // LocatorCar.OffMaterialId = 0; // } // else//挡在要出库前面的那些个小车 // { // LocatorCar.IsProOutLocator = 2; // LocatorCar.OffMaterialId = 0; // } //} // } } } //有需要出库的 库位小车 if (LocatorCar != null) { DBService.AddSystemLog(LocatorCar.LocatorArea.AreaNo, LocatorCar); //同时库区 ,同一时间,只有一个 isOutLocator 正在出库的小车 logger.Log(this.LineNo + "安排出库小车号" + LocatorCar.CarNo + "携带物料[" + LocatorCar.MaterialNo + ",状态:" + LocatorCar.IsProOutLocator + ",进行库位:" + LocatorCar.LocatorArea.AreaNo + "]"); LocatorCar.IsOutLocator = 1; LocatorCar.IsOver = 0; LocatorCar.CreateDt = DateTime.Now; DBService.ModifyRealCarinfoRecord(LocatorCar); ///如果当前是最后一个小车 ,清空物料设定的规格 int locatornumber = StaticData.CarRealList.Count(t => t.LocatorId == LocatorCar.LocatorId & t.IsOutLocator == 0); if (locatornumber <= 0) { LocatorCar.LocatorArea.MaterialNo = ""; DBService.SetLocatorMaterial(LocatorCar.LocatorId, "", ""); } this.plcHelper.Write(this.OutLocatorPoint.PlcSetting1, LocatorCar.LocatorArea.AreaNo); //IsRuning = false; DBService.AddSystemLog(LocatorCar.LocatorArea.AreaNo, LocatorCar); logger.Log("node:" + this.ScanPoint.NodeNo + " plc:" + this.ScanPoint.PlcSetting4.PlcNo + " mu:" + LocatorCar.LocatorArea.AreaNo); } } else { logger.Log("待出库小车数量超过40台,暂停出库"); } } else if (Convert.ToInt32(outlocatorstate) == 1 && Convert.ToInt32(outlocatorno) > 0) { this.plcHelper.Write(this.OutLocatorPoint.PlcSetting1, 0); logger.Log("出库操作点编号清理"); //IsRuning = true; } // } } catch (Exception ex) { logger.Error("Logic1003OutLocator异常:" + this.ScanPoint.NodeNo + " :" + ex.Message + ex.StackTrace); } Thread.Sleep(2000); } } } }