From 87cc1c0d71fe6c6000ac6523bbb367d5ac29b5d2 Mon Sep 17 00:00:00 2001
From: 肖洋 <cathay_xy@163.com>
Date: 星期六, 11 一月 2025 16:40:51 +0800
Subject: [PATCH] 更新设备通讯超时设置及优化代码结构

---
 Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/StackerCrane/Common/CommonStackerCrane.cs |  118 +++++++++++++++++++++++++++++++++--------------------------
 1 files changed, 66 insertions(+), 52 deletions(-)

diff --git a/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/StackerCrane/Common/CommonStackerCrane.cs b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/StackerCrane/Common/CommonStackerCrane.cs
index 1d1a3ce..bb6c121 100644
--- a/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/StackerCrane/Common/CommonStackerCrane.cs
+++ b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/StackerCrane/Common/CommonStackerCrane.cs
@@ -41,6 +41,11 @@
     public class CommonStackerCrane : IStackerCrane
     {
         #region Private Member
+
+        // 甯搁噺
+        private const int WaitTimeout = 20 * 6000;
+        private const int ReadTimeout = 1500;
+
         /// <summary>
         /// 鍫嗗灈鏈洪�氳瀵硅薄
         /// </summary>
@@ -229,8 +234,11 @@
 
         private int GetCurrentTaskNum()
         {
-            DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(CurrentTaskNum));
-            return devicePro == null ? throw new Exception() : (int)Communicator.ReadAsObj(devicePro.DeviceProAddress, devicePro.DeviceDataType);
+            //DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(CurrentTaskNum));
+            //return devicePro == null ? throw new Exception() : (int)Communicator.ReadAsObj(devicePro.DeviceProAddress, devicePro.DeviceDataType);
+
+            DeviceProDTO devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(CurrentTaskNum))?? throw new Exception("鏈幏鍙栧埌褰撳墠浠诲姟鍙风殑淇℃伅");
+            return (int)Communicator.ReadAsObj(devicePro.DeviceProAddress, devicePro.DeviceDataType);
         }
 
         /// <summary>
@@ -326,7 +334,7 @@
 
         private void CheckConnect()
         {
-            Task.Run(() =>
+            Task.Run(async () =>
             {
                 while (_heartStatr)
                 {
@@ -343,7 +351,8 @@
                     {
                         _isConnected = false;
                     }
-                    Thread.Sleep(500);
+                    //Thread.Sleep(500);
+                    await Task.Delay(500);
                 }
             });
         }
@@ -372,69 +381,74 @@
             return false;
         }
 
+        private readonly object _lockObject = new();
         /// <summary>
         /// 鐩戞祴鍫嗗灈鏈轰换鍔℃槸鍚﹀畬鎴�(闃叉浠诲姟瀹屾垚浜嬩欢鐩戞祴瓒呮椂锛屽畾涔夋墜鍔ㄨЕ鍙戝姛鑳�)
         /// </summary>
         public void CheckStackerCraneTaskCompleted()
         {
-            if (_isChecked)
-                return;
-
-            Task.Run(() =>
+            // 浣跨敤閿佺‘淇濆悓涓�鏃堕棿鍙湁涓�涓嚎绋嬪彲浠ヨ繘鍏ヨ鏂规硶
+            lock (_lockObject)
             {
+                if (_isChecked)
+                    return;
+
                 _isChecked = true;
-                try
+                Task.Run(() =>
                 {
-                    DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(StackerCraneWorkStatus));
-                    if (devicePro != null)
+                    try
                     {
-                        DeviceProtocolDetailDTO? deviceProtocolDetail = _deviceProtocolDetailDTOs.FirstOrDefault(x => x.DeviceProParamName == devicePro.DeviceProParamName && x.ProtocolDetailType == StackerCraneWorkStatus.WorkCompleted.ToString());
-                        if (deviceProtocolDetail != null)
+                        DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(StackerCraneWorkStatus));
+                        if (devicePro != null)
                         {
-                            OperateResult<TimeSpan> operateResult = new OperateResult<TimeSpan>();
-                            TypeCode typeCode = SiemensDBDataType.GetTypeCode(devicePro.DeviceDataType);
-                            switch (typeCode)
+                            DeviceProtocolDetailDTO? deviceProtocolDetail = _deviceProtocolDetailDTOs.FirstOrDefault(x => x.DeviceProParamName == devicePro.DeviceProParamName && x.ProtocolDetailType == StackerCraneWorkStatus.WorkCompleted.ToString());
+                            if (deviceProtocolDetail != null)
                             {
-                                case TypeCode.Boolean:
-                                    operateResult = Communicator.Wait(devicePro.DeviceProAddress, 1500, 20 * 6000, Convert.ToBoolean(deviceProtocolDetail.ProtocalDetailValue));
-                                    break;
-                                case TypeCode.Byte:
-                                    operateResult = Communicator.Wait(devicePro.DeviceProAddress, 1500, 20 * 6000, Convert.ToByte(deviceProtocolDetail.ProtocalDetailValue));
-                                    break;
-                                case TypeCode.Int16:
-                                    operateResult = Communicator.Wait(devicePro.DeviceProAddress, 1500, 20 * 6000, Convert.ToInt16(deviceProtocolDetail.ProtocalDetailValue));
-                                    break;
-                                case TypeCode.Int32:
-                                    operateResult = Communicator.Wait(devicePro.DeviceProAddress, 1500, 20 * 6000, Convert.ToInt32(deviceProtocolDetail.ProtocalDetailValue));
-                                    break;
-                                case TypeCode.UInt16:
-                                    operateResult = Communicator.Wait(devicePro.DeviceProAddress, 1500, 20 * 6000, Convert.ToUInt16(deviceProtocolDetail.ProtocalDetailValue));
-                                    break;
-                                case TypeCode.UInt32:
-                                    operateResult = Communicator.Wait(devicePro.DeviceProAddress, 1500, 20 * 6000, Convert.ToUInt32(deviceProtocolDetail.ProtocalDetailValue));
-                                    break;
-                                default:
-                                    break;
-                            }
-                            int taskNum = CurrentTaskNum;
-                            if (operateResult.IsSuccess /*&& LastTaskNum != taskNum*/)
-                            {
-                                StackerCraneTaskCompletedEventArgs args = new(taskNum);
-                                StackerCraneTaskCompletedEventHandler?.Invoke(this, args);
-                                _lastTaskNum = taskNum;
+                                OperateResult<TimeSpan> operateResult = new OperateResult<TimeSpan>();
+                                TypeCode typeCode = SiemensDBDataType.GetTypeCode(devicePro.DeviceDataType);
+                                switch (typeCode)
+                                {
+                                    case TypeCode.Boolean:
+                                        operateResult = Communicator.Wait(devicePro.DeviceProAddress, ReadTimeout, WaitTimeout, Convert.ToBoolean(deviceProtocolDetail.ProtocalDetailValue));
+                                        break;
+                                    case TypeCode.Byte:
+                                        operateResult = Communicator.Wait(devicePro.DeviceProAddress, ReadTimeout, WaitTimeout, Convert.ToByte(deviceProtocolDetail.ProtocalDetailValue));
+                                        break;
+                                    case TypeCode.Int16:
+                                        operateResult = Communicator.Wait(devicePro.DeviceProAddress, ReadTimeout, WaitTimeout, Convert.ToInt16(deviceProtocolDetail.ProtocalDetailValue));
+                                        break;  
+                                    case TypeCode.Int32:
+                                        operateResult = Communicator.Wait(devicePro.DeviceProAddress, ReadTimeout, WaitTimeout, Convert.ToInt32(deviceProtocolDetail.ProtocalDetailValue));
+                                        break;
+                                    case TypeCode.UInt16:
+                                        operateResult = Communicator.Wait(devicePro.DeviceProAddress, ReadTimeout, WaitTimeout, Convert.ToUInt16(deviceProtocolDetail.ProtocalDetailValue));
+                                        break;
+                                    case TypeCode.UInt32:
+                                        operateResult = Communicator.Wait(devicePro.DeviceProAddress, ReadTimeout, WaitTimeout, Convert.ToUInt32(deviceProtocolDetail.ProtocalDetailValue));
+                                        break;
+                                    default:
+                                        break;
+                                }
+                                int taskNum = CurrentTaskNum;
+                                if (operateResult.IsSuccess /*&& LastTaskNum != taskNum*/)
+                                {
+                                    StackerCraneTaskCompletedEventArgs args = new(taskNum);
+                                    StackerCraneTaskCompletedEventHandler?.Invoke(this, args);
+                                    _lastTaskNum = taskNum;
+                                }
                             }
                         }
                     }
-                }
-                catch (Exception ex)
-                {
+                    catch (Exception ex)
+                    {
 
-                }
-                finally
-                {
-                    _isChecked = false;
-                }
-            });
+                    }
+                    finally
+                    {
+                        _isChecked = false;
+                    }
+                });
+            }
         }
 
         /// <summary>

--
Gitblit v1.9.3