using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using BroadcastModule; using centralController.advert; using centralController.model; using centralController.WebServer; using db; using MySql.Data.MySqlClient; using NumMachine; using ONNONLed5KSDKD; using parkMonitor.LOG; using parkMonitor.tools; using PLCS7; using snap7Enc; using Terminal; namespace Monitor { internal class SystemInitializer { /// /// 初始化各模块 /// /// internal void Init(IntPtr flpHandle) { Log.WriteLog(LogType.process, LogFile.INFO, "***************** 初始化开始 ****************"); bool initStatus = false; int retryCount = 0; string remoteDBConnStr, localDBConnStr; int DBtimeout; MyTimer mt = new MyTimer(); mt.StartTiming(); try { Monitor.SetNotification("读取配置文件中...", parkMonitor.model.TextColor.Log); retryCount = Convert.ToInt32(ConfigurationManager.AppSettings.Get("retryCount")); Monitor.defaultLic = ConfigurationManager.AppSettings.Get("defaultLic"); //数据库 remoteDBConnStr = ConfigurationManager.AppSettings.Get("remoteDBConnStr"); localDBConnStr = ConfigurationManager.AppSettings.Get("localDBConnStr"); DBtimeout = Convert.ToInt32(ConfigurationManager.AppSettings.Get("DBtimeout")); //plc Monitor.plcIPAddr = ConfigurationManager.AppSettings.Get("plcIpAddress"); Monitor.plcRack = Convert.ToInt32(ConfigurationManager.AppSettings.Get("plcRack")); Monitor.plcSlot = Convert.ToInt32(ConfigurationManager.AppSettings.Get("plcSlot")); Monitor.plcDatablockConfig = ConfigurationManager.AppSettings.Get("plcDatablockId").Split(','); Monitor.plcTerminalCount = Convert.ToInt32(ConfigurationManager.AppSettings.Get("plcTerminalCount")); Monitor.plcParkingSpaceCount = Convert.ToInt32(ConfigurationManager.AppSettings.Get("plcParkingSpaceCount")); Monitor.plcRefreshInterval = Convert.ToInt32(ConfigurationManager.AppSettings.Get("plcRefreshInterval")); //显示屏 Monitor.allInOneMachineIP = ConfigurationManager.AppSettings.Get("allInOneMachineIP").Split(','); string[] ports = ConfigurationManager.AppSettings.Get("allInOneMachinePort").Split(','); if (Monitor.allInOneMachineIP.Length != ports.Length) throw new Exception(); Monitor.allInOneMachinePort = new int[ports.Length]; for (int i = 0; i < ports.Length; i++) { Monitor.allInOneMachinePort[i] = Convert.ToInt32(ports[i]); } //webServer端口 Monitor.webPort = Convert.ToInt32(ConfigurationManager.AppSettings.Get("webPort")); //车库ID Monitor.garageID = Convert.ToInt32(ConfigurationManager.AppSettings.Get("garageID")); //广告路径 Monitor.advertPath = ConfigurationManager.AppSettings.Get("advertPath"); //停车位显示相关配置 Monitor.floors = Convert.ToInt32(ConfigurationManager.AppSettings.Get("floors")); Monitor.rows = Convert.ToInt32(ConfigurationManager.AppSettings.Get("rows")); Monitor.spacesInRow = Convert.ToInt32(ConfigurationManager.AppSettings.Get("spacesInRow")); //配置文件读取结束,进入状态1 Monitor.initializeState = 1; Monitor.globalStatus = false; initStatus = true; } catch (Exception e) { Console.WriteLine("初始化," + e.Message); return; } Monitor.SetNotification("初始化PLC连接...", parkMonitor.model.TextColor.Log); initStatus = initStatus && PLCInit(retryCount); //PLC初始化结束,进入状态2 if (!initStatus) { Monitor.SetNotification("PLC连接失败,请检查设备", parkMonitor.model.TextColor.Error); return; } else { Monitor.initializeState = 2; } //初始化数据库对象 Monitor.remoteDBOper = new DBOperation(remoteDBConnStr, DBtimeout); Monitor.localDBOper = new DBOperation(localDBConnStr, DBtimeout); Monitor.SetNotification("初始化云端数据库...", parkMonitor.model.TextColor.Log); initStatus = initStatus && Monitor.remoteDBOper.InitConnPooling(5); if (!initStatus) { Monitor.SetNotification("云端数据库初始化异常", parkMonitor.model.TextColor.Error); return; } Monitor.SetNotification("初始化本地数据库...", parkMonitor.model.TextColor.Log); initStatus = initStatus && Monitor.localDBOper.InitConnPooling(5); //数据库初始化结束,进入状态3 if (!initStatus) { Monitor.SetNotification("本地数据库初始化异常", parkMonitor.model.TextColor.Error); return; } else { Monitor.initializeState = 3; } //初始化凭证号 initStatus = initStatus && Credence.ReadCredence(); if (!initStatus) { Monitor.SetNotification("凭证初始化异常", parkMonitor.model.TextColor.Error); return; } //初始化web对象 Monitor.SetNotification("初始化web模块...", parkMonitor.model.TextColor.Log); //Monitor.webServer = new CentralForWeb(); Monitor.webServer = new MyWebServer(); initStatus = initStatus && Monitor.webServer.Start(Monitor.webPort); //webServer初始化结束,进入状态4 if (!initStatus) { Monitor.SetNotification("Web模块初始化异常", parkMonitor.model.TextColor.Error); return; } else { Monitor.initializeState = 4; } #region 测试数据库操作 ////*******测试数据库操作 //string sql = "select * from parkingrecords where userID = 1;"; //MySqlDataReader reader = null; //object[] objs = null; //try //{ // reader = Monitor.remoteDBOper.Query(sql); // if (reader != null && reader.Read()) // { // objs = new object[reader.FieldCount]; // reader.GetValues(objs); // Console.WriteLine("-------------"); // for (int i = 0; i < objs.Length; i++) // { // Console.WriteLine(objs[i] + ","); // } // } //} //catch (Exception e) { Console.WriteLine(e.Message); } //string updateParkingRecordsSql = "update parkingrecords set parkingRecordsState = 6,realGetTime = '" // + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "',parkingPrice = '233' where receiptNum='11221122';"; //List list = new List(); //list.Add(updateParkingRecordsSql); //Monitor.localDBOper.UpdateTransaction(list); #endregion //初始化计费策略 Monitor.SetNotification("读取计费策略...", parkMonitor.model.TextColor.Log); PaymentScheme.ins = PaymentScheme.GetCurrentPaymentScheme(1); //初始化号牌机对象 Monitor.SetNotification("扫描已接入号牌机...", parkMonitor.model.TextColor.Log); Monitor.numMachineLinker = new NumMachineLinker(flpHandle); Monitor.numMachineLinker.Start(); //初始化显示板对象,显示板udp面向无连接 Monitor.SetNotification("初始化屏显...", parkMonitor.model.TextColor.Log); Monitor.allInOneMachine = new BroadcastBoardManager(); for (int i = 0; i < Monitor.allInOneMachineIP.Length; i++) { Monitor.allInOneMachine.AddScreen(Monitor.allInOneMachine.boardList.Count, Encoding.Default.GetBytes(Monitor.allInOneMachineIP[i]), (uint)Monitor.allInOneMachinePort[i], Led5kSDK.bx_5k_card_type.BX_6K3_YY, 1, 2); } //Thread.Sleep(1000); #region 测试屏显 //Console.WriteLine(Monitor.allInOneMachine.boardList.Count); //Console.WriteLine(Monitor.allInOneMachine.boardList[0].boardParams.ip + ", " + Monitor.allInOneMachine.boardList[0].boardParams.port); //Monitor.allInOneMachine.boardList[0].UpdateText("智象停车欢迎您!", 30, 0); //Monitor.allInOneMachine.boardList[0].UpdateArrow(2, 5, 2); //Thread.Sleep(4000); //////Monitor.allInOneMachine.boardList[0].UpdateText("下下下", 3); //Monitor.allInOneMachine.boardList[0].UpdateArrow(-1); //Thread.Sleep(4000); //////Monitor.allInOneMachine.boardList[0].UpdateText("左左左", 3); ////Monitor.allInOneMachine.boardList[0].UpdateText("请带好随身携带的物品,关闭车窗与车门,收起后视镜,确认所有人员离开车辆后,操作终端停车", 3); //Monitor.allInOneMachine.boardList[0].UpdateArrow(1); //Thread.Sleep(4000); //////Monitor.allInOneMachine.boardList[0].UpdateText("", 20); //Monitor.allInOneMachine.boardList[0].UpdateArrow(-1); //Thread.Sleep(5000); //Monitor.allInOneMachine.boardList[0].UpdateArrow(0); //Thread.Sleep(5000); //Monitor.allInOneMachine.boardList[0].UpdateArrow(-1, 5, 0); //Thread.Sleep(4000); //////Monitor.allInOneMachine.boardList[0].UpdateText("左左左", 3); ////Monitor.allInOneMachine.boardList[0].UpdateText("请带好随身携带的物品,关闭车窗与车门,收起后视镜,确认所有人员离开车辆后,操作终端停车", 3); //Monitor.allInOneMachine.boardList[0].UpdateArrow(3); //Thread.Sleep(4000); //////Monitor.allInOneMachine.boardList[0].UpdateText("", 20); //Monitor.allInOneMachine.boardList[0].UpdateArrow(-1); //Thread.Sleep(5000); //Monitor.allInOneMachine.boardList[0].UpdateArrow(1); //Thread.Sleep(8000); //Monitor.allInOneMachine.boardList[0].UpdateArrow(-1); //Thread.Sleep(5000); #endregion //BroadcastLinker.Start(); //Monitor.allInOneMachine = BroadcastLinker.ins;//new BroadcastBoard(Monitor.allInOneMachineIP, Monitor.allInOneMachinePort); //初始化广告实例 //Monitor.SetNotification("初始化广告...", parkMonitor.model.TextColor.Log); //Monitor.advertMgr = new AdvertManager(); //initStatus = initStatus && AdvertMgrInit(3); //Monitor.AddNotification("test"); Monitor.SetNotification("初始化终端...", parkMonitor.model.TextColor.Log); Terminal.Terminal.Start(); //系统初始化结束,进入状态5 if (!initStatus) { return; } else { Monitor.initializeState = 5; } mt.EndTiming(); Console.WriteLine("初始化耗时:" + mt.GetInterval().TotalSeconds); Log.WriteLog(LogType.process, LogFile.INFO, "初始化完成"); switch (Monitor.initializeState) { case 0: Console.WriteLine("配置文件读写异常"); Monitor.SetNotification("配置文件读写异常", parkMonitor.model.TextColor.Error); break; case 1: Console.WriteLine("PLC初始化异常"); Monitor.SetNotification("PLC初始化异常", parkMonitor.model.TextColor.Error); break; case 2: Console.WriteLine("数据库初始化异常"); Monitor.SetNotification("数据库初始化异常", parkMonitor.model.TextColor.Error); break; case 3: Console.WriteLine("webServer初始化异常"); Monitor.SetNotification("webServer初始化异常", parkMonitor.model.TextColor.Error); break; case 4: Console.WriteLine("其他异常"); Monitor.SetNotification("其他异常", parkMonitor.model.TextColor.Error); break; case 5: Console.WriteLine("初始化成功"); Monitor.SetNotification("clear"); Monitor.SetNotification("初始化成功,耗时:" + String.Format("{0:N2}秒", mt.GetInterval().TotalSeconds), parkMonitor.model.TextColor.Log); Monitor.globalStatus = true; break; } //Monitor.SetNotification("aaaaaaaaaaaaaaaa", parkMonitor.model.TextColor.Info); //Monitor.SetNotification("bbbbbbbbbbbbbbbb", parkMonitor.model.TextColor.Log); //Monitor.SetNotification("cccccccccccccccc", parkMonitor.model.TextColor.Warning); //Monitor.SetNotification("dddddddddddddddd", parkMonitor.model.TextColor.Error); //Task.Factory.StartNew(()=> //{ // int count = 30; // while (count-- > 0) // { // Monitor.SetNotification("cccccccccccccccc", parkMonitor.model.TextColor.Warning); // Thread.Sleep(1500); // } //}); } /// /// PLC初始化与连接 /// /// /// internal bool PLCInit(int retryCount) { int temp = retryCount; int terminalDB, centralDB, parkingSpaceDB, errorDB, scanInfoDB; try { terminalDB = Int32.Parse(Monitor.plcDatablockConfig[0]); centralDB = Int32.Parse(Monitor.plcDatablockConfig[1]); parkingSpaceDB = Int32.Parse(Monitor.plcDatablockConfig[2]); errorDB = Int32.Parse(Monitor.plcDatablockConfig[3]); scanInfoDB = Int32.Parse(Monitor.plcDatablockConfig[4]); } catch { Monitor.SetNotification("读取PLC中DB块编号异常", parkMonitor.model.TextColor.Error); return false; } //初始化PLC对象 while (temp-- > 0) { if (Monitor.PLC == null) { Monitor.PLC = new PLCLinker(CpuType.S71500, Monitor.plcIPAddr, (short)Monitor.plcRack, (short)Monitor.plcSlot, terminalDB , centralDB, parkingSpaceDB, errorDB, scanInfoDB, Monitor.plcTerminalCount, Monitor.plcParkingSpaceCount); } //启动心跳进程 Thread heartbeatThread = new Thread(() => { while (!Monitor.isClosing) { if (Monitor.PLC != null && Monitor.PLC.isConnected) { Random rnd = new Random(); MainBlockStru mbs = new MainBlockStru(); mbs.centralHearbeat = (short)rnd.Next(100, 999); mbs.licenseReceived = (short)-1; mbs.bookParkCmd = (short)-1; mbs.bookFetchCmd = (short)-1; mbs.processCompleted = (short)-1; Monitor.PLC.WriteToPLC(mbs, PLCDataType.central); } Thread.Sleep(500); } }); heartbeatThread.Start(); if (Monitor.PLC.isConnected) { return true; } else { Monitor.PLC.PLCConnect(); } } return false; } /// /// 初始化更新广告 /// /// /// internal bool AdvertMgrInit(int retryCount) { string adAlert = ""; int temp = retryCount; while (temp-- > 0) { if (Monitor.advertMgr != null) { if (Monitor.advertMgr.UpdateAdvert(out adAlert)) return true; } } return false; } /// /// 系统关闭 /// internal void Stop() { //关闭号牌机 if (Monitor.numMachineLinker != null) { Monitor.numMachineLinker.Stop(); } //关闭webServer if (Monitor.webServer != null) { Monitor.webServer.Stop(); } //关闭数据库 if (Monitor.remoteDBOper != null) { Monitor.remoteDBOper.DBClose(); } if (Monitor.localDBOper != null) { Monitor.localDBOper.DBClose(); } // 关闭屏显 if (Monitor.allInOneMachine != null) { for (int i = 0; i < Monitor.allInOneMachine.boardList.Count; i++) { Monitor.allInOneMachine.boardList[i].UpdateText(" ", 2, 0); Monitor.allInOneMachine.boardList[i].UpdateArrow(-1); } //Monitor.allInOneMachine.DestroyAll(); } Terminal.Terminal.Stop(); } } }