using System; using System.Collections.Generic; using System.Linq; using System.Text; using Ptl.Device; using System.Xml.Serialization; using System.IO; using QMFrameWork.Log; using QMAPP.FJC.Entity.FwMark; namespace QMAPP.FJC.BLL.X_Gate { public class LightController { static System.Threading.Timer timer; static Ptl.Device.InstallProject Project; static bool XGateStarted = false; static LightController() { try { timer = new System.Threading.Timer(new System.Threading.TimerCallback(timer_tick)); Project = new Ptl.Device.InstallProject(); //反序列化工程文件 string projectFilePath = System.Configuration.ConfigurationManager.AppSettings["XGateProjectPath"]; XmlSerializer projectSerializer = new XmlSerializer(typeof(InstallProject)); using (FileStream fileStream = new FileStream(projectFilePath, FileMode.Open, FileAccess.Read)) { Project = (InstallProject)projectSerializer.Deserialize(fileStream); } Ptl.Device.Log.Logger.HoldingPeriodInDays = 7; XGateStarted = false; StartUnicastCommandQueue(); } catch (Exception ex) { LogManager.LogHelper.Error(new LogInfo() { ErrorInfo = ex, Tag = ex.StackTrace, Info = "XGate指示灯控制" }); } } static bool on; static void timer_tick(object obj) { if (Project != null) { foreach (XGate xgate in Project.XGates) { if (xgate.XGateUnicastCommunicationClient.Connected == true) { if (on) { string colorstr = System.Configuration.ConfigurationManager.AppSettings["XGatePanelLight"]; Ptl.Device.Communication.Command.LightColor color = Ptl.Device.Communication.Command.LightColor.Cyan; Enum.TryParse(colorstr, out color); xgate.DisplayLight(new Ptl.Device.Communication.Command.LightMode { Color = color, Period = Ptl.Device.Communication.Command.LightOnOffPeriod.Period1000 }); } else { xgate.ClearLight(); } on = !on; } else { //启动所有总线的通讯 //xgate.StartUnicastCommandQueue(); } } } } static void StartUnicastCommandQueue() { try { foreach (XGate xgate in Project.XGates) { //启动所有总线的通讯 xgate.StartUnicastCommandQueue(); xgate.DisplayLight(new Ptl.Device.Communication.Command.LightMode { Color = Ptl.Device.Communication.Command.LightColor.Cyan, Period = Ptl.Device.Communication.Command.LightOnOffPeriod.Period1000 }); } XGateStarted = true; timer.Change(1000, 5000); } catch (Exception ex) { LogManager.LogHelper.Error(new LogInfo() { ErrorInfo = ex, Tag = ex.StackTrace, Info = "XGate指示灯控制" }); } } //static ~LightController() //{ // if (timer != null) // { // timer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite); // timer.Dispose(); // } // if (Project != null) // { // foreach (XGate xgate in Project.XGates) // xgate.Dispose(); // Project = null; // } //} /// /// 重新加载项目 /// public void ReloadProject() { try { if (Project != null) { foreach (XGate xgate in Project.XGates) xgate.Dispose(); Project = null; } Project = new Ptl.Device.InstallProject(); //反序列化工程文件 string projectFilePath = System.Configuration.ConfigurationManager.AppSettings["XGateProjectPath"]; XmlSerializer projectSerializer = new XmlSerializer(typeof(InstallProject)); using (FileStream fileStream = new FileStream(projectFilePath, FileMode.Open, FileAccess.Read)) { Project = (InstallProject)projectSerializer.Deserialize(fileStream); } Ptl.Device.Log.Logger.HoldingPeriodInDays = 7; XGateStarted = false; StartUnicastCommandQueue(); } catch (Exception ex) { LogManager.LogHelper.Error(new LogInfo() { ErrorInfo = ex, Tag = ex.StackTrace, Info = "XGate指示灯控制" }); } } public static void Load() { } public void LightOnCell(string workcellcode, List materials) { try { List lightsOnCell = new List(); lightsOnCell = new DAL.Basic.MarkAddrDAL().GetMarkOnCell(workcellcode); foreach (var gate in lightsOnCell.GroupBy(p => p.URL)) { if (Project.XGates[gate.Key] == null) break; foreach (var bus in gate.GroupBy(p => p.PORT)) { byte busindex = 0; if (!byte.TryParse(bus.Key, out busindex)) break; if (Project.XGates[gate.Key].Buses.Count <= busindex) break; var addrs = bus.Select(p => byte.Parse(p.MARKADDR)).ToList(); Project.XGates[gate.Key].Buses[busindex].MulticastClear900U(addrs); } } System.Threading.Thread.Sleep(200); if (materials == null || materials.Count == 0) return; foreach (var gate in lightsOnCell.GroupBy(p => p.URL)) { if (Project.XGates[gate.Key] == null) break; foreach (var bus in gate.GroupBy(p => p.PORT)) { byte busindex = 0; if (!byte.TryParse(bus.Key, out busindex)) break; if (Project.XGates[gate.Key].Buses.Count <= busindex) break; var addrs = bus .Where(p => materials.Exists(m => m == p.PARTSCODE)) .Select(p => byte.Parse(p.MARKADDR)) .ToList(); if (addrs.Count > 0) { var colorstr = bus.FirstOrDefault(p => materials.Exists(m => m == p.PARTSCODE)).COLOR; var color=Ptl.Device.Communication.Command.LightColor.Green; Enum.TryParse(colorstr,true,out color); //Project.XGates[gate.Key].Buses[busindex].MulticastClear900U(addrs); Project .XGates[gate.Key] .Buses[busindex] .MulticastDisplay900U(addrs , Ptl900UType.P03 , new Ptl.Device.Communication.Command.Display900UItem { } , new Ptl.Device.Communication.Command.LightMode { Color = color }); } } } } catch (Exception ex) { LogManager.LogHelper.Error(new LogInfo() { ErrorInfo = ex, Tag = ex.StackTrace, Info = "XGate指示灯控制" }); } } } }