using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using CentralControl.App_Code; using System.Configuration; using CentralControl.BaseData; using CentralControl.DBDAO; using CommonFunc; using XGL.Thrift; using System.Data; using Thrift.Protocol; using Thrift.Server; using Thrift.Transport; using System.Reflection; namespace CentralControl.App_Code { public class MainCentralControl { Thread OffMaterialScanThread; object orderPlanLock = new object(); string ipaddress { get; set; } /// /// 系统启动初始化 /// public void SystemInit() { try { StaticData.OrderPlanList = DBService.getOrderPlanList(""); //取时序订单 StaticData.MateriaList = DBService.GetMaterialInfoList("");//取物料信息 //StaticData.MaterialBomList = DBService.GetMaterialBomList(" is_delete=0 ", StaticData.MateriaList);//获取bom信息 StaticData.NodeSettingList = DBService.GetNodeSettingList("", StaticData.LineCatchAreaList); //StaticData.LineCatchAreaList = DBService.GetLineCatchAreaList(""); //StaticData.PlcSettingList = DBService.GetPlcSettingList(""); //StaticData.CarMaterialList = DBService.GetCarMaterialList(""); //StaticData.CarProductList = DBService.GetCarProductList(""); //StaticData.NodeRelation = DBService.getNodeRelation(""); ////绑定 上件队列信息 //StaticData.CarRealList = DBService.getCarInfoList("", StaticData.LineCatchAreaList, StaticData.CarMaterialList, StaticData.CarProductList); ////StaticData.UpLineCarCanList = DBService.getUpLineScanCarLists(""); //StaticData.OffMaterialList = DBService.getOffLineMaterialLists(""); ////记录上一次扫描的条码号,暂时逻辑调整,用不到了 //// StaticData.Last_scanMaterial = DBService.GetSystemConfigItem("last_scanmaterial"); //this.ipaddress = ConfigurationManager.AppSettings["plcIp"]; //StaticData.plcHelper = new PlcHelper(); //StaticData.plcConnectionState = StaticData.plcHelper.Connection(ipaddress); //if (!StaticData.plcConnectionState) //{ // Console.WriteLine("PLC连接失败,重新连接"); // return; //} //int useBackMaterial = Convert.ToInt32(ConfigurationManager.AppSettings["useBackMaterial"]); //OffMaterialScanThread = new Thread(ScanMaterialFromScan); //OffMaterialScanThread.Start(); ////定时任务线程 //Thread taskThread = new Thread(TaskCheckStart); //taskThread.Start(); ////// setPlanToLocator(); ///////***测试数据***/ Logic101_104UpLine logic101 = new Logic101_104UpLine(StaticData.plcHelper, "101"); logic101.StartPoint(); //Logic101_104UpLine logic102 = new Logic101_104UpLine(StaticData.plcHelper, "102"); //logic102.StartPoint(); //Logic101_104UpLine logic103 = new Logic101_104UpLine(StaticData.plcHelper, "103"); //logic102.StartPoint(); //Logic101_104UpLine logic104 = new Logic101_104UpLine(StaticData.plcHelper, "104"); //logic102.StartPoint(); //Logic1003InputLocator logic1003 = new Logic1003InputLocator(StaticData.plcHelper, "1003"); //logic1003.StartPoint(); //Logic1005EmptyLocator logic1005 = new Logic1005EmptyLocator(StaticData.plcHelper, "1005"); //logic1005.StartPoint(); //Logic1006EmptyLocator logic1006 = new Logic1006EmptyLocator(StaticData.plcHelper, "1006"); //logic1006.StartPoint(); //Logic2006_2005UpLocator logic2006 = new Logic2006_2005UpLocator(StaticData.plcHelper, "2006"); //logic2006.StartPoint(); ////入库口分发入库点 //Logic2004_2009_2010_2011UpLocator logic2004 = new Logic2004_2009_2010_2011UpLocator(StaticData.plcHelper, "2004"); //logic2004.StartPoint(); //Logic2008MiddleLocator logic2008 = new Logic2008MiddleLocator(StaticData.plcHelper, "2008"); //logic2008.StartPoint(); //Logic2004_2009_2010_2011UpLocator logic2009 = new Logic2004_2009_2010_2011UpLocator(StaticData.plcHelper, "2009"); //logic2009.StartPoint(); //Logic2004_2009_2010_2011UpLocator logic2010 = new Logic2004_2009_2010_2011UpLocator(StaticData.plcHelper, "2010"); //logic2010.StartPoint(); //Logic2004_2009_2010_2011UpLocator logic2011 = new Logic2004_2009_2010_2011UpLocator(StaticData.plcHelper, "2011"); //logic2011.StartPoint(); //Logic4001_4002OutLocator logic4001 = new Logic4001_4002OutLocator(StaticData.plcHelper, "4001"); //logic4001.StartPoint(); //Logic4001_4002OutLocator logic4002 = new Logic4001_4002OutLocator(StaticData.plcHelper, "4002"); //logic4002.StartPoint(); //Logic3001OffLine logic3001 = new Logic3001OffLine(StaticData.plcHelper, "3001", "5001", 7915); //logic3001.StartPoint(); } catch (Exception ex) { Logger logger = new Logger(); logger.Error("初始化控制台系统异常:" + ex.Message + ex.StackTrace + ex.ToString()); Console.WriteLine("初始化控制台系统异常:" + ex.Message + ex.StackTrace + ex.ToString()); } } /// /// 定时任务 /// private void TaskCheckStart() { Logger logger = new Logger(); while (true) { try { //if (DateTime.Now.Minute == 0) //{ // //初始化订单信息 // getPlanOrderList(); //} // Logic1004OffLine logic1004 = new Logic1004OffLine(StaticData.plcHelper, "1", 7913); //// logic1004.StartPoint(); // logic1004.OffMaterialFromCar("fsdfsdf"); //每天8点,1分1秒开始清理垃圾数据 if (DateTime.Now.Hour == 8 && DateTime.Now.Minute == 1 && DateTime.Now.Second == 1) { //定时清理数据库垃圾数据 DBService.NightClearOldData(); } //每20秒校验一次 if (DateTime.Now.Second % 20 == 0) { NodeSetting node = StaticData.NodeSettingList[0]; object obj1 = StaticData.plcHelper.Read(node.PlcSetting1); object obj2 = StaticData.plcHelper.Read(node.PlcSetting2); object obj3 = StaticData.plcHelper.Read(node.PlcSetting3); object obj4 = StaticData.plcHelper.Read(node.PlcSetting4); object obj5 = StaticData.plcHelper.Read(node.PlcSetting5); if (obj1 == null && obj2 == null && obj3 == null && obj4 == null && obj5 == null) { StaticData.plcConnectionState = StaticData.plcHelper.Connection(this.ipaddress); logger.Log("定时检测plc读取状态,短线重连"); } } } catch (Exception ex) { logger.Log("定时任务异常:" + ex.Message + ex.StackTrace); } ///每分钟执行一次 Thread.Sleep(1000); } } //private void StartThrift() //{ // try // { // ThriftServiceImp business = new ThriftServiceImp(); // business.SendSetCarInfoEvent += SetCarinfo; // XGL.Thrift.ThriftCommon thriftCommon = new XGL.Thrift.ThriftCommon(); // thriftCommon.Start(business, 7916); // } // catch (Exception ex) // { // MethodInfo method = (MethodInfo)MethodBase.GetCurrentMethod(); // Common.Log.Error(method.DeclaringType.FullName + "-" + method.Name + "\r\n" + ex.Message + "\r\n" + ex.StackTrace); // } //} private string SetLocatorMaterialno(int locatorid, string materialo) { lock (StaticData.FindLocatorLock) { var locator = StaticData.LineCatchAreaList.FirstOrDefault(t => t.Id == locatorid); if (locator == null) { return "未匹配到库位"; } var locatorcars = StaticData.CarRealList.Where(t => t.LocatorId == locatorid || t.LocatorNodeId == locatorid); if (locatorcars != null && locatorcars.Count() > 0 && locatorcars.FirstOrDefault().MaterialNo != materialo) { return "库区内有不同型号物料"; } else { locator.MaterialNo = materialo; locator.MaterialNm = StaticData.MateriaList.Where(t => t.MaterialNo == materialo).FirstOrDefault().MaterialNm; DBService.SetLocatorMaterial(locatorid, materialo, locator.MaterialNm); return ""; } } } private string SetCarinfo(string carno, string materialno, string materialdesc, string locatorid, string outlocatorstate, string opdt) { CarRealInfo car = StaticData.CarRealList.FirstOrDefault(t => t.CarNo == carno); if (car.IsOutLocator != 1) { int loid = Convert.ToInt32(locatorid); var locator = StaticData.LineCatchAreaList.FirstOrDefault(t => t.Id == loid); car.MaterialBarNo = materialdesc; car.MaterialNo = materialno; car.LocatorId = locator == null ? 0 : locator.Id; car.LocatorArea = locator; int state = Convert.ToInt32(outlocatorstate); if (state == 1) { car.HadNumber = 0; car.OffMaterialId = 0; } car.IsProOutLocator = state; DBService.ModifyRealCarinfoRecord(car); DBService.AddSystemLog("管理员手动修改小车信息", car); return "小车状态修改操作完成"; } else { return "小车正在出库,无法进行修改操作"; } return ""; } /// /// 更新静态集合中的数据 /// /// private void changeOrderPlanData(List list) { lock (orderPlanLock) { //便利更新内存中的时序计划状态以及信息 foreach (Orderplan nplan in list) { if (StaticData.OrderPlanList.Count > 0) { foreach (Orderplan oplan in StaticData.OrderPlanList) { if (nplan.id == oplan.id) { oplan.orderId = nplan.orderId; oplan.orderNo = nplan.orderNo; oplan.timeOrderNo = nplan.timeOrderNo; oplan.productCode = nplan.productCode; oplan.productDesc = nplan.productDesc; oplan.factoryNo = nplan.factoryNo; oplan.matCode = nplan.matCode; oplan.matDesc = nplan.matDesc; oplan.amount = nplan.amount; oplan.line = nplan.line; oplan.orderStartDate = nplan.orderStartDate; oplan.orderEndDate = nplan.orderEndDate; oplan.planType = nplan.planType; oplan.PlanOrder = nplan.PlanOrder; oplan.planState = nplan.planState; oplan.planStartTime = nplan.planStartTime; oplan.upAmount = nplan.upAmount; oplan.downAmount = nplan.downAmount; } else { StaticData.OrderPlanList.Add(nplan); } } } else { StaticData.OrderPlanList.Add(nplan); } } } } ///// ///// 定时更新生产计划列表 ///// //private void getPlanOrderList() //{ // while (true) // { // //周六更新计划 // if (DateTime.Now.Hour == 0 && DateTime.Now.DayOfWeek == DayOfWeek.Saturday) // { // // 增加时序计划的 开始结束时间条件 // // List list = DBService.getOrderPlanList(""); // //changeOrderPlanData(list); // //设置库位默认物料类型 // // setPlanToLocator(); // Thread.Sleep(600000); // } // } //} /// /// 根据webservice 控制 出库扫描队列 /// private void ScanMaterialFromScan() { Logger logger = new Logger(); //从 mes获取扫描队列 while (true) { logger.Log("获取mes扫描信息"); try { lock (StaticData.offMaterialCarLock) { StaticData.OffMaterialList = DBService.getOffLineMaterialLists(""); //foreach(OffLineMaterialList off in StaticData.OffMaterialAreaList) // { // } } } catch (Exception ex) { logger.Error(" 定时获取扫描信息接口异常:" + ex.Message + ex.StackTrace); } Thread.Sleep(2000); } } ///// ///// 根据webservice 控制 出库扫描队列 ///// //private void ScanMaterialFromMES() //{ // Logger logger = new Logger(); // //从 mes获取扫描队列 // while (true) // { // logger.Log("获取mes扫描信息"); // try // { // //string bdt = DateTime.Now.AddMinutes(-10).ToString("yyyy-MM-dd HH:mm:ss"); // string edt = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); // //if (StaticData.OffMaterialAreaList.Count > 0) // //{ // string bdt = DBService.GetLastTime().ToString("yyyy-MM-dd HH:mm:ss"); // //var enddata = StaticData.OffMaterialAreaList.LastOrDefault(); // // if (enddate != null) // // { // // bdt = enddate.ToString("yyyy-MM-dd HH:mm:ss"); // // } // // } // ////请求webservice ,向队列中插入扫描数据 // List list = new List(); // string zd_bh = "BD04"; // /***测试数据**/ // // DataTable dtmes = DBService.GetOffLineMaterialByMESView(zd_bh, bdt, edt); // DataTable dtmes = null;// MESDBService.GetOffLineMaterialByMESView(zd_bh, bdt, edt); // if (dtmes != null) // { // StringBuilder sb = new StringBuilder(); // foreach (DataRow datarow in dtmes.Rows) // { // lock (StaticData.offMaterialCarLock) // { // MesData offline = new MesData(); // offline.ProdCode = datarow["Prod_Code"].ToString(); // offline.materialNo = datarow["Prod_Code"].ToString(); // offline.Order = datarow["order_id"].ToString(); // offline.ProdDesc = datarow["xh_id"].ToString(); // offline.BarCode = datarow["sern"].ToString(); // offline.LineNo = datarow["line_code"].ToString(); // list.Add(offline); // OffLineMaterialList offmaterial = new OffLineMaterialList(); // offmaterial.Number = 1; // offmaterial.CreateTime = DateTime.Now; // offmaterial.MaterialNo = offline.materialNo; // offmaterial.MaterialDes = offline.ProdDesc; // offmaterial.ProductBarNo = offline.BarCode; // offmaterial.OrderCode = offline.Order; // offmaterial.LineNo = offline.LineNo; // offmaterial.IsOver = 0; // int id = DBService.AddOffLineMaterialHistoryList(offmaterial); // sb.Append(" \n ProdCode:" + offline.ProdCode + " materialNo:" + offline.materialNo + " Order:" + offline.Order + " ProdDesc:" + offline.ProdDesc + " BarCode:" + offline.BarCode); // } // } // logger.Log("获取mes扫描信息数量:" + sb.ToString()); // sb = null; // } // else // { // logger.Log("获取mes扫描信息数量 数量为空:"); // } // foreach (var data in list) // { // //记录mes获取记录数据 // //代码实现 // lock (StaticData.offMaterialCarLock) // { // OffLineMaterialList offmaterial = StaticData.OffMaterialAreaList.Where(t => t.MaterialNo == data.materialNo && t.Number < 0).OrderBy(t => t.CreateTime).FirstOrDefault(); // if (offmaterial != null) // { // offmaterial.Number += 1; // ///如果当前物料配对数量补齐,删除队列数据 // if (offmaterial.Number == 0) // { // StaticData.OffMaterialAreaList.Remove(offmaterial); // DBService.DeleteOffLineMaterial(offmaterial.Id); // } // } // else // { // offmaterial = new OffLineMaterialList(); // offmaterial.Number = 1; // offmaterial.CreateTime = DateTime.Now; // offmaterial.MaterialNo = data.materialNo; // offmaterial.MaterialDes = data.ProdDesc; // offmaterial.ProductBarNo = data.BarCode; // offmaterial.OrderCode = data.Order; // offmaterial.LineNo = data.LineNo; // offmaterial.IsOver = 0; // int id = DBService.AddOffLineMaterialList(offmaterial); // offmaterial.Id = id; // //添加到出库队列 // StaticData.OffMaterialAreaList.Add(offmaterial); // //记录数据库 // } // } // } // } // catch (Exception ex) // { // logger.Error(" 定时调用mes接口异常:" + ex.Message + ex.StackTrace); // } // Thread.Sleep(60000); // } //} /// /// 设置库位默认物料类型 /// //private void setPlanToLocator() //{ // Logger logger = new Logger(); // try // { // //根据计划选出产量最多的订单物料 ,按照库位设置的单品顺序排列 // var orderlist = StaticData.OrderPlanList.OrderByDescending(t => t.amount).ToList(); // /***测试数据***///只入1库 // var signarealist = StaticData.LineCatchAreaList.Where(t => t.AreaType == 4 && t.LineNo == "1").ToList(); // // var signarealist = StaticData.LineCatchAreaList.Where(t => t.AreaStorageType == 1&& t.AreaType == 4).ToList(); // DBService.CleartLineAreaMaterial(""); // int number = orderlist.Count > signarealist.Count ? signarealist.Count : orderlist.Count; // for (int i = 0; i < number; i++) // { // var catcharea = StaticData.LineCatchAreaList.Where(t => t.Id == signarealist[i].Id).FirstOrDefault(); // var order = StaticData.OrderPlanList.Where(t => t.id == orderlist[i].id).FirstOrDefault(); // if (catcharea != null && order != null) // { // catcharea.MaterialNo = order.productCode; // DBService.SetLineAreaMaterial(catcharea.Id, catcharea.MaterialNo,catcharea.MaterialNm); // } // } // } // catch (Exception ex) // { // logger.Error("订单计划获取失败" + ex.Message + ex.StackTrace); // } //} } }