From 1c4426810c71eead57084be8a18ade8d314dd8c4 Mon Sep 17 00:00:00 2001
From: patrick <patrick.xu@broconcentric.com>
Date: 星期二, 10 十二月 2019 14:24:31 +0800
Subject: [PATCH] 1. 重构项目

---
 src/Bro.Device.OmronFins/OmronFinsDriver.cs |  182 ++++++++++++++++++++++++++-------------------
 1 files changed, 106 insertions(+), 76 deletions(-)

diff --git a/src/Bro.Device.OmronFins/OmronFinsDriver.cs b/src/Bro.Device.OmronFins/OmronFinsDriver.cs
index ee5b718..13a3065 100644
--- a/src/Bro.Device.OmronFins/OmronFinsDriver.cs
+++ b/src/Bro.Device.OmronFins/OmronFinsDriver.cs
@@ -13,10 +13,11 @@
 using System.Text;
 using System.Threading;
 using System.Threading.Tasks;
+using static Bro.Common.Helper.EnumHelper;
 
 namespace Bro.Device.OmronFins
 {
-    public class OmronFinsDriver : PLCBase, IMonitor
+    public class OmronFinsDriver : PLCBase
     {
         #region PLCBase
         public override void Read(PLCOperationConfigBase config)
@@ -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
     }
 }

--
Gitblit v1.8.0