From b0a4c47dd74bc41c5df3bab6ddd8de7bcc6a52b0 Mon Sep 17 00:00:00 2001 From: patrick <patrick.xu@broconcentric.com> Date: 星期五, 06 十二月 2019 18:35:42 +0800 Subject: [PATCH] 1. 重新整理项目,按照A034模式,将设备异步操作修改为类同步操作。使用任务队列来存储和分配任务。 --- src/Bro.Device.OmronFins/OmronFinsDriver.cs | 180 +++++++++++++++++++++++++++++++++++------------------------- 1 files changed, 105 insertions(+), 75 deletions(-) diff --git a/src/Bro.Device.OmronFins/OmronFinsDriver.cs b/src/Bro.Device.OmronFins/OmronFinsDriver.cs index ee5b718..695423b 100644 --- a/src/Bro.Device.OmronFins/OmronFinsDriver.cs +++ b/src/Bro.Device.OmronFins/OmronFinsDriver.cs @@ -13,6 +13,7 @@ using System.Text; using System.Threading; using System.Threading.Tasks; +using static Bro.Common.Helper.EnumHelper; namespace Bro.Device.OmronFins { @@ -30,7 +31,8 @@ InitialOpClient(); } - byte[] data = frame.GetSendReadFrameBytes(item, CurrentSid); + byte[] data = opFrame.GetSendReadFrameBytes(item, CurrentSid); + //var stream = opClient.GetStream(); opStream.Write(data, 0, data.Length); byte[] buffer = new byte[2048]; @@ -38,7 +40,7 @@ if (readSize > 0) { - List<int> list = frame.AnalyseReceivedItems(buffer.Take(readSize).ToArray(), item); + List<int> list = opFrame.AnalyseReceivedItems(buffer.Take(readSize).ToArray(), item); item.ITEM_VALUE = string.Join(",", list); } } @@ -69,6 +71,7 @@ Stopwatch sw = new Stopwatch(); sw.Start(); + //NetworkStream stream = null; lock (opClientLock) { do @@ -77,13 +80,14 @@ { InitialOpClient(); - byte[] data = frame.GetSendWriteFrameBytes(item, CurrentSid); + byte[] data = opFrame.GetSendWriteFrameBytes(item, CurrentSid); + //stream = opClient.GetStream(); opStream.Write(data, 0, data.Length); sw.Stop(); if (sw.ElapsedMilliseconds > 10) { - LogAsync(DateTime.Now, $"鍙戦�佸畬鎴愶紝鑰楁椂锛歿sw.ElapsedMilliseconds}"); + LogAsync(DateTime.Now, $"鍙戦�佸畬鎴�", $"鍙戦�佽�楁椂锛歿sw.ElapsedMilliseconds}"); } repeatTime = 0; @@ -98,7 +102,7 @@ } else { - LogAsync(DateTime.Now, "Send Exception:" + ex.GetExceptionMessage()); + LogAsync(DateTime.Now, "Send Exception", ex.GetExceptionMessage()); } } } while (repeatTime > 0); @@ -111,12 +115,12 @@ int bufferCount = opStream.Read(buffer, 0, buffer.Length); if (bufferCount > 0) { - frame.AnalyseReceivedItems(buffer.Take(bufferCount).ToArray(), item); + opFrame.AnalyseReceivedItems(buffer.Take(bufferCount).ToArray(), item); } } catch (Exception ex) { - LogAsync(DateTime.Now, "鍐欏叆鍙嶉寮傚父\r\n" + ex.GetExceptionMessage()); + LogAsync(DateTime.Now, "鍐欏叆鍙嶉寮傚父", ex.GetExceptionMessage()); } } else @@ -129,12 +133,12 @@ int bufferCount = opStream.Read(buffer, 0, buffer.Length); if (bufferCount > 0) { - frame.AnalyseReceivedItems(buffer.Take(bufferCount).ToArray(), item); + opFrame.AnalyseReceivedItems(buffer.Take(bufferCount).ToArray(), item); } } catch (Exception ex) { - LogAsync(DateTime.Now, "鍐欏叆鍙嶉寮傚父\r\n" + ex.GetExceptionMessage()); + LogAsync(DateTime.Now, "鍐欏叆鍙嶉寮傚父", ex.GetExceptionMessage()); } }); } @@ -160,6 +164,7 @@ item.ADDRESS = "D" + address.ToString(); item.ITEM_LENGTH = 1; + item.ITEM_VALUE_TYPE = 1; item.ITEM_VALUE = writeValue.ToString(); //lock (opClient) @@ -343,7 +348,8 @@ { plcEP = new IPEndPoint(IPAddress.Parse(IConfig.PLCIpAddress), IConfig.PLCPort); - frame = new FinsFrame(IConfig.DNA, IConfig.DA1, IConfig.DA2, IConfig.SNA, IConfig.SA1, IConfig.SA2, false); + scanFrame = new FinsFrame(IConfig.DNA, 0, IConfig.DA2, IConfig.SNA, 0, IConfig.SA2, false); + opFrame = new FinsFrame(IConfig.DNA, 0, IConfig.DA2, IConfig.SNA, 0, IConfig.SA2, false); oldValues = new List<int>(); } @@ -393,14 +399,14 @@ } } - FinsFrame frame = null; + FinsFrame scanFrame = null; + FinsFrame opFrame = null; static object opClientLock = new object(); TcpClient scanClient = new TcpClient(); - TcpClient opClient = new TcpClient(); - NetworkStream scanStream = null; + TcpClient opClient = new TcpClient(); NetworkStream opStream = null; IPEndPoint plcEP; @@ -433,6 +439,10 @@ // } //} + byte serverNode = 0; + byte scanNode = 0; + byte opNode = 0; + private void InitialScanClient() { if (scanClient == null || !scanClient.Connected) @@ -443,13 +453,31 @@ scanClient.Client.Blocking = true; scanClient.SendBufferSize = 0; scanClient.ReceiveBufferSize = 0; + scanClient.ReceiveTimeout = scanClient.SendTimeout = 5000; scanClient.Connect(plcEP); - byte[] dataRequest = frame.GetTcpRequestFrame(1); + scanFrame = new FinsFrame(IConfig.DNA, serverNode, IConfig.DA2, IConfig.SNA, scanNode, IConfig.SA2, false); + + byte[] dataRequest = scanFrame.GetTcpRequestFrame(0); scanStream = scanClient.GetStream(); scanStream.Write(dataRequest, 0, dataRequest.Length); byte[] dataRead = new byte[2048]; - scanStream.Read(dataRead, 0, dataRead.Length); + int readSize = scanStream.Read(dataRead, 0, dataRead.Length); + + if (readSize <= 0) + { + throw new ProcessException("PLC閫氫俊鎻℃墜淇″彿杩斿洖涓嶅彲涓虹┖"); + } + + if (dataRead[15] != 0) + { + throw new ProcessException($"PLC閫氫俊鎻℃墜淇″彿杩斿洖寮傚父锛歿dataRead[15]}"); + } + + serverNode = dataRead[23]; + scanNode = dataRead[19]; + + scanFrame = new FinsFrame(IConfig.DNA, serverNode, IConfig.DA2, IConfig.SNA, scanNode, IConfig.SA2, false); } } @@ -463,11 +491,26 @@ opClient.Client.Blocking = true; opClient.Connect(plcEP); - byte[] dataRequest = frame.GetTcpRequestFrame(2); + opFrame = new FinsFrame(IConfig.DNA, serverNode, IConfig.DA2, IConfig.SNA, opNode, IConfig.SA2, false); + byte[] dataRequest = opFrame.GetTcpRequestFrame(0); opStream = opClient.GetStream(); opStream.Write(dataRequest, 0, dataRequest.Length); byte[] dataRead = new byte[2048]; - opStream.Read(dataRead, 0, dataRead.Length); + int readSize = opStream.Read(dataRead, 0, dataRead.Length); + + if (readSize <= 0) + { + throw new ProcessException("PLC閫氫俊鎻℃墜淇″彿杩斿洖涓嶅彲涓虹┖"); + } + + if (dataRead[15] != 0) + { + throw new ProcessException($"PLC閫氫俊鎻℃墜淇″彿杩斿洖寮傚父锛歿dataRead[15]}"); + } + + serverNode = dataRead[23]; + opNode = dataRead[19]; + opFrame = new FinsFrame(IConfig.DNA, serverNode, IConfig.DA2, IConfig.SNA, opNode, IConfig.SA2, false); } } @@ -485,17 +528,19 @@ PLC_ITEM item = new PLC_ITEM(); item.ADDRESS = "D" + startAddress; item.OP_TYPE = 1; + item.ITEM_VALUE_TYPE = 1; item.ITEM_LENGTH = length; - var data = frame.GetSendReadFrameBytes(item, CurrentSid); + var data = opFrame.GetSendReadFrameBytes(item, CurrentSid); opStream.Write(data, 0, data.Length); + opStream.Flush(); byte[] buffer = new byte[2048]; int readSize = opStream.Read(buffer, 0, buffer.Length); if (readSize > 0) { - List<int> values = frame.AnalyseReceivedItems(buffer.Take(readSize).ToArray(), item); + List<int> values = opFrame.AnalyseReceivedItems(buffer.Take(readSize).ToArray(), item); return values; } else @@ -515,13 +560,15 @@ PLC_ITEM item = new PLC_ITEM(); item.ADDRESS = "D" + startAddress; item.OP_TYPE = 1; + item.ITEM_VALUE_TYPE = 1; item.ITEM_LENGTH = length; if (scanBuffer == null) { - scanBuffer = frame.GetSendReadFrameBytes(item, CurrentSid); + scanBuffer = scanFrame.GetSendReadFrameBytes(item, CurrentSid); } + //var stream = scanClient.GetStream(); scanStream.Write(scanBuffer, 0, scanBuffer.Length); byte[] buffer = new byte[2048]; @@ -529,7 +576,7 @@ if (readSize > 0) { - List<int> values = frame.AnalyseReceivedItems(buffer.Take(readSize).ToArray(), item); + List<int> values = scanFrame.AnalyseReceivedItems(buffer.Take(readSize).ToArray(), item); return values; } else @@ -537,69 +584,52 @@ return new List<int>(); } } - #endregion - #region Log - object logLock = new object(); - private async void LogAsync(DateTime dt, string info) + protected override void OnMethodInvoked(IAsyncResult ar) { - await Task.Run(() => + MonitorSet monitorSet = ar.AsyncState as MonitorSet; + + ProcessResponse resValues = monitorSet.Response; + + if (resValues.ResultValue == (int)PLCReplyValue.IGNORE) { - if (IConfig.IsEnabelLog) + return; + } + + if (monitorSet.ReplyDataAddress != -1 && resValues.DataList.Count > 0) + { + PLC_ITEM item = new PLC_ITEM(); + item.OP_TYPE = 2; + item.ITEM_LENGTH = resValues.DataList.Count; + item.ADDRESS = "D" + monitorSet.ReplyDataAddress.ToString(); + item.ITEM_VALUE = String.Join(",", resValues.DataList); + item.ITEM_VALUE_TYPE = (int)PLCItemType.Integer; + WriteItem(item, false); + } + + if (monitorSet.NoticeAddress != -1) + { + int repeatTime = 5; + + do { - lock (logLock) + try { - DirectoryInfo dir = new DirectoryInfo(IConfig.LogPath); - if (!dir.Exists) + this.WriteSingleAddress(monitorSet.NoticeAddress, resValues.ResultValue, false); + repeatTime = 0; + } + catch (Exception ex) + { + repeatTime--; + + if (repeatTime <= 0) { - dir.Create(); - } - - string filePath = Path.Combine(IConfig.LogPath, "PLC_" + DateTime.Now.ToString("yyyyMMdd") + ".txt"); - - using (StreamWriter writer = new StreamWriter(filePath, true)) - { - writer.WriteLine(dt.ToString("HH:mm:ss.fff")); - writer.WriteLine(info); - writer.WriteLine(); - - writer.Flush(); - writer.Close(); + new ProcessException("PLC鍙嶉鍐欏叆寮傚父", ExceptionLevel.Info, ex); } } - } - }); + } while (repeatTime > 0); + } } - - //private async void LogAsync(DateTime dt, IModbusFrame frame) - //{ - // await Task.Run(() => - // { - // if (IConfig.IsEnabelLog) - // { - // lock (logLock) - // { - // DirectoryInfo dir = new DirectoryInfo(IConfig.LogPath); - // if (!dir.Exists) - // { - // dir.Create(); - // } - - // string filePath = Path.Combine(IConfig.LogPath, "PLC_" + DateTime.Now.ToString("yyyyMMdd") + ".txt"); - - // using (StreamWriter writer = new StreamWriter(filePath, true)) - // { - // writer.WriteLine(dt.ToString("HH:mm:ss.fff")); - // writer.WriteLine(frame.GetFrameString()); - // writer.WriteLine(); - - // writer.Flush(); - // writer.Close(); - // } - // } - // } - // }); - //} #endregion } } -- Gitblit v1.8.0