using CentralControl.BaseData; using CentralControl.DBDAO; using CommonFunc; using System; using System.Collections.Generic; using System.Linq; using System.Threading; using Thrift.Protocol; using Thrift.Transport; using ThriftCommon; namespace CentralControl.App_Code { /// /// 上件扫描逻辑 上件逻辑: 正常上件 1002 ,自动放行:1003 /// public class Logic101_104UpLine { Thread InputMaterialThread; Thread UpMaterialThriftThread; PlcHelper plcHelper; string LineNo { get; set; } NodeSetting ScanPoint { get; set; } /// /// plc 正在读取 /// bool IsPlcRead { get; set; } /// /// 客户端thrift端口 /// int Thriftpoint { get; set; } /// /// 是否运行发车中 /// bool IsRuning { get; set; } public Logic101_104UpLine(PlcHelper plc, string nodeno) { this.Thriftpoint = 7911; //try //{ // this.plcHelper = plc; // this.ScanPoint = StaticData.NodeSettingList.FirstOrDefault(t => t.NodeNo == nodeno); // if (this.ScanPoint != null) // { // this.Thriftpoint = this.ScanPoint.ServerThriftport; // this.LineNo = this.ScanPoint.LineCatchArea != null ? this.ScanPoint.LineCatchArea.LineNo : "1"; // ///回写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); // //} // } // else // { // Console.WriteLine(nodeno + "号上件点没有加载点位"); // } //} //catch (Exception ex) //{ // Console.WriteLine("站点" + nodeno + " 初始化数据异常" + ex.Message); // Logger logger = new Logger(); // logger.Error("站点" + nodeno + " 初始化数据异常" + ex.Message); //} } public void StartPoint() { if (this.Thriftpoint > 0) { ///启动thrift线程监视 UpMaterialThriftThread = new Thread(new ParameterizedThreadStart(StartScanThriftLogic)); UpMaterialThriftThread.Start(this.Thriftpoint); } if (this.ScanPoint != null && this.ScanPoint.LocalThriftip != "" && this.ScanPoint.LocalThriftport > 0) { InputMaterialThread = new Thread(new ParameterizedThreadStart(SendCarNoByNode)); InputMaterialThread.Start(this.ScanPoint); } } /// /// 上件点扫描小车信息,推送给前端 /// /// private void SendCarNoByNode(object nodesetting) { Logger logger = new Logger(); while (true) { var node = nodesetting as NodeSetting; ///读取小车号 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(ScanPoint.PlcSetting4); ///回写plc状态处理完成,plc会清理数据 object wcsend = this.plcHelper.Read(ScanPoint.PlcSetting5); try { if (Convert.ToInt32(carno) > 0 && Convert.ToInt32(wcsend) == 0 && Convert.ToInt32(wcsstate) == 0 && Convert.ToInt32(carstate) == 1 && Convert.ToInt32(carrun) == 0) { using (TTransport transport = new TSocket(node.LocalThriftip, Convert.ToInt32(node.LocalThriftport))) { using (TProtocol protocol = new TBinaryProtocol(transport)) { ThriftService.Client client = new ThriftService.Client(protocol); transport.Open(); string ret = client.GetReceiveCarNo(carno.ToString()); if (ret == "") { } } } } } catch (Exception ex) { logger.Log("客户端未启动thrift" + node.NodeDesc); } Thread.Sleep(2000); } } /// /// 启动小车扫描监听队列 /// private void StartScanThriftLogic(object thriftpoint) { int point = Convert.ToInt32(thriftpoint); this.LineNo = this.LineNo; XGL.Thrift.ThriftServiceImp business = new XGL.Thrift.ThriftServiceImp(); business.sendCarMaterialListEvent += SendCar; business.SendCheckServerStateEvent += CheckServerState; business.sendCheckBarcodeEvent += CheckMaterialCode; business.sendMaterialListEvent += CheckProductListByMaterialCode; XGL.Thrift.ThriftCommon thriftCommon = new XGL.Thrift.ThriftCommon(); thriftCommon.Start(business, point); } /// /// 检查 前端扫描的单个物料信息 /// /// /// public string CheckMaterialCode(string materialno) { return ""; } /// /// 获取物料列表,返回对应的产品列表 /// /// /// public string CheckProductListByMaterialCode(List materialnolist) { List materials = new List(); foreach (string carno in materialnolist) { int endindex = carno.IndexOf("#"); if (endindex <= 0) { endindex = carno.Length > 10 ? 10 : carno.Length; } string materialno = carno.Substring(0, endindex); materials.Add(materialno); } string[] materialArr = materials.ToArray(); var productModel = StaticData.MaterialBomList.Where(t => materialArr.Contains(t.ChildMaterialNo)).GroupBy(t => new { t.MaterialNo, t.ParentMaterialInfo.MaterialNm }).Select(g => new { materialno = g.Key.MaterialNo, materialnm = g.Key.MaterialNm, number = g.Count() }).Where(t => t.number == materialArr.Length).Select(t =>new { no = t.materialno, nm = t.materialnm }).ToList(); var retsult = new ResultJson(); retsult.success = 1; retsult.message = ""; retsult.data = JsonHelper.ObjectToJson(productModel); return JsonHelper.ObjectToJson(retsult); } /// /// 返回服务器的plc 状态 /// /// public string CheckServerState() { ///读取小车号 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(ScanPoint.PlcSetting4); ///回写plc状态处理完成,plc会清理数据 object wcsend = this.plcHelper.Read(ScanPoint.PlcSetting5); if (carobj != null && carno != null && carstate != null && wcsstate != null && wcsend != null) { return "1"; } return "0"; } /// /// 下位机点击发车 /// /// /// public string SendCar(List carlist,string order_code) { List materlist = new List(); List mlist = new List(); Logger logger = new Logger(); List carMaterials = new List(); List carProducts = new List(); var ret = new ResultJson(); if (carlist.Count == 0) { ret.success = 0; ret.message = "上件物料列表为空"; ret.data = ""; return JsonHelper.ObjectToJson(ret); } List productModel = null; if (!IsRuning) { IsRuning = true; try { foreach (string carno in carlist) { int endindex = carno.IndexOf("#"); if (endindex <= 0) { endindex = carno.Length > 10 ? 10 : carno.Length; } string materialno = carno.Substring(0, endindex); materlist.Add(materialno); CarMaterial carMaterial = new CarMaterial(); carMaterial.IsDeleted = false; carMaterial.materialBarno = carno; carMaterial.materialNo = materialno; int id = DBService.AddCarMaterial(carMaterial); carMaterial.id = id; carMaterials.Add(carMaterial); } //删除相同物料组成 bom的 产品bomid,为了排除,当前物料组成被包含的情况(A:1,2,3 ,B:1,2,3,4) string[] boms = StaticData.MaterialBomList.GroupBy(t => t.MaterialNo).Select(g => new { materialno = g.Key, number = g.Count() }).Where(t => t.number == carlist.Count).Select(t => t.materialno).ToArray(); if (boms.Length > 0) { string[] materialArr = materlist.ToArray(); ///根据包含相同物料号的数量的bom产品 productModel = StaticData.MaterialBomList.Where(t => boms.Contains(t.MaterialNo) && materialArr.Contains(t.ChildMaterialNo)).GroupBy(t => t.MaterialNo).Select(g => new { materialno = g.Key, number = g.Count() }).Where(t => t.number == materialArr.Length).Select(t => t.materialno).ToList(); //未找到匹配的bom结构信息 if (productModel != null && productModel.Count > 0) { } else { IsRuning = false; mlist = null; logger = null; ret.success = 0; ret.message = "没有匹配到对应的物料BOM"; ret.data = ""; return JsonHelper.ObjectToJson(ret); ; } } else { IsRuning = false; mlist = null; logger = null; ret.success = 0; ret.message = "没有匹配到对应的物料BOM"; ret.data = ""; return JsonHelper.ObjectToJson(ret); ; } //lock (StaticData.UpMaterialCarLock) //{ //} while (true) { ///读取小车号 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(ScanPoint.PlcSetting4); ///回写plc状态处理完成,plc会清理数据 object wcsend = this.plcHelper.Read(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) { logger.Log("[" + carno + "]小车到了 [" + this.LineNo + "]号上件点"); //清除小车门体对应的产品列表 bool retma = DBService.DeleteCarMaterialByCarNo(carno); //清除小车上的门体数据列表 bool retpro = DBService.DeleteCarProductByCarNo(carno); ///录入系统产品型号 foreach (var product in productModel) { var materialproduct = StaticData.MateriaList.FirstOrDefault(t => t.MaterialNo == product); CarProduct productcar = new CarProduct(); productcar.carNo = carno.ToString(); productcar.CreateTime = DateTime.Now.ToString(); productcar.productNo = materialproduct.MaterialNo; productcar.productNm = materialproduct.MaterialNm; productcar.IsDeleted = false; int id = DBService.AddCarProduct(productcar); productcar.id = id; carProducts.Add(productcar); } ///维护上件物料和小车对应关系 foreach (var material in carMaterials) { material.carNo = carno.ToString(); DBService.UpdateCarMaterial(material); UpLineScanCarList uplinmater = new UpLineScanCarList(); string materialno = material.materialNo; uplinmater.CarNo = carno.ToString(); uplinmater.MaterialNo = materialno; uplinmater.MaterialBarCode = material.materialBarno; uplinmater.Number = 1; uplinmater.LineNo = this.LineNo; mlist.Add(uplinmater); int id = DBService.AddUpLineScancar(uplinmater); uplinmater.Id = id; } LineCatchArea area = null; // lock(StaticData.CarLock) //判断小车号是否存在 ,使用内存记录 // CarRealInfo car = DBService.GetCarModel(carno.ToString()); CarRealInfo car = StaticData.CarRealList.Where(t => t.CarNo == carno.ToString()).FirstOrDefault(); if (car == null) { car = new CarRealInfo(); car.CarNo = carno.ToString(); car.LocatorNodeId = 0; car.ProLocatorArea = null; //car.MaterialNo = productModel == null ? "" : productModel.materialno; car.OptDt = DateTime.Now; car.Number = materlist.Count; car.HadNumber = materlist.Count; car.IsOver = 0; // car.MaterialBarNo = materialproduct == null ? "" : materialproduct.MaterialNm; car.Id = DBService.AddCarRealRecord(car); } else { //小车不存在了, 就插入初始化数据 car.CarNo = carno.ToString(); car.LocatorNodeId = 0; car.ProLocatorArea = null; // car.MaterialNo = productModel == null ? "" : productModel.materialno; car.HadNumber = materlist.Count; car.OptDt = DateTime.Now; car.Number = materlist.Count; car.IsOver = 0; // car.MaterialBarNo = materialproduct == null ? "" : materialproduct.MaterialNm; } car.LoadingProduct = carProducts; car.LoadingMaterial = carMaterials; //查找设置的库位物料 area = StaticData.getCarInputLocator("1", car); if (area != null) { car.LocatorNodeId = area.Id; car.ProLocatorArea = area; } if (area == null) { logger.Error("库位已满,请手动设置库位:"); IsRuning = false; mlist = null; logger = null; ret.success = 0; ret.message = "库位已满,请手动设置库位"; ret.data = ""; return JsonHelper.ObjectToJson(ret); } else { //小车存在了, 就修改初始化数据 car.CarNo = carno.ToString(); //实际入库位置 car.LocatorId = 0; car.LocatorArea = null; car.OptDt = DateTime.Now; car.IsOver = 0; DBService.ModifyRealCarinfoRecord(car); //Productinfo producthistory = new Productinfo(); //producthistory.CreateTime = DateTime.Now; //producthistory.IsDeleted = 0; //producthistory.MaterialNo = productModel.materialno; ////producthistory.ProductBarno = materialproduct != null ? materialproduct.MaterialNm : ""; ///////记录产品信息 //DBService.AddProductInfo(producthistory); // 添加小车记录表 DBService.AddCarHistoryRecord(car); //点位记录小车编号 ScanPoint.CarNo = car.CarNo; ///回写plc状态,起点的分支线路为1 //var processNode = StaticData.NodeRelation.FirstOrDefault(t => t.PreNodeId == ScanPoint.Id && t.NodeValue == 1002); //无道岔,直接给固定值 this.plcHelper.Write(ScanPoint.PlcSetting4, 1); ///回写plc状态处理完成,plc会清理数据 this.plcHelper.Write(ScanPoint.PlcSetting5, 1); logger.Log("node:" + this.ScanPoint.NodeNo + " plc:" + this.ScanPoint.PlcSetting4.PlcNo + "" + 1); DBService.AddSystemLog(this.ScanPoint.NodeNo, car); // IsPlcRead = true; } }//小车移动中指定点位后,并且到位了 else if (Convert.ToInt32(carno) > 0 && Convert.ToInt32(carrun) == 1 && Convert.ToInt32(wcsend) == 1) { // IsPlcRead = false; //string ocarno = ScanPoint.CarNo; CarRealInfo car = StaticData.CarRealList.Where(t => t.CarNo == carno.ToString()).FirstOrDefault(); string locatorno = ""; if (car != null) { // ////删除上件工件队列 , // //DBService.DeleteUpLineMaterial(carInfo.Id); // //lock (StaticData.UpMaterialCarLock) // //{ // // mlist.Remove(carInfo); locatorno = car.ProLocatorArea.AreaNo; } // car.CurrNodeId = null; // car.CurrNodeSetting = null; // DBService.ModifyRealCarinfoRecord(car); ///回写plc状态,,plc会清理数据 this.plcHelper.Write(ScanPoint.PlcSetting4, 0); ///回写plc状态处理完成,plc会清理数据 this.plcHelper.Write(ScanPoint.PlcSetting5, 0); //} //else //{ // logger.Log("[" + this.LineNo + "] 小车已离开,反馈未找到小车"); //} IsRuning = false; ret.success = 1; ret.message = "发车完成,发往[" + locatorno + "]库位"; ret.data = ""; return JsonHelper.ObjectToJson(ret); ; } } Thread.Sleep(1000); } } catch (Exception ex) { logger.Error("发车操作异常:" + ex.Message + ex.StackTrace); IsRuning = false; mlist = null; logger = null; ret.success = 0; ret.message = "系统异常" + ex.Message; ret.data = ""; return JsonHelper.ObjectToJson(ret); ; } } else { Console.WriteLine("正在发车中,等待plc反馈中"); logger = null; mlist = null; ret.success = 0; ret.message = "正在发车中,等待plc反馈中"; ret.data = ""; return JsonHelper.ObjectToJson(ret); ; } } } }