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