From 1b3d57f133b494114c1cdd30627c7057eecdf1b1 Mon Sep 17 00:00:00 2001
From: 啊鑫 <t2856754968@163.com>
Date: 星期一, 28 七月 2025 10:02:51 +0800
Subject: [PATCH] 修复时间戳解析和数据验证逻辑

---
 UniversalModbusManager.cs |  149 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 147 insertions(+), 2 deletions(-)

diff --git a/UniversalModbusManager.cs b/UniversalModbusManager.cs
index 716ab0e..a57816f 100644
--- a/UniversalModbusManager.cs
+++ b/UniversalModbusManager.cs
@@ -501,7 +501,23 @@
         /// <param name="groupName">缁勫悕绉帮紙鐢ㄤ簬鏃ュ織锛�</param>
         private async Task ReadFieldGroup(DynamicModbusData dynamicData, Dictionary<string, DataField> fieldGroup, string groupName)
         {
-            if (_modbusClient == null) return;
+            if (_modbusClient == null)
+            {
+                LogWarning($"Modbus瀹㈡埛绔负null锛屾棤娉曡鍙� {groupName}");
+                return;
+            }
+
+            if (!_isConnected)
+            {
+                LogWarning($"Modbus鏈繛鎺ワ紝鏃犳硶璇诲彇 {groupName}");
+                return;
+            }
+
+            if (fieldGroup == null || fieldGroup.Count == 0)
+            {
+                LogDebug($"{groupName} 娌℃湁閰嶇疆瀛楁锛岃烦杩囪鍙�");
+                return;
+            }
 
             foreach (var kvp in fieldGroup)
             {
@@ -510,14 +526,43 @@
 
                 try
                 {
+                    // 妫�鏌odbus瀹㈡埛绔姸鎬�
+                    if (_modbusClient == null || !_modbusClient.Connected)
+                    {
+                        LogWarning($"Modbus瀹㈡埛绔湭杩炴帴锛岃烦杩囧瓧娈� '{fieldName}'");
+                        continue;
+                    }
+
                     // 璇诲彇鍘熷瀵勫瓨鍣ㄦ暟鎹�
                     var registers = await Task.Run(() => 
                         _modbusClient.ReadHoldingRegisters(fieldConfig.Address, fieldConfig.Length));
+                    
+                    // 楠岃瘉瀵勫瓨鍣ㄨ鍙栫粨鏋滅殑鏈夋晥鎬�
+                    ValidateRegisterData(fieldName, fieldConfig, registers);
+
+                    // 妫�鏌ヨ鍙栫粨鏋滄槸鍚︿负null
+                    if (registers == null)
+                    {
+                        LogWarning($"瀛楁 '{fieldName}' 璇诲彇缁撴灉涓簄ull锛屽湴鍧�: {fieldConfig.Address}, 闀垮害: {fieldConfig.Length}");
+                        continue;
+                    }
+
+                    // 璁板綍鍘熷瀵勫瓨鍣ㄦ暟鎹敤浜庤皟璇�
+                    LogDebug($"[RAW-DATA] 瀛楁 '{fieldName}' 鍘熷瀵勫瓨鍣�: [{string.Join(", ", registers)}] (鍗佸叚杩涘埗: [{string.Join(", ", registers.Select(r => $"0x{r:X4}"))}])");
+                    
+                    // 璇︾粏璁板綍姣忎釜瀵勫瓨鍣ㄧ殑瀛楄妭鍒嗚В
+                    for (int i = 0; i < registers.Length; i++)
+                    {
+                        var reg = registers[i];
+                        var highByte = (byte)((reg >> 8) & 0xFF);
+                        var lowByte = (byte)(reg & 0xFF);
+                        LogDebug($"[RAW-DATA] 瀵勫瓨鍣▄i}: {reg} (0x{reg:X4}) 鈫� 楂樺瓧鑺�:{highByte}('{(char)highByte}') 浣庡瓧鑺�:{lowByte}('{(char)lowByte}')");
+                    }
 
                     // 楠岃瘉鏁版嵁闀垮害
                     if (!ModbusDataParser.ValidateRegisterLength(registers, fieldConfig))
                     {
-                        LogWarning($"瀛楁 '{fieldName}' 鐨勬暟鎹暱搴︿笉瓒筹細鏈熸湜{fieldConfig.Length}锛屽疄闄厈registers.Length}");
+                        LogWarning($"瀛楁 '{fieldName}' 鐨勬暟鎹暱搴︿笉瓒筹細鏈熸湜{fieldConfig.Length}锛屽疄闄厈registers?.Length ?? 0}");
                         continue;
                     }
 
@@ -532,6 +577,14 @@
                 catch (Exception ex)
                 {
                     LogError($"璇诲彇瀛楁 '{fieldName}' 澶辫触: {ex.Message}");
+                    
+                    // 璁板綍璇︾粏閿欒淇℃伅
+                    await _databaseManager?.LogErrorAsync(
+                        "FieldReadError", 
+                        $"璇诲彇瀛楁 '{fieldName}' 澶辫触: {ex.Message}", 
+                        ex, 
+                        ErrorSeverity.Medium)!;
+                    
                     // 缁х画璇诲彇鍏朵粬瀛楁
                 }
             }
@@ -563,6 +616,98 @@
 
         #endregion
 
+        #region 鏁版嵁楠岃瘉鏂规硶
+
+        /// <summary>
+        /// 楠岃瘉瀵勫瓨鍣ㄦ暟鎹殑鏈夋晥鎬�
+        /// </summary>
+        /// <param name="fieldName">瀛楁鍚�</param>
+        /// <param name="fieldConfig">瀛楁閰嶇疆</param>
+        /// <param name="registers">璇诲彇鐨勫瘎瀛樺櫒鏁版嵁</param>
+        private void ValidateRegisterData(string fieldName, DataField fieldConfig, int[]? registers)
+        {
+            if (registers == null)
+            {
+                LogWarning($"[VALIDATE] 瀛楁 '{fieldName}' 瀵勫瓨鍣ㄦ暟鎹负null");
+                return;
+            }
+
+            LogDebug($"[VALIDATE] 瀛楁 '{fieldName}' 鍘熷鏁版嵁楠岃瘉:");
+            LogDebug($"[VALIDATE] - 鍦板潃: {fieldConfig.Address}, 鏈熸湜闀垮害: {fieldConfig.Length}, 瀹為檯闀垮害: {registers.Length}");
+            LogDebug($"[VALIDATE] - 鏁版嵁绫诲瀷: {fieldConfig.DataType}");
+            
+            // 妫�鏌ユ暟鎹暱搴�
+            if (registers.Length != fieldConfig.Length)
+            {
+                LogWarning($"[VALIDATE] 瀛楁 '{fieldName}' 鏁版嵁闀垮害涓嶅尮閰�: 鏈熸湜{fieldConfig.Length}, 瀹為檯{registers.Length}");
+            }
+
+            // 妫�鏌ユ槸鍚﹀寘鍚湁鏁堟暟鎹�
+            var hasNonZeroData = registers.Any(r => r != 0);
+            if (!hasNonZeroData)
+            {
+                LogWarning($"[VALIDATE] 瀛楁 '{fieldName}' 鎵�鏈夊瘎瀛樺櫒閮戒负0锛屽彲鑳芥槸鏃犳晥鏁版嵁");
+            }
+
+            // 妫�鏌ユ暟鎹寖鍥达紙16浣嶆湁绗﹀彿鏁存暟鑼冨洿锛�
+            var outOfRangeCount = registers.Count(r => r < -32768 || r > 32767);
+            if (outOfRangeCount > 0)
+            {
+                LogWarning($"[VALIDATE] 瀛楁 '{fieldName}' 鏈墈outOfRangeCount}涓瘎瀛樺櫒鍊艰秴鍑�16浣嶆湁绗﹀彿鏁存暟鑼冨洿");
+            }
+
+            // 鐗规畩鏁版嵁妯″紡妫�娴�
+            DetectSpecialDataPatterns(fieldName, registers);
+        }
+
+        /// <summary>
+        /// 妫�娴嬬壒娈婄殑鏁版嵁妯″紡
+        /// </summary>
+        /// <param name="fieldName">瀛楁鍚�</param>
+        /// <param name="registers">瀵勫瓨鍣ㄦ暟鎹�</param>
+        private void DetectSpecialDataPatterns(string fieldName, int[] registers)
+        {
+            // 妫�娴嬪叏FF妯″紡锛堥�氫俊閿欒锛�
+            if (registers.All(r => r == -1 || r == 0xFFFF))
+            {
+                LogWarning($"[PATTERN] 瀛楁 '{fieldName}' 妫�娴嬪埌鍏‵F妯″紡锛屽彲鑳芥槸閫氫俊閿欒");
+            }
+
+            // 妫�娴嬪父瑙佺殑閿欒鐮佹ā寮�
+            if (registers.Length >= 2)
+            {
+                var combined = ((long)(registers[0] & 0xFFFF) << 16) | (registers[1] & 0xFFFF);
+                if (combined == 0xE2400001)
+                {
+                    LogInfo($"[PATTERN] 瀛楁 '{fieldName}' 妫�娴嬪埌宸茬煡鐨勬棤鏁堟暟鎹爣璇� 0xE2400001");
+                }
+            }
+
+            // 妫�娴婣SCII瀛楃妯″紡锛堢敤浜庡瓧绗︿覆鍜屾椂闂存埑瀛楁锛�
+            if (registers.Any(r => IsLikelyAsciiData(r)))
+            {
+                LogDebug($"[PATTERN] 瀛楁 '{fieldName}' 鍖呭惈鍙兘鐨凙SCII瀛楃鏁版嵁");
+            }
+        }
+
+        /// <summary>
+        /// 妫�鏌ュ瘎瀛樺櫒鍊兼槸鍚﹀彲鑳藉寘鍚獳SCII瀛楃
+        /// </summary>
+        /// <param name="register">瀵勫瓨鍣ㄥ��</param>
+        /// <returns>鏄惁鍙兘鏄疉SCII鏁版嵁</returns>
+        private bool IsLikelyAsciiData(int register)
+        {
+            if (register == 0) return false;
+            
+            var highByte = (byte)((register >> 8) & 0xFF);
+            var lowByte = (byte)(register & 0xFF);
+            
+            // 妫�鏌ユ槸鍚︿负鍙墦鍗癆SCII瀛楃鑼冨洿锛�32-126锛�
+            return (highByte >= 32 && highByte <= 126) || (lowByte >= 32 && lowByte <= 126);
+        }
+
+        #endregion
+
         #region 鏁版嵁鍙戦�佹柟娉�
 
         /// <summary>

--
Gitblit v1.9.3