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; using Thrift.Protocol; using Thrift.Server; using Thrift.Transport; namespace CentralControl.App_Code { /// /// 下件点扫描逻辑 /// public class Logic1004OffLine { /// /// plc 正在读取 /// bool IsPlcRead { get; set; } Thread OffMaterialThriftThread; PlcHelper plcHelper; string LineNo { get; set; } int Thriftpoint { get; set; } int UseButton { set; get; } NodeSetting ScanPoint { get; set; } /// /// 出库操作点 /// NodeSetting OpteratePoint { get; set; } /// /// 物料到位后,推送给客户端 /// Thread OffClientThread { get; set; } /// /// 当前到位的小车物料 /// string OffMaterialId { get; set; } string offThriftIp { get; set; } string offThriftPort { get; set; } /// /// 是否运行发车中 /// bool IsRuning { get; set; } public Logic1004OffLine(PlcHelper plc, string LineNo, int thriftpoint, int useBackButton) { this.UseButton = useBackButton; NodeSetting linenode1 = StaticData.NodeSettingList.FirstOrDefault(t => t.LineCatchArea != null && t.LineCatchArea.LineNo == LineNo && t.LineCatchArea.AreaType == 2 && t.NodeType == 6); //1号上件点 空车信号 this.OpteratePoint = StaticData.NodeSettingList.FirstOrDefault(t => t.NodeType == 7); if (linenode1 != null) { this.ScanPoint = linenode1; } else { Logger logger = new Logger(); logger.Log("创建线体,未找到扫描点位"); } this.LineNo = LineNo; this.plcHelper = plc; this.Thriftpoint = thriftpoint; this.offThriftIp = System.Configuration.ConfigurationManager.AppSettings["offThriftIp"]; this.offThriftPort = System.Configuration.ConfigurationManager.AppSettings["offThriftport"]; ///回写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); // 1 已下件 , ,0 未下件 // this.plcHelper.Write(this.OpteratePoint.PlcSetting1, 0); // 1 已下件 , ,0 未下件 // this.plcHelper.Write(this.OpteratePoint.PlcSetting2, 0); //} } public void StartPoint() { ///启动thrift线程监视 //OffMaterialThriftThread = new Thread(new ParameterizedThreadStart(StartScanThriftLogic)); //OffMaterialThriftThread.Start(this.Thriftpoint); OffClientThread = new Thread(NoticeMaterialInfo); OffClientThread.Start(); } private void NoticeMaterialInfo() { 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(ScanPoint.PlcSetting4); ///回写plc状态处理完成,plc会清理数据 object wcsend = this.plcHelper.Read(ScanPoint.PlcSetting5); // 1 已下件 , ,0 未下件 //this.plcHelper.Write(this.OpteratePoint.PlcSetting1, 0); if (Convert.ToInt32(carno) > 0 && Convert.ToInt32(wcsend) == 0 && Convert.ToInt32(wcsstate) == 0 && Convert.ToInt32(carstate) == 1 && Convert.ToInt32(carrun) == 0 && IsPlcRead == false) { logger.Log("[" + carno + "]小车到了 [" + this.LineNo + "]号下件件点"); //中一系统 在点位配置维护的时候, 一个节点的子级 不需要维护多个,只需要把特定线路的点维护,然后根据线体去找到库位口位置 // ScanPoint.CarNo = carno.ToString(); //判断小车号是否存在 ,使用内存记录 // CarRealInfo car = DBService.GetCarModel(carno.ToString()); CarRealInfo car = StaticData.CarRealList.Where(t => t.CarNo == carno.ToString()).FirstOrDefault(); DBService.AddSystemLog(this.ScanPoint.NodeNo, car); //正常下件 /*******测试数据***********/ //int? downmaterialstate = 1; //this.plcHelper.Read(this.OpteratePoint.PlcSetting1); // int? backmaterialstate = 0;// this.plcHelper.Read(this.OpteratePoint.PlcSetting2); object downmaterialstate = this.plcHelper.Read(this.OpteratePoint.PlcSetting1); //拉回指令 object backmaterialstate = this.plcHelper.Read(this.OpteratePoint.PlcSetting2); var canoutcar = false; if (this.UseButton == 1 && backmaterialstate != null && Convert.ToInt32(backmaterialstate) == 1) { canoutcar = true; } else if (downmaterialstate != null && Convert.ToInt32(downmaterialstate) == 1) { if (car != null) { car.MaterialBarNo = ""; car.MaterialNo = ""; car.MaterialInfo = null; //car.LocatorNodeId = null; //car.LocatorNodeSetting = null; car.IsOutLocator = 0; car.IsOver = 0; car.IsProOutLocator = 0; car.LocatorId = 0; car.LocatorArea = null; car.CurrNodeId = this.ScanPoint.Id; car.Number = 0; car.HadNumber = 0; car.CurrNodeSetting = this.ScanPoint; DBService.ModifyRealCarinfoRecord(car); ////点位记录小车编号 //ScanPoint.CarNo = car.CarNo; lock (StaticData.offMaterialCarLock) { OffLineMaterialList offfirst = StaticData.OffMaterialList.OrderBy(t=>t.CreateTime).FirstOrDefault(t => t.CarCode == car.CarNo); if (offfirst != null) { logger.Log("下件到位 ,到位小车号 " + offfirst.Id + " 小车号:小车号:"+ car.CarNo + " 条码"+ offfirst.ProductBarNo); offfirst.IsOver = 1; offfirst.IsDeleted = 1; offfirst.ModifyTime = DateTime.Now; DBService.UpdateOffLineMaterialList(offfirst); //移除当前下件的门体前的所有数据 List offlinebefore = StaticData.OffMaterialList.Where(t => t.CreateTime < offfirst.CreateTime).ToList(); foreach (var off in offlinebefore) { off.IsOver = 1; off.IsDeleted = 1; off.ModifyTime = DateTime.Now; DBService.UpdateOffLineMaterialList(off); logger.Log("下件到位 ,删除前面得" + off.Id + " 小车号:小车号" + off.CarCode + " 条码号:" + off.ProductBarNo); } } List offline = StaticData.OffMaterialList.Where(t => t.CarCode == car.CarNo && t.Id != offfirst.Id).ToList(); foreach (var off in offline) { off.LineNo = "1"; DBService.UpdateOffLineMaterialList(off); logger.Log("下件到位 ,修改出库信息变色 id "+ off .Id+ " 小车号:" + off.CarCode+" 条码号:"+off.ProductBarNo); } //else //{ // logger.Log("下件到位 ,物料号不存在成品队列中"); //} } } else { logger.Log("下件到位小车号不存在"); } canoutcar = true; } if (canoutcar) { ///回写plc状态,起点的分支线路为1 var processNode = StaticData.NodeRelation.FirstOrDefault(t => t.PreNodeId == ScanPoint.Id && t.NodeValue == 1001); this.plcHelper.Write(ScanPoint.PlcSetting4, processNode.AfterNodeSetting.NodeNo); ///回写plc状态处理完成,plc会清理数据 this.plcHelper.Write(ScanPoint.PlcSetting5, 1); // IsPlcRead = true; DBService.AddSystemLog(this.ScanPoint.NodeNo, car); logger.Log("node:" + this.ScanPoint.NodeNo + " plc:" + this.ScanPoint.PlcSetting4.PlcNo + " mu:" + processNode.AfterNodeSetting.NodeNo); } }//小车移动中指定点位后,并且到位了 else if (Convert.ToInt32(carno) > 0 && Convert.ToInt32(carrun) == 1 && Convert.ToInt32(wcsend) == 1) { ///回写plc状态,,plc会清理数据 this.plcHelper.Write(ScanPoint.PlcSetting4, 0); ///回写plc状态处理完成,plc会清理数据 this.plcHelper.Write(ScanPoint.PlcSetting5, 0); } } catch (Exception ex) { logger.Error("小车下件到位通知异常:" + ex.Message + ex.StackTrace); IsRuning = false; logger = null; // return "系统异常"; } Thread.Sleep(1000); } } //private void NoticeMaterialInfo() //{ // 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(ScanPoint.PlcSetting4); // ///回写plc状态处理完成,plc会清理数据 // object wcsend = this.plcHelper.Read(ScanPoint.PlcSetting5); // 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(); // if (car == null) // { // var offmaterial = StaticData.OffMaterialAreaList.FirstOrDefault(t => t.Id == car.OffMaterialId); // if (car.OffMaterialId > 0 && offmaterial != null) // { // TTransport transport = new TSocket(this.offThriftIp, Convert.ToInt32(this.offThriftPort)); // TProtocol protocol = new TBinaryProtocol(transport); // ThriftService.Client client = new ThriftService.Client(protocol); // transport.Open(); // string ret = client.GetUnloadMaterial(car.CarNo, car.MaterialNo, offmaterial.MaterialDes, offmaterial.OrderCode, offmaterial.ProductBarNo, offmaterial.MaterialNo, ""); // transport.Close(); // this.OffMaterialId = car.OffMaterialId.ToString(); // logger.Log("下件点小车到位了,通知客户端物料信息 id:" + car.OffMaterialId + " CarNo:" + car.CarNo + " MaterialNo:" + car.MaterialNo + " MaterialDes:" + offmaterial.MaterialDes + " OrderCode: " + offmaterial.OrderCode + " ProductBarNo:" + offmaterial.ProductBarNo + " MaterialNo:" + offmaterial.MaterialNo); // } // else // { // logger.Log("下件点小车到位了,但是没有匹配到下件物料信息:" + car.OffMaterialId); // } // } // else // { // logger.Log("下件点小车到位了,但是没有匹配到小车信息"); // } // } // } // catch (Exception ex) // { // logger.Error("小车下件到位通知异常:" + ex.Message + ex.StackTrace); // IsRuning = false; // logger = null; // // return "系统异常"; // } // Thread.Sleep(1000); // } //} /// /// 启动小车扫描监听队列 /// private void StartScanThriftLogic(object thriftpoint) { int point = Convert.ToInt32(thriftpoint); this.LineNo = this.LineNo; XGL.Thrift.ThriftServiceImp business = new XGL.Thrift.ThriftServiceImp(); XGL.Thrift.ThriftCommon thriftCommon = new XGL.Thrift.ThriftCommon(); thriftCommon.Start(business, point); } /// /// 下位机点击发车 /// /// /// public string OffMaterialFromCar(string Temp) { List mlist = new List(); Logger logger = new Logger(); if (!IsRuning) { IsRuning = true; try { while (true) { if (!string.IsNullOrEmpty(this.OffMaterialId)) { ///读取小车号 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(ScanPoint.PlcSetting4); ///回写plc状态处理完成,plc会清理数据 object wcsend = this.plcHelper.Read(ScanPoint.PlcSetting5); if (Convert.ToInt32(carno) > 0 && Convert.ToInt32(wcsend) == 0 && Convert.ToInt32(wcsstate) == 0 && Convert.ToInt32(carstate) == 1 && Convert.ToInt32(carrun) == 0 && IsPlcRead == false) { logger.Log("[" + carno + "]小车到了 [" + this.LineNo + "]号下件件点"); //中一系统 在点位配置维护的时候, 一个节点的子级 不需要维护多个,只需要把特定线路的点维护,然后根据线体去找到库位口位置 // ScanPoint.CarNo = carno.ToString(); //判断小车号是否存在 ,使用内存记录 // CarRealInfo car = DBService.GetCarModel(carno.ToString()); CarRealInfo car = StaticData.CarRealList.Where(t => t.CarNo == carno.ToString()).FirstOrDefault(); if (car != null) { car.MaterialBarNo = ""; car.MaterialNo = ""; car.MaterialInfo = null; //car.LocatorNodeId = null; //car.LocatorNodeSetting = null; car.IsOutLocator = 0; car.IsOver = 0; car.IsProOutLocator = 0; car.LocatorId = 0; car.LocatorArea = null; car.CurrNodeId = this.ScanPoint.Id; car.CurrNodeSetting = this.ScanPoint; DBService.ModifyRealCarinfoRecord(car); } ////点位记录小车编号 //ScanPoint.CarNo = car.CarNo; lock (StaticData.offMaterialCarLock) { OffLineMaterialList offline = StaticData.OffMaterialList.FirstOrDefault(t => t.Id == car.OffMaterialId); if (offline != null) { logger.Log("匹配到下件信息,"); if (offline.Number == 0) { logger.Log("匹配到下件信息数量=0 ,删除队列信息,"); DBService.DeleteOffLineMaterial(offline.Id); StaticData.OffMaterialList.Remove(offline); } } } ///回写plc状态,起点的分支线路为1 var processNode = StaticData.NodeRelation.FirstOrDefault(t => t.PreNodeId == ScanPoint.Id && t.NodeValue == 1001); this.plcHelper.Write(ScanPoint.PlcSetting4, processNode.AfterNodeSetting.NodeNo); ///回写plc状态处理完成,plc会清理数据 this.plcHelper.Write(ScanPoint.PlcSetting5, 1); // IsPlcRead = true; DBService.AddSystemLog(this.ScanPoint.NodeNo, car); logger.Log("node:" + this.ScanPoint.NodeNo + " plc:" + this.ScanPoint.PlcSetting4.PlcNo + " mu:" + processNode.AfterNodeSetting.NodeNo); }//小车移动中指定点位后,并且到位了 else if (Convert.ToInt32(carno) > 0 && Convert.ToInt32(carrun) == 1 && Convert.ToInt32(wcsend) == 1) { ///回写plc状态,,plc会清理数据 this.plcHelper.Write(ScanPoint.PlcSetting4, 0); ///回写plc状态处理完成,plc会清理数据 this.plcHelper.Write(ScanPoint.PlcSetting5, 0); IsRuning = false; mlist = null; // logger = null; return ""; } } else { logger.Log("[" + this.LineNo + "] 请求下件的小车 物料信息不存在"); IsRuning = false; //logger = null; return "小车号错误"; } Thread.Sleep(1000); } } catch (Exception ex) { logger.Error("发车操作异常:" + ex.Message + ex.StackTrace); IsRuning = false; mlist = null; //logger = null; return "系统异常"; } } else { Console.WriteLine("小车运行中,等待plc反馈中"); // logger = null; mlist = null; return "小车运行中"; } } /// /// 下位机点击拉回 /// /// /// public string OffMaterialBackCar(List materialcarno) { List mlist = new List(); Logger logger = new Logger(); if (!IsRuning) { IsRuning = true; try { while (true) { if (!string.IsNullOrEmpty(this.OffMaterialId)) { ///读取小车号 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(ScanPoint.PlcSetting4); ///回写plc状态处理完成,plc会清理数据 object wcsend = this.plcHelper.Read(ScanPoint.PlcSetting5); if (Convert.ToInt32(carno) > 0 && Convert.ToInt32(wcsend) == 0 && Convert.ToInt32(wcsstate) == 0 && Convert.ToInt32(carstate) == 1 && Convert.ToInt32(carrun) == 0 && IsPlcRead == false) { logger.Log("[" + carno + "]小车到了 [" + this.LineNo + "]号下件件点"); CarRealInfo car = StaticData.CarRealList.Where(t => t.CarNo == carno.ToString()).FirstOrDefault(); if (car != null) { car.MaterialBarNo = ""; //car.LocatorNodeId = null; //car.LocatorNodeSetting = null; car.IsOutLocator = 0; car.IsOver = 0; car.IsProOutLocator = 0; car.LocatorId = 0; car.LocatorArea = null; car.CurrNodeId = this.ScanPoint.Id; car.CurrNodeSetting = this.ScanPoint; DBService.ModifyRealCarinfoRecord(car); } ////点位记录小车编号 //ScanPoint.CarNo = car.CarNo; lock (StaticData.offMaterialCarLock) { OffLineMaterialList offline = StaticData.OffMaterialList.FirstOrDefault(t => t.Id == car.OffMaterialId); if (offline != null) { offline.Number += 1; logger.Log("拉回操作:匹配到下件信息数量+1 ,"); DBService.UpdateOffLineMaterialList(offline); } } ///回写plc状态,起点的分支线路为1 var processNode = StaticData.NodeRelation.FirstOrDefault(t => t.PreNodeId == ScanPoint.Id && t.NodeValue == 1001); this.plcHelper.Write(ScanPoint.PlcSetting4, processNode.AfterNodeSetting.NodeNo); ///回写plc状态处理完成,plc会清理数据 this.plcHelper.Write(ScanPoint.PlcSetting5, 1); // IsPlcRead = true; DBService.AddSystemLog(this.ScanPoint.NodeNo, car); logger.Log("node:" + this.ScanPoint.NodeNo + " plc:" + this.ScanPoint.PlcSetting4.PlcNo + " mu:" + processNode.AfterNodeSetting.NodeNo); }//小车移动中指定点位后,并且到位了 else if (Convert.ToInt32(carno) > 0 && Convert.ToInt32(carrun) == 1 && Convert.ToInt32(wcsend) == 1) { ///回写plc状态,,plc会清理数据 this.plcHelper.Write(ScanPoint.PlcSetting4, 0); ///回写plc状态处理完成,plc会清理数据 this.plcHelper.Write(ScanPoint.PlcSetting5, 0); IsRuning = false; mlist = null; // logger = null; return ""; } } else { logger.Log("[" + this.LineNo + "] 请求下件的小车 物料信息不存在"); IsRuning = false; logger = null; return "小车号错误"; } Thread.Sleep(1000); } } catch (Exception ex) { logger.Error("发车操作异常:" + ex.Message + ex.StackTrace); IsRuning = false; mlist = null; logger = null; return "系统异常"; } } else { Console.WriteLine("小车运行中,等待plc反馈中"); // logger = null; mlist = null; return "小车运行中"; } } } }