patrick
2019-10-19 809abe2aac4617cc838d36fec913f5268a066eb4
src/Bro.Device.OmronFins/OmronFinsDriver.cs
@@ -30,15 +30,16 @@
                InitialOpClient();
            }
            byte[] data = frame.GetSendReadFrameBytes(item, CurrentSid);
            opStream.Write(data, 0, data.Length);
            byte[] data = opFrame.GetSendReadFrameBytes(item, CurrentSid);
            var stream = opClient.GetStream();
            stream.Write(data, 0, data.Length);
            byte[] buffer = new byte[2048];
            int readSize = opStream.Read(buffer, 0, buffer.Length);
            int readSize = stream.Read(buffer, 0, buffer.Length);
            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 +70,7 @@
            Stopwatch sw = new Stopwatch();
            sw.Start();
            NetworkStream stream = null;
            lock (opClientLock)
            {
                do
@@ -77,8 +79,9 @@
                    {
                        InitialOpClient();
                        byte[] data = frame.GetSendWriteFrameBytes(item, CurrentSid);
                        opStream.Write(data, 0, data.Length);
                        byte[] data = opFrame.GetSendWriteFrameBytes(item, CurrentSid);
                        stream = opClient.GetStream();
                        stream.Write(data, 0, data.Length);
                        sw.Stop();
                        if (sw.ElapsedMilliseconds > 10)
@@ -108,10 +111,10 @@
                    try
                    {
                        byte[] buffer = new byte[1024];
                        int bufferCount = opStream.Read(buffer, 0, buffer.Length);
                        int bufferCount = stream.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)
@@ -126,10 +129,10 @@
                        try
                        {
                            byte[] buffer = new byte[1024];
                            int bufferCount = opStream.Read(buffer, 0, buffer.Length);
                            int bufferCount = stream.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)
@@ -343,7 +346,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,15 +397,13 @@
            }
        }
        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;
        NetworkStream opStream = null;
        IPEndPoint plcEP;
@@ -433,6 +435,10 @@
        //    }
        //}
        byte serverNode = 0;
        byte scanNode = 0;
        byte opNode = 0;
        private void InitialScanClient()
        {
            if (scanClient == null || !scanClient.Connected)
@@ -443,13 +449,31 @@
                scanClient.Client.Blocking = true;
                scanClient.SendBufferSize = 0;
                scanClient.ReceiveBufferSize = 0;
                scanClient.ReceiveTimeout = scanClient.SendTimeout = 5000;
                scanClient.Connect(plcEP);
                byte[] dataRequest = frame.GetTcpRequestFrame(1);
                scanStream = scanClient.GetStream();
                scanStream.Write(dataRequest, 0, dataRequest.Length);
                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);
                byte[] dataRead = new byte[2048];
                scanStream.Read(dataRead, 0, dataRead.Length);
                int readSize = stream.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 +487,26 @@
                opClient.Client.Blocking = true;
                opClient.Connect(plcEP);
                byte[] dataRequest = frame.GetTcpRequestFrame(2);
                opStream = opClient.GetStream();
                opStream.Write(dataRequest, 0, dataRequest.Length);
                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);
                byte[] dataRead = new byte[2048];
                opStream.Read(dataRead, 0, dataRead.Length);
                int readSize = stream.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);
            }
        }
@@ -487,15 +526,16 @@
            item.OP_TYPE = 1;
            item.ITEM_LENGTH = length;
            var data = frame.GetSendReadFrameBytes(item, CurrentSid);
            opStream.Write(data, 0, data.Length);
            var data = opFrame.GetSendReadFrameBytes(item, CurrentSid);
            var stream = opClient.GetStream();
            stream.Write(data, 0, data.Length);
            byte[] buffer = new byte[2048];
            int readSize = opStream.Read(buffer, 0, buffer.Length);
            int readSize = stream.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
@@ -519,17 +559,18 @@
            if (scanBuffer == null)
            {
                scanBuffer = frame.GetSendReadFrameBytes(item, CurrentSid);
                scanBuffer = scanFrame.GetSendReadFrameBytes(item, CurrentSid);
            }
            scanStream.Write(scanBuffer, 0, scanBuffer.Length);
            var stream = scanClient.GetStream();
            stream.Write(scanBuffer, 0, scanBuffer.Length);
            byte[] buffer = new byte[2048];
            int readSize = scanStream.Read(buffer, 0, buffer.Length);
            int readSize = stream.Read(buffer, 0, buffer.Length);
            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