From 2cc4dfef234b47bef364edf798b5051a25f33217 Mon Sep 17 00:00:00 2001
From: hutongqing <hutongqing@hnkhzn.com>
Date: 星期五, 30 八月 2024 10:58:56 +0800
Subject: [PATCH] 1

---
 WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/StackerCrane/CommonStackerCrane.cs |   53 ++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 46 insertions(+), 7 deletions(-)

diff --git a/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/StackerCrane/CommonStackerCrane.cs b/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/StackerCrane/CommonStackerCrane.cs
index e67f1e5..045573d 100644
--- a/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/StackerCrane/CommonStackerCrane.cs
+++ b/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/StackerCrane/CommonStackerCrane.cs
@@ -37,14 +37,14 @@
     /// <summary>
     /// 涓�鑸爢鍨涙満瀹炵幇绫伙紝瀹炵幇鍫嗗灈鏈烘帴鍙e眰
     /// </summary>
-    [Description("閫氱敤鍫嗗灈鏈�")]
+    [Description("鍫嗗灈鏈�")]
     public class CommonStackerCrane : IStackerCrane
     {
         #region Private Member
         /// <summary>
         /// 鍫嗗灈鏈洪�氳瀵硅薄
         /// </summary>
-        private readonly BaseCommunicator _communicator;
+        private BaseCommunicator _communicator;
         /// <summary>
         /// 鍫嗗灈鏈哄崗璁俊鎭�
         /// </summary>
@@ -66,7 +66,11 @@
         /// </summary>
         private int _lastTaskNum;
 
-        private bool _isChecked;
+        private bool _isChecked = false;
+
+        private bool _heartStatr = true;
+
+        private bool _isConnected = true;
         #endregion Private Member
 
         #region Public Member
@@ -148,7 +152,7 @@
         /// <summary>
         /// 閫氳鏄惁宸茶繛鎺�
         /// </summary>
-        public bool IsConnected => Communicator.IsConnected;
+        public bool IsConnected => Communicator.IsConnected && _isConnected;
 
         /// <summary>
         /// 鍫嗗灈鏈轰换鍔″畬鎴愪簨浠�
@@ -184,6 +188,7 @@
             _deviceProtocolDetailDTOs = deviceProtocolDetailDTOs;
             _deviceCode = deviceCode;
             _deviceName = deviceName;
+            CheckConnect();
         }
         #endregion
 
@@ -314,6 +319,30 @@
         {
             return value.Equals(paramValue);
         }
+
+        private void CheckConnect()
+        {
+            Task.Run(() =>
+            {
+                while (_heartStatr)
+                {
+                    try
+                    {
+                        DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault();
+                        if (devicePro == null)
+                            _isConnected = false;
+                        else
+                            Communicator.ReadAsObj(devicePro.DeviceProAddress, devicePro.DeviceDataType);
+                        _isConnected = true;
+                    }
+                    catch (Exception ex)
+                    {
+                        _isConnected = false;
+                    }
+                    Thread.Sleep(500);
+                }
+            });
+        }
         #endregion
 
         #region Public Method
@@ -322,8 +351,9 @@
         /// </summary>
         /// <param name="command">浠诲姟鍛戒护</param>
         /// <returns></returns>
-        public bool SendCommand<T>(T command)where T : IDataTransfer, new()
+        public bool SendCommand<T>(T command) where T : IDataTransfer, new()
         {
+            if (!IsConnected) throw new Exception($"閫氳杩炴帴閿欒锛岃妫�鏌ョ綉缁�");
             DeviceProDTO? devicePro = _deviceProDTOs.Where(x => x.DeviceProParamType == nameof(DeviceCommand)).OrderBy(x => x.DeviceProOffset).FirstOrDefault();
             if (devicePro == null)
             {
@@ -413,6 +443,7 @@
         /// <exception cref="Exception"></exception>
         public TRsult GetValue<TEnum, TRsult>(TEnum value) where TEnum : Enum
         {
+            if (!IsConnected) throw new Exception($"閫氳杩炴帴閿欒锛岃妫�鏌ョ綉缁�");
             DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == value.ToString());
             return devicePro == null ? throw new Exception() : (TRsult)Communicator.ReadAsObj(devicePro.DeviceProAddress, devicePro.DeviceDataType);
         }
@@ -423,9 +454,9 @@
         public void Heartbeat()
         {
 
-            //todo 蹇冭烦鍐欏叆
-            throw new NotImplementedException();
         }
+
+        
 
         /// <summary>
         /// 鏍规嵁鍙傛暟鍚嶇О鍐欏叆鍫嗗灈鏈哄搴旂殑鏁版嵁銆�
@@ -440,9 +471,17 @@
             where TEnum : Enum
             where TValue : notnull
         {
+            if (!IsConnected) throw new Exception($"閫氳杩炴帴閿欒锛岃妫�鏌ョ綉缁�");
             DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == @enum.ToString());
             return devicePro == null ? throw new Exception() : Communicator.WriteObj(devicePro.DeviceProAddress, devicePro.DeviceDataType, value);
         }
+
+        public void Dispose()
+        {
+            _heartStatr = false;
+            _communicator.Dispose();
+            GC.SuppressFinalize(this);
+        }
         #endregion
     }
 }

--
Gitblit v1.9.3