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 | 145 ++++++++++++++++++++++-------------------------- 1 files changed, 67 insertions(+), 78 deletions(-) diff --git a/src/Bro.Device.OmronFins/OmronFinsDriver.cs b/src/Bro.Device.OmronFins/OmronFinsDriver.cs index 534c13e..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 { @@ -31,11 +32,11 @@ } byte[] data = opFrame.GetSendReadFrameBytes(item, CurrentSid); - var stream = opClient.GetStream(); - stream.Write(data, 0, data.Length); + //var stream = opClient.GetStream(); + opStream.Write(data, 0, data.Length); byte[] buffer = new byte[2048]; - int readSize = stream.Read(buffer, 0, buffer.Length); + int readSize = opStream.Read(buffer, 0, buffer.Length); if (readSize > 0) { @@ -70,7 +71,7 @@ Stopwatch sw = new Stopwatch(); sw.Start(); - NetworkStream stream = null; + //NetworkStream stream = null; lock (opClientLock) { do @@ -80,13 +81,13 @@ InitialOpClient(); byte[] data = opFrame.GetSendWriteFrameBytes(item, CurrentSid); - stream = opClient.GetStream(); - stream.Write(data, 0, data.Length); + //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; @@ -101,7 +102,7 @@ } else { - LogAsync(DateTime.Now, "Send Exception:" + ex.GetExceptionMessage()); + LogAsync(DateTime.Now, "Send Exception", ex.GetExceptionMessage()); } } } while (repeatTime > 0); @@ -111,7 +112,7 @@ try { byte[] buffer = new byte[1024]; - int bufferCount = stream.Read(buffer, 0, buffer.Length); + int bufferCount = opStream.Read(buffer, 0, buffer.Length); if (bufferCount > 0) { opFrame.AnalyseReceivedItems(buffer.Take(bufferCount).ToArray(), item); @@ -119,7 +120,7 @@ } catch (Exception ex) { - LogAsync(DateTime.Now, "鍐欏叆鍙嶉寮傚父\r\n" + ex.GetExceptionMessage()); + LogAsync(DateTime.Now, "鍐欏叆鍙嶉寮傚父", ex.GetExceptionMessage()); } } else @@ -129,7 +130,7 @@ try { byte[] buffer = new byte[1024]; - int bufferCount = stream.Read(buffer, 0, buffer.Length); + int bufferCount = opStream.Read(buffer, 0, buffer.Length); if (bufferCount > 0) { opFrame.AnalyseReceivedItems(buffer.Take(bufferCount).ToArray(), item); @@ -137,7 +138,7 @@ } catch (Exception ex) { - LogAsync(DateTime.Now, "鍐欏叆鍙嶉寮傚父\r\n" + ex.GetExceptionMessage()); + LogAsync(DateTime.Now, "鍐欏叆鍙嶉寮傚父", ex.GetExceptionMessage()); } }); } @@ -163,6 +164,7 @@ item.ADDRESS = "D" + address.ToString(); item.ITEM_LENGTH = 1; + item.ITEM_VALUE_TYPE = 1; item.ITEM_VALUE = writeValue.ToString(); //lock (opClient) @@ -403,7 +405,9 @@ static object opClientLock = new object(); TcpClient scanClient = new TcpClient(); + NetworkStream scanStream = null; TcpClient opClient = new TcpClient(); + NetworkStream opStream = null; IPEndPoint plcEP; @@ -455,10 +459,10 @@ scanFrame = new FinsFrame(IConfig.DNA, serverNode, IConfig.DA2, IConfig.SNA, scanNode, IConfig.SA2, false); byte[] dataRequest = scanFrame.GetTcpRequestFrame(0); - var stream = scanClient.GetStream(); - stream.Write(dataRequest, 0, dataRequest.Length); + scanStream = scanClient.GetStream(); + scanStream.Write(dataRequest, 0, dataRequest.Length); byte[] dataRead = new byte[2048]; - int readSize = stream.Read(dataRead, 0, dataRead.Length); + int readSize = scanStream.Read(dataRead, 0, dataRead.Length); if (readSize <= 0) { @@ -489,10 +493,10 @@ opFrame = new FinsFrame(IConfig.DNA, serverNode, IConfig.DA2, IConfig.SNA, opNode, IConfig.SA2, false); byte[] dataRequest = opFrame.GetTcpRequestFrame(0); - var stream = opClient.GetStream(); - stream.Write(dataRequest, 0, dataRequest.Length); + opStream = opClient.GetStream(); + opStream.Write(dataRequest, 0, dataRequest.Length); byte[] dataRead = new byte[2048]; - int readSize = stream.Read(dataRead, 0, dataRead.Length); + int readSize = opStream.Read(dataRead, 0, dataRead.Length); if (readSize <= 0) { @@ -524,14 +528,15 @@ 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 = opFrame.GetSendReadFrameBytes(item, CurrentSid); - var stream = opClient.GetStream(); - stream.Write(data, 0, data.Length); + opStream.Write(data, 0, data.Length); + opStream.Flush(); byte[] buffer = new byte[2048]; - int readSize = stream.Read(buffer, 0, buffer.Length); + int readSize = opStream.Read(buffer, 0, buffer.Length); if (readSize > 0) { @@ -555,6 +560,7 @@ 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) @@ -562,11 +568,11 @@ scanBuffer = scanFrame.GetSendReadFrameBytes(item, CurrentSid); } - var stream = scanClient.GetStream(); - stream.Write(scanBuffer, 0, scanBuffer.Length); + //var stream = scanClient.GetStream(); + scanStream.Write(scanBuffer, 0, scanBuffer.Length); byte[] buffer = new byte[2048]; - int readSize = stream.Read(buffer, 0, buffer.Length); + int readSize = scanStream.Read(buffer, 0, buffer.Length); if (readSize > 0) { @@ -578,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