using CentralControl.BaseData; using CommonFunc; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using CentralControl.DBDAO; using XGL.Thrift; namespace CentralControl.App_Code { /// /// 入库暂存区逻辑 /// public class Logic1006EmptyLocator { /// /// 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 Logic1006EmptyLocator(PlcHelper plc, string nodeno) { try { this.ScanPoint = StaticData.NodeSettingList.FirstOrDefault(t => t.NodeNo == nodeno); if (this.ScanPoint != null) { this.LineNo = this.ScanPoint.LineCatchArea != null ? this.ScanPoint.LineCatchArea.LineNo : "1"; } 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); // } } catch (Exception ex) { Console.WriteLine("站点" + nodeno + " 初始化数据异常" + ex.Message); Logger logger = new Logger(); logger.Error("站点" + nodeno + " 初始化数据异常" + ex.Message); } } /// /// 启动上件扫描监听 /// public void StartPoint() { InputMaterialThread = new Thread(MonitorInLocatorPoint); InputMaterialThread.Start(); } /// /// 前端点击放行,放行小车队列 /// /// /// public void MonitorInLocatorPoint() { Logger logger = new Logger(); while (true) { try { ///读取小车号 object carobj = this.plcHelper.Read(this.ScanPoint.PlcSetting1); string carno = Common.getCarNoByPlcPoint(carobj); //小车是否到位 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); if (carno != null && carstate != null && carrun != null && wcsstate != null && wcsend != null) { if (Convert.ToInt32(carno) > 0 && Convert.ToInt32(wcsend) == 0 && Convert.ToInt32(wcsstate) == 0 && Convert.ToInt32(carstate) == 1 && Convert.ToInt32(carrun) == 0 && IsPlcRead == false) { CarRealInfo car = StaticData.CarRealList.Where(t => t.CarNo == carno.ToString()).FirstOrDefault(); /**测试数据**/ //car.LocatorArea = new LineCatchArea(); //car.LocatorArea.AreaNo = "1"; DBService.AddSystemLog(this.ScanPoint.NodeNo, car); var emptyids1 = StaticData.LineCatchAreaList.Where(t => t.AreaType == 5 && t.LineNo == "1").Select(t => t.Id).ToArray(); var emptyids2 = StaticData.LineCatchAreaList.Where(t => t.AreaType == 5 && t.LineNo == "2").Select(t => t.Id).ToArray(); var locatornum1 = StaticData.CarRealList.Count(t => emptyids1.Contains(t.LocatorId)); var locatornum2 = StaticData.CarRealList.Count(t => emptyids2.Contains(t.LocatorId)); LineCatchArea linearea = null; //一库区车多,进二库区,, 两个空车区的分发空车逻辑 if (true) ///if (locatornum1 > locatornum2) { linearea = StaticData.LineCatchAreaList.FirstOrDefault(t => t.AreaType == 5 && t.LineNo == "1" && t.AreaNo == "1"); } else //二库区车多,进一库区 { var locators = StaticData.LineCatchAreaList.Where(t => t.AreaType == 5 && t.LineNo == "1").OrderByDescending(t => t.AreaNo); foreach (var locator in locators) { var locatorempnum1 = StaticData.CarRealList.Count(t => t.LocatorId == locator.Id); if (locatorempnum1 < locator.MaxNumber) { linearea = locator; break; } } } if (linearea != null) { car.OptDt = DateTime.Now; car.LocatorId = linearea.Id; car.LocatorArea = linearea; DBService.ModifyRealCarinfoRecord(car); this.plcHelper.Write(this.ScanPoint.PlcSetting4, linearea.AreaNo); ///回写plc状态处理完成,plc会清理数据 this.plcHelper.Write(this.ScanPoint.PlcSetting5, 1); logger.Log("node:" + this.ScanPoint.NodeNo + " plc:" + this.ScanPoint.PlcSetting4.PlcNo + " mu:" + linearea.AreaNo); DBService.AddSystemLog(this.ScanPoint.NodeNo, car); } else { logger.Log("1006分流空车库 ,没有空车库满了"); } }//小车移动中指定点位后,并且到位了 else if (Convert.ToInt32(carno) > 0 && Convert.ToInt32(carrun) == 1 && Convert.ToInt32(wcsend) == 1) { ///回写plc状态,,plc会清理数据 this.plcHelper.Write(this.ScanPoint.PlcSetting4, 0); ///回写plc状态处理完成,plc会清理数据 this.plcHelper.Write(this.ScanPoint.PlcSetting5, 0); } } } catch (Exception ex) { logger.Error("Logic1002UpLocator异常: " + this.ScanPoint.NodeNo + " :" + ex.Message + ex.StackTrace); } Thread.Sleep(300); } } } }