using GSG.NET.Excel; using GSG.NET.LINQ; using GSG.NET.Logging; using GSG.NET.PLC; using GSG.NET.PLC.Model; using GSG.NET.PLC.SLMP; using NPOI.SS.Formula.Functions; using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System.Windows.Forms; namespace PLCLogger { public partial class Form1 : Form { static Logger logger = Logger.GetLogger(); public string PLCAddress { get; } public int PLCPort { get; } IList targetPLCs; MultiFpc plc = new MultiFpc(); public Form1() { InitializeComponent(); this.Load += Form1_Load; this.FormClosing += Form1_FormClosing; } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { this.plc.Disconnect(); } private void Form1_Load(object sender, EventArgs e) { InitPLC(); this.lvwPLC.Columns.Add("Name", 50); this.lvwPLC.Columns.Add("Address", 100); this.lvwPLC.Columns.Add("PortNo", 50); this.lvwPLC.Columns.Add("Dec", 100); this.lvwPLC.Columns.Add("State", 100); this.lvwPLC.Items.Clear(); this.lvwPLC.View = View.Details; this.lvwPLC.HideSelection = false; this.targetPLCs.ToList().ForEach(p => { ListViewItem item = new ListViewItem(); item.Text = p.Name; item.SubItems.Add(p.Addr); item.SubItems.Add(p.PortNo.ToString()); item.SubItems.Add(p.Dec); item.SubItems.Add("UNKOWN"); item.EnsureVisible(); this.lvwPLC.Items.Add(item); }); } void InitPLC() { this.targetPLCs = new ExcelMapper(Path.Combine(System.Environment.CurrentDirectory) + @"\Config\PLC_Config.xlsx").Fetch().ToList(); //Add Logger this.targetPLCs.FwEach(x => { LogUtils.AddAppender(x.Name, new FileAppender { File = $@"C:\LOG\PLCLogger\{x.Name}\PLC.log", }); var grpL = new SlmpGroup { Name = "L1", Device = SlmpDevice.L }; var grpD = new SlmpGroup { Name = "D1", Device = SlmpDevice.D }; MakeBitMap(x.Name, grpL, x.Name); MakeWordMap(x.Name, grpD, x.Name); var miz = new SlmpManager(); miz.Config.Id = x.Name; miz.Config.IpAddress = x.Addr; miz.Config.Port = x.PortNo; miz.Config.RollingCount = 1; miz.AddGroup(grpL); miz.AddGroup(grpD); this.plc.Add(miz); }); this.plc.OnConnect += Plc_OnConnect; this.plc.OnDisconnect += Plc_OnDisconnect; this.plc.OnBitChanged += Plc_OnBitChanged; this.plc.OnWordChanged += Plc_OnWordChanged; this.plc.OnCollected += Plc_OnCollected; this.plc.Connect(); } private void Plc_OnCollected(GSG.NET.PLC.Support.MapScan scan) { //foreach (ListViewItem row in this.lvwPLC.Items) //{ // row.SubItems[3].Text = scan.CollectTime.ToString(); //} } bool MakeBitMap(string unitName, SlmpGroup grpB, string sheet) { var ll = new ExcelMapper(Path.Combine(System.Environment.CurrentDirectory) + @"\Config\PLC_Config.xlsx").Fetch($"{sheet}_L"); if (ll == null || !(ll.Count() > 0)) return false; ll = ll.Where(x => !string.IsNullOrEmpty(x.TagName)).ToList(); foreach (var item in ll) { grpB.AddBitBlock(new SlmpBitBlock { Name = unitName + item.TagName, Address = item.Addr, KindE = item.Kind, SubText = item.SubText, SubNo = item.SubNo, CallbackOrder = item.CallbackOrder, Comment = item.Comment, }); } return true; } bool MakeWordMap(string unitName, SlmpGroup grpW, string sheet) { var ll = new ExcelMapper(Path.Combine(System.Environment.CurrentDirectory) + @"\Config\PLC_Config.xlsx").Fetch($"{sheet}_D"); if (ll == null || !ll.Any()) return false; ll = ll.Where(x => !string.IsNullOrEmpty(x.TagName)).ToList(); foreach (var item in ll) { grpW.AddWordBlock(new SlmpWordBlock { Name = unitName + item.TagName, Address = item.Addr, SubText = item.SubText, SubNo = item.SubNo, Point = item.Point, Format = item.Format, Multiple = item.MultipleV, MultipleFormatter = item.MultipleFormat, IsWatch = item.Watch, KindE = item.Kind, CallbackOrder = item.CallbackOrder, Comment = item.Comment, }); } return true; } #region Event private void Plc_OnDisconnect(string id) { Logger.GetLogger(id).I("Disconnected"); foreach (ListViewItem row in this.lvwPLC.Items) { if (row.Text.Equals(id)) { row.BackColor = Color.Red; row.SubItems[4].Text = "Discontected"; } } } private void Plc_OnConnect(string id) { Logger.GetLogger(id).I("Connected"); foreach (ListViewItem row in this.lvwPLC.Items) { if (row.Text.Equals(id)) { row.BackColor = Color.Green; row.SubItems[4].Text = "Connected"; } } } private void Plc_OnWordChanged(GSG.NET.PLC.Model.WordBlock block) { Logger.GetLogger(block.ConfigID).I("WordChd {0} {1}", block.ConfigID, block); } private void Plc_OnBitChanged(GSG.NET.PLC.Model.BitBlock block) { Logger.GetLogger(block.ConfigID).I("BitChd {0} {1}", block.ConfigID, block); } private void Plc_OnLog(string log) { logger.I(log); } #endregion } }