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 Logic3001OffLine { /// /// plc 正在读取 /// bool IsPlcRead { get; set; } Thread OffMaterialThriftThread; PlcHelper plcHelper; string LineNo { get; set; } int Thriftpoint { get; set; } NodeSetting ScanPoint { get; set; } /// /// 箱体出库操作点 /// NodeSetting BoxOutPoint { get; set; } /// /// 物料到位后,推送给客户端 /// Thread OffClientThread { get; set; } /// /// 当前到位的小车物料 /// string OffMaterialId { get; set; } /// /// 是否运行发车中 /// bool IsRuning { get; set; } public Logic3001OffLine(PlcHelper plc, string nodeno, string outboxno, int thrifthport) { try { this.ScanPoint = StaticData.NodeSettingList.FirstOrDefault(t => t.NodeNo == nodeno); this.BoxOutPoint = StaticData.NodeSettingList.FirstOrDefault(t => t.NodeNo == outboxno); this.Thriftpoint = thrifthport; 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; this.plcHelper.Write(this.ScanPoint.PlcSetting4, 0); this.plcHelper.Write(this.ScanPoint.PlcSetting5, 0); this.plcHelper.Write(this.BoxOutPoint.PlcSetting2, 0); // this.plcHelper.Write(this.OpteratePoint.PlcSetting2, 0); //} } catch (Exception ex) { Console.WriteLine("站点" + nodeno + " 初始化数据异常" + ex.Message); Logger logger = new Logger(); logger.Error("站点" + nodeno + " 初始化数据异常" + ex.Message); } } 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(); var scanmaterial = StaticData.OffMaterialList.LastOrDefault(); string lastmaterialno = ""; if (scanmaterial != null) { lastmaterialno = scanmaterial.ProductBarNo; } while (true) { try { object materialno = this.plcHelper.Read(this.BoxOutPoint.PlcSetting1); string materialstr = materialno.ToString(); string readstate = materialstr.Substring(63, 6).ToUpper(); if (readstate == "NOREAD") { //无条码 } else { lock (StaticData.offMaterialCarLock) { string materialserialno = materialstr.Substring(63, 24).ToUpper(); string material = materialstr.Substring(63, 9).ToUpper(); logger.Log("扫描物料信息" + materialserialno + " [" + material + "]"); if (lastmaterialno != material) { OffLineMaterialList scan = new OffLineMaterialList(); scan.MaterialNo = material.ToUpper(); var materialinfo = StaticData.MateriaList.FirstOrDefault(t => t.MaterialNo == scan.MaterialNo); if (materialinfo != null) { scan.MaterialDes = materialinfo.MaterialNm; } scan.IsOver = 0; scan.CreateTime = DateTime.Now; int id = DBService.AddOffLineMaterialList(scan); scan.Id = id; StaticData.OffMaterialList.Add(scan); } } } ///读取小车号 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); // 1 已下件 , ,0 未下件 //this.plcHelper.Write(this.OpteratePoint.PlcSetting1, 0); if (carno != null && carstate != null && carrun != null && wcsstate != null && wcsend != null) { if (Convert.ToInt32(wcsend) == 0 && Convert.ToInt32(wcsstate) == 0 && Convert.ToInt32(carstate) == 1 && Convert.ToInt32(carrun) == 0 && Convert.ToInt32(carno) > 0) { string carNo = carno.ToString(); var car = StaticData.CarRealList.FirstOrDefault(t => t.CarNo == carNo); if (car != null) { car.CurrNodeId = this.ScanPoint.Id; car.IsOutLocator = 0; car.IsOver = 0; car.IsProOutLocator = 0; car.LineAreaNo = ""; car.LocatorArea = null; car.LocatorId = 0; car.LocatorNodeId = 0; car.MaterialBarNo = ""; car.MaterialInfo = null; car.MaterialNo = ""; car.Number = 0; car.OptDt = DateTime.Now; car.ProLocatorArea = null; if (car.OffMaterialId > 0) { var offmaterial = StaticData.OffMaterialList.FirstOrDefault(t => t.Id == car.OffMaterialId); if (offmaterial != null) { offmaterial.IsDeleted = 1; DBService.UpdateOffLineMaterialList(offmaterial); } } //清除小车门体对应的产品列表 DBService.DeleteCarMaterialByCarNo(car.CarNo); //清除小车上的门体数据列表 DBService.DeleteCarProductByCarNo(car.CarNo); car.LoadingMaterial.Clear(); car.LoadingProduct.Clear(); car.OffMaterialId = 0; DBService.ModifyRealCarinfoRecord(car); this.plcHelper.Write(this.ScanPoint.PlcSetting4, 1); this.plcHelper.Write(this.ScanPoint.PlcSetting5, 1); } else { logger.Log("下件点小车号[" + carno + "]未找到小车"); } } else if (Convert.ToInt32(carno) > 0 && Convert.ToInt32(carrun) == 1 && Convert.ToInt32(wcsend) == 1) { //下件完成 ,小车离开 // IsPlcRead = false; var car = StaticData.CarRealList.Where(t => t.CarNo == carno.ToString()).FirstOrDefault(); if (car != null) { this.plcHelper.Write(this.ScanPoint.PlcSetting4, 0); this.plcHelper.Write(this.ScanPoint.PlcSetting5, 0); } } } } catch (Exception ex) { logger.Error("小车下件到位通知异常:" + ex.Message + ex.StackTrace); IsRuning = false; // 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(); business.SendOutLocatorBarcodeEvent += ScanOutLocatorBarCode; XGL.Thrift.ThriftCommon thriftCommon = new XGL.Thrift.ThriftCommon(); thriftCommon.Start(business, point); } private string ScanOutLocatorBarCode(string barcode) { string lastmaterialno = ""; Logger logger = new Logger(); lock (StaticData.offMaterialCarLock) { string material = barcode.Substring(0, 9).ToUpper(); logger.Log("扫描物料信息" + barcode + " [" + material + "]"); if (lastmaterialno != material) { OffLineMaterialList scan = new OffLineMaterialList(); scan.MaterialNo = material.ToUpper(); var materialinfo = StaticData.MateriaList.FirstOrDefault(t => t.MaterialNo == scan.MaterialNo); if (materialinfo != null) { scan.MaterialDes = materialinfo.MaterialNm; } scan.Number = 1; scan.IsOver = 0; scan.CreateTime = DateTime.Now; int id = DBService.AddOffLineMaterialList(scan); scan.Id = id; StaticData.OffMaterialList.Add(scan); } } return ""; } } }