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
    }
}