From 809abe2aac4617cc838d36fec913f5268a066eb4 Mon Sep 17 00:00:00 2001
From: patrick <patrick.xu@broconcentric.com>
Date: 星期六, 19 十月 2019 13:50:28 +0800
Subject: [PATCH] 1. 简化部分配置 2. 修改OmronFins驱动

---
 src/Bro.Device.OmronFins/OmronFinsDriver.cs |  103 ++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 72 insertions(+), 31 deletions(-)

diff --git a/src/Bro.Device.OmronFins/OmronFinsDriver.cs b/src/Bro.Device.OmronFins/OmronFinsDriver.cs
index ee5b718..534c13e 100644
--- a/src/Bro.Device.OmronFins/OmronFinsDriver.cs
+++ b/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

--
Gitblit v1.8.0